Java基础面试题3【合集】

2023/8/20 Java

# 多线程、并发及线程的基础问题

# 1、Java 中能创建 volatile 数组吗?

# 2、volatile 能使得一个非原子操作变成原子操作吗?

# 3、volatile 修饰符的有过什么实践?

答案
  • 线程通信:在多线程编程中,volatile 关键字可用于实现简单的线程通信,比如一个线程修改了共享变量的值,另一个线程需要立即看到修改后的值。
  • 状态标记:可以使用 volatile 来标记一个线程的状态,比如一个标志位来控制线程的启动、暂停、停止等状态。
  • 双重检查锁定:在单例模式的双重检查锁机制中,可以使用 volatile 来确保线程安全,避免出现多线程环境下的问题。
  • 计数器、标记等场景:volatile 可以用于简单的计数器、标记变量等,保证在多线程环境下的可见性和一致性。

# 4、volatile 类型变量提供什么保证?

# 5、10 个线程和 2 个线程的同步代码,哪个更容易写?

答案
  • 在理论上,编写只涉及两个线程的同步代码要比涉及多个线程的同步代码更容易。这是因为在涉及多个线程的同步代码中,需要考虑更多的线程交互和竞争条件,可能会引发更多的并发问题。
  • 当只涉及两个线程时,可以使用简单的同步原语(如 synchronized、wait()、notify()等)来实现线程之间的同步和通信。控制仅涉及两个线程的同步代码流程也相对简单,更易于管理和调试。
  • 相比之下,当有多个(如10个)线程参与时,需要考虑更多的线程调度、资源共享、死锁等并发问题。在这种情况下,需要更复杂的同步机制和更细致的设计来保证程序的正确性和可靠性。
  • 所以,在实际编码中,通常建议先尽量将复杂的并发问题分解为更小的部分,在掌握了对两个线程同步的实现后,再逐步扩展到更多线程参与的场景。这样有利于更好地理解并发编程的基本原理和技术,并提高代码的可维护性和稳定性。

# 6、你是如何调用 wait()方法的?使用 if 块还是循环?为什么?

# 8、什么是 Busy spin?我们为什么要使用它?

# 9、Java 中怎么获取一份线程 dump 文件?

# 10、Swing 是线程安全的?

# 11、什么是线程局部变量?

# 12、用 wait-notify 写一段代码来解决生产者-消费者问题?

# 13、用 Java 写一个线程安全的单例模式(Singleton)?

# 14、Java 中 sleep 方法和 wait 方法的区别?

# 15、什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?

# 16、我们能创建一个包含可变对象的不可变对象吗?

# 数据类型和 Java 基础面试问题

# 17、Java 中应该使用什么数据类型来代表价格?

# 18、怎么将 byte 转换为 String?

# 19、Java 中怎样将 bytes 转换为 long 类型?

# 20、我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会

# 21、存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么?如 C = (C) B;

# 22、哪个类包含 clone 方法?是 Cloneable 还是 Object?

# 23、Java 中 ++ 操作符是线程安全的吗?

# 23、不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多

# 24、a = a + b 与 a += b 的区别

# 25、我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?

# 26、3*0.1 == 0.3 将会返回什么?true 还是 false?

# 27、int 和 Integer 哪个会占用更多的内存?

# 28、为什么 Java 中的 String 是不可变的(Immutable)?

# JVM 底层 与 GC(Garbage Collection) 的面试问题

# 31、64 位 JVM 中,int 的长度是多数?

# 32、Serial 与 Parallel GC之间的不同之处?

# 33、32 位和 64 位的 JVM,int 类型变量的长度是多数?

# 34、Java 中 WeakReference 与 SoftReference的区别?

# 35、WeakHashMap 是怎么工作的?

# 36、JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用?

# 37、怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位?

# 38、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?

# 39、JRE、JDK、JVM 及 JIT 之间有什么不同?

# 40、解释 Java 堆空间及 GC?

# JVM 底层面试题

# 41、你能保证 GC 执行吗?

# 42、怎么获取 Java 程序使用的内存?堆使用的百分比?

# 43、Java 中堆和栈有什么区别?

# Java 基本概念面试题

# 44、“a==b”和”a.equals(b)”有什么区别?

# 45、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?

# 46、final、finalize 和 finally 的不同之处?

# 47、Java 中的编译期常量是什么?使用它又什么风险?

# Java 集合框架的面试题

# 48、List、Set、Map 和 Queue 之间的区别(答案)

# 49、poll() 方法和 remove() 方法的区别?

# 50、Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?

# 51、ArrayList 与 LinkedList 的不区别?

# 52、用哪两种方式来实现集合的排序?

# 53、Java 中怎么打印数组?

# 54、Java 中的 LinkedList 是单向链表还是双向链表?

# 55、Java 中的 TreeMap 是采用什么树实现的?(答案)

# 56、Hashtable 与 HashMap 有什么不同之处?

# 57、Java 中的 HashSet,内部是如何工作的?

# 58、写一段代码在遍历 ArrayList 时移除一个元素?

# 59、我们能自己写一个容器类,然后使用 for-each 循环码?

# 60、ArrayList 和 HashMap 的默认大小是多数?

# 61、有没有可能两个不相等的对象有有相同的 hashcode?

# 62、两个相同的对象会有不同的的 hash code 吗?

# 63、我们可以在 hashcode() 中使用随机数字吗?

# 64、Java 中,Comparator 与 Comparable 有什么不同?

# Java IO 和 NIO 的面试题

# 66、在我 Java 程序中,我有三个 socket,我需要多少个线程来处理?

# 67、Java 中怎么创建 ByteBuffer?

# 68、Java 中,怎么读写 ByteBuffer ?

# 69、Java 采用的是大端还是小端?

# 70、ByteBuffer 中的字节序是什么?

# 71、Java 中,直接缓冲区与非直接缓冲器有什么区别?

# 72、Java 中的内存映射缓存区是什么?

# 73、socket 选项 TCP NO DELAY 是指什么?

# 74、TCP 协议与 UDP 协议有什么区别?

# 75、Java 中,ByteBuffer 与 StringBuffer有什么区别?(答案)

# Java 最佳实践的面试问题

# 76、Java 中,编写多线程程序的时候你会遵循哪些最佳实践?

# 77、说出几点 Java 中使用 Collections 的最佳实践

# 78、说出至少 5 点在 Java 中使用线程的最佳实践。

# 79、说出 5 条 IO 的最佳实践(答案)

# 80、列出 5 个应该遵循的 JDBC 最佳实践

# 81、说出几条 Java 中方法重载的最佳实践?

# Date、Time 及 Calendar 的面试题

# 82、在多线程环境下,SimpleDateFormat 是线程安全的吗?

# 83、Java 中如何格式化一个日期?如格式化为 ddMMyyyy 的形式?

# 84、Java 中,怎么在格式化的日期中显示时区?

# 85、Java 中 java.util.Date 与 java.sql.Date 有什么区别?

# 86、Java 中,如何计算两个日期之间的差距?

# 87、Java 中,如何将字符串 YYYYMMDD 转换为日期?

# 单元测试 JUnit 面试题

# 89、如何测试静态方法?(答案)

# 90、怎么利用 JUnit 来测试一个方法的异常?

# 91、你使用过哪个单元测试库来测试你的 Java 程序?

# 92、@Before 和 @BeforeClass 有什么区别?

# 编程和代码相关的面试题

# 93、怎么检查一个字符串只包含数字?解决方案

# 94、Java 中如何利用泛型写一个 LRU 缓存?

# 95、写一段 Java 程序将 byte 转换为 long?

# 95、在不使用 StringBuffer 的前提下,怎么反转一个字符串?

# 97、Java 中,怎么获取一个文件中单词出现的最高频率?

# 98、如何检查出两个给定的字符串是反序的?

# 99、Java 中,怎么打印出一个字符串的所有排列?

# 100、Java 中,怎样才能打印出数组中的重复元素?

# 101、Java 中如何将字符串转换为整数?

# 102、在没有使用临时变量的情况如何交换两个整数变量的值?

# 关于 OOP 和设计模式的面试题

# 103、接口是什么?为什么要使用接口而不是直接使用具体类?

# 104、Java 中,抽象类与接口之间有什么不同?

# 105、除了单例模式,你在生产环境中还用过什么设计模式?

# 106、你能解释一下里氏替换原则吗?

# 107、 什么情况下会违反迪米特法则?为什么会有这个问题?

# 108、适配器模式是什么?什么时候使用?

# 109、什么是“依赖注入”和“控制反转”?为什么有人使用?

# 110、抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类?

# 111、构造器注入和 setter 依赖注入,那种方式更好?

# 112、依赖注入和工程模式之间有什么不同?

# 113、适配器模式和装饰器模式有什么区别?

# 114、适配器模式和代理模式之前有什么不同?

# 115、什么是模板方法模式?

# 116、什么时候使用访问者模式?

# 117、什么时候使用组合模式?

# 118、继承和组合之间有什么不同?

# 119、描述 Java 中的重载和重写?

# 120、Java 中,嵌套公共静态类与顶级类有什么不同?

# 121、 OOP 中的 组合、聚合和关联有什么区别?

# 122、给我一个符合开闭原则的设计模式的例子?

# 123、抽象工厂模式和原型模式之间的区别?

# Java 面试中其他各式各样的问题

# 125、嵌套静态类与顶级类有什么区别?

# 126、你能写出一个正则表达式来判断一个字符串是否是一个数字吗?

# 127、Java 中,受检查异常 和 不受检查异常的区别?

# 128、Java 中,throw 和 throws 有什么区别

# 129、Java 中,Serializable 与 Externalizable 的区别?

# 130、Java 中,DOM 和 SAX 解析器有什么不同?

# 131、说出 JDK 1.7 中的三个新特性?

# 132、说出 5 个 JDK 1.8 引入的新特性?

# 133、Java 中,Maven 和 ANT 有什么区别?