2022 最新 Java 基础 面试题(二)
- 2、volatile 能使得一个非原子操作变成原子操作吗?
- 3、volatile 修饰符的有过什么实践?
- 4、volatile 类型变量提供什么保证?
- 5、10 个线程和 2 个线程的同步代码,哪个更容易写?
- 6、你是如何调用 wait()方法的?使用 if 块还是循环?为什 么?
- 有经验程序员的 Java 面试题
- 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 基础面试问题
- 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、不是线程安全的操作。它涉及到多个指令,如读取变量值, 增加,然后存储回内存,这个过程可能会出现多个线程交差。
- 25、我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?
- 26、3 0.1 == 0.3 将会返回什么?true 还是 false?
- 27、int 和 Integer 哪个会占用更多的内存?
- 28、为什么 Java 中的 String 是不可变的(Immutable)?
- JVM 底层 与 GC(Garbage Collection) 的面试问题
- 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 之间有什么不同?
- 3 年工作经验的 Java 面试题
- JVM 底层面试题及答案 41、你能保证 GC 执行吗?
- 42、怎么获取 Java 程序使用的内存?堆使用的百分比?
- 43、Java 中堆和栈有什么区别?
- 关于内存的的面试问题和答案 Java 基本概念面试题
- 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 的默认大小是多数?
- 62、两个相同的对象会有不同的的 hash code 吗?
- 63、我们可以在 hashcode() 中使用随机数字吗?
- 64、Java 中,Comparator 与 Comparable 有什么不同?
- Java IO 和 NIO 的面试题
- 66、在我 Java 程序中,我有三个 socket,我需要多少个线 程来处理?
- 68、Java 中,怎么读写 ByteBuffer ? 69、Java 采用的是大端还是小端? 70、ByteBuffer 中的字节序是什么?
- 72、Java 中的内存映射缓存区是什么?
- 73、socket 选项 TCP NO DELAY 是指什么?
- 75、Java 中,ByteBuffer 与 StringBuffer 有什么区别?(答
- 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 ](https://www.yuque.com/yevxum/bd3ufw/ytt7gf/pdf?toc=false&key=exports%3Adocx%3Adoc%3A2456644%3A1566790188000&x-yuque-fc-token=xa-KwZfJsLj7JPG0Z6MoLA%3D%3D|5dmVbAUI-5hvwkn6L5Vz1aqe2KWsJfck6E1Tg2cTaZM%3D) 和 [ @BeforeClass ](https://www.yuque.com/yevxum/bd3ufw/ytt7gf/pdf?toc=false&key=exports%3Adocx%3Adoc%3A2456644%3A1566790188000&x-yuque-fc-token=xa-KwZfJsLj7JPG0Z6MoLA%3D%3D|5dmVbAUI-5hvwkn6L5Vz1aqe2KWsJfck6E1Tg2cTaZM%3D) 有什么区别?
- 编程和代码相关的面试题
- 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 有什么区别?
下面列出这份 Java 面试问题列表包含的主题
· 多线程,并发及线程基础
· 数据类型转换的基本原则
· 垃圾回收(GC)
· Java 集合框架
· 数组
· 字符串
· GOF 设计模式
· SOLID
· 抽象类与接口
· Java 基础,如 equals 和 hashcode
· 泛型与枚举
· Java IO 与 NIO
· 常用网络协议
· Java 中的数据结构和算法
· 正则表达式
· JVM 底层
· Java 最佳实践
· JDBC
· Date, Time 与 Calendar
· Java 处理 XML
· JUnit
· 编程
现在是时候给你展示我近 5 年从各种面试中收集来的 133 个问题了 。我确定你 在自己的面试中见过很多这些问题, 很多问题你也能正确回答。
多线程、并发及线程的基础问题
1、Java 中能创建 volatile 数组吗?
能, Java 中可以创建 volatile 类型数组, 不过只是一个指向数组的引用, 而不 是整个数组 。我 的意思是 ,如 果改变引用指向的数组 ,将 会受到 volatile 的保护 , 但是如果多个线程同时改变数组的元素, volatile 标示符就不能起到之前的保护
作用了。
2、volatile 能使得一个非原子操作变成原子操作吗?
一个典型的例子是在类中有一个 long 类型的成员变量。 如果你知道该成员变量 会被多个线程访问 ,如计数器 、价格等 ,你最好是将其设置为 volatile。为什么? 因为 Java 中读取 long 类型变量不是原子的, 需要分成两步, 如果一个线程正 在修改该 long 变量的值, 另一个线程可能只能看到该值的一半( 前 32 位) 。 但是对一个 volatile 型的 long 或 double 变量的读写是原子。
3、volatile 修饰符的有过什么实践?
一种实践是用 volatile 修饰 long 和 double 变量 ,使 其能按原子类型来读写 。 double 和 long 都是 64 位宽 ,因此对这两种类型的读是分为两部分的 ,第一次 读取第一个 32 位 ,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的 。volatile 修复符的另一个 作用是提供内存屏障( memory barrier), 例如在分布式框架中的应用。 简单的 说 ,就 是当你写一个 volatile 变量之前 ,Java 内存模型会插入一个写屏 障( write barrier), 读一个 volatile 变量之前, 会插入一个读屏障( read barrier)。 意 思就是说 ,在 你写一个 volatile 域时 ,能 保证任何线程都能看到你写的值 ,同 时 ,
在写之前, 也能保证任何数值的更新对所有线程是可见的, 因为内存屏障会将其
他所有写的值更新到缓存。
4、volatile 类型变量提供什么保证?
volatile 变量提供顺序和可见性保证 ,例如 ,JVM 或者 JIT 为了获得更好的性能 会对语句重排序,但是 volatile 类型变量即使在没有同步块的情况下赋值也不会 与其他语句重排序。 volatile 提供 happens-before 的保证, 确保一个线程的 修改能对其他线程是可见的 。某 些情况下 ,volatile 还能提供原子性 ,如 读 64 位 数据类型 ,像 long 和 double 都不是原子的 ,但 volatile 类型的 double 和 long 就是原子的。
5、10 个线程和 2 个线程的同步代码,哪个更容易写?
从写代码的角度来说, 两者的复杂度是相同的, 因为同步代码与线程数量是相互 独立的。 但是同步策略的选择依赖于线程的数量, 因为越多的线程意味着更大的 竞争, 所以你需要利用同步技术, 如锁分离, 这要求更复杂的代码和专业知识。
6、你是如何调用 wait()方法的?使用 if 块还是循环?为什 么?
wait() 方法应该在循环调用, 因为当线程获取到 CPU 开始执行的时候, 其他条 件可能还没有满足, 所以在处理前, 循环检测条件是否满足会更好。 下面是一段 标准的使用 wait 和 notify 方法的代码:
// The standard idiom for using the wait method
synchronized (obj) {
while (condition does not hold)
obj.wait(); // (Releases lock, and reacquires on wakeup)
... // Perform action appropriate to condition
}
参见 [Effective Java]第 69 条, 获取更多关于为什么应该在循环中来调用 wait
方法的内容。
###7、 什么是多线程环境下的伪共享( false sharing)?
伪共享是多线程系统( 每个处理器有自己的局部缓存) 中一个众所周知的性能问 题。 伪共享发生在不同处理器的上的线程对变量的修改依赖于相同的缓存行, 如 下图所示:
有经验程序员的 Java 面试题
伪共享问题很难被发现, 因为线程可能访问完全不同的全局变量, 内存中却碰巧 在很相近的位置上。 如其他诸多的并发问题, 避免伪共享的最基本方式是仔细审 查代码, 根据缓存行来调整你的数据结构。
8、什么是 Busy spin?我们为什么要使用它?
Busy spin 是一种在不释放 CPU 的基础上等待事件的技术。 它经常用于避免丢 失 CPU 缓存中的数据( 如果线程先暂停, 之后在其他 CPU 上运行就会丢失) 。 所以, 如果你的工作要求低延迟, 并且你的线程目前没有任何顺序, 这样你就可 以通过循环检测队列中的新消息来代替调用 sleep() 或 wait() 方法。 它唯一的 好处就是你只需等待很短的时间, 如几微秒或几纳秒。 LMAX 分布式框架是一个 高性能线程间通信的库 ,该库有一个 BusySpinWaitStrategy 类就是基于这个概 念实现的, 使用 busy spin 循环 EventProcessors 等待屏障。
9、Java 中怎么获取一份线程 dump 文件?
在 Linux 下,你可以通过命令 kill -3 PID ( Java 进程的进程 ID)来获取 Java 应用的 dump 文件。 在 Windows 下, 你可以按下 Ctrl + Break 来获取。 这 样 JVM 就会将线程的 dump 文件打印到标准输出或错误文件中 ,它 可能打印在 控制台或者日志文件中, 具体位置依赖应用的配置。 如果你使用 Tomcat。
10、Swing 是线程安全的?
不是, Swing 不是线程安全的。 你不能通过任何线程来更新 Swing 组件, 如 JTable、 JList 或 JPanel, 事实上, 它们只能通过 GUI 或 AWT 线程来更新。 这就是为什么 Swing 提供 invokeAndWait() 和 invokeLater() 方法来获取其 他线程的 GUI 更新请求。 这些方法将更新请求放入 AWT 的线程队列中, 可以 一直等待, 也可以通过异步更新直接返回结果。 你也可以在参考答案中查看和学 习到更详细的内容。
11、什么是线程局部变量?
线程局部变量是局限于线程内部的变量, 属于线程自身所有, 不在多个线程间共 享。 Java 提供 ThreadLocal 类来支持线程局部变量, 是一种实现线程安全的方
式。 但是在管理环境下( 如 web 服务器 ) 使用线程局部变量的时候要特别小心 , 在这种情况下, 工作线程的生命周期比任何应用变量的生命周期都要长。 任何线
程局部变量一旦在工作完成后没有释放, Java 应用就存在内存泄露的风险。
12、用 wait-notify 写一段代码来解决生产者-消费者问题?
答案
http://java67.blogspot.sg/2012/12/producer-consumer-problem-with-wai
t-and-notify-example.html
请参考答案中的示例代码。只要记住在同步块中调用 wait() 和 notify()方法 ,如 果阻塞, 通过循环来测试等待条件。
13、用 Java 写一个线程安全的单例模式(Singleton)?
答案
http://javarevisited.blogspot.in/2012/12/how-to-create-thread-safe-singl
eton-in-java-example.html
请参考答案中的示例代码, 这里面一步一步教你创建一个线程安全的 Java 单例 类。 当我们说线程安全时, 意思是即使初始化是在多线程环境中, 仍然能保证单 个实例。Java 中,使用枚举作为单例类是最简单的方式来创建线程安全单例模式 的方式。
14、Java 中 sleep 方法和 wait 方法的区别?
虽然两者都是用来暂停当前运行的线程, 但是 sleep() 实际上只是短暂停顿, 因 为它不会释放锁,而 wait() 意味着条件等待 ,这就是为什么该方法要释放锁,因 为只有这样, 其他等待的线程才能在满足条件时获取到该锁。
15、什么是不可变对象(immutable object)?Java 中怎么 创建一个不可变对象?
不可变对象指对象一旦被创建, 状态就不能再改变。 任何修改都会创建一个新的
对象 ,如 String、Integer 及其它包装类 。详 情参见答案 ,一 步一步指导你在 Java 中创建一个不可变的类。
16、我们能创建一个包含可变对象的不可变对象吗?
是的, 我们是可以创建一个包含可变对象的不可变对象的, 你只需要谨慎一点,
不要共享可变对象的引用就可以了, 如果需要变化时 , 就返回原对象的一个拷贝 。 最常见的例子就是对象中包含一个日期对象的引用。
数据类型和 Java 基础面试问题
17、Java 中应该使用什么数据类型来代表价格?
如果不是特别关心内存和性能的话, 使用 BigDecimal, 否则使用预定义精度的 double 类型。
18、怎么将 byte 转换为 String?
可以使用 String 接收 byte[] 参数的构造器来进行转换 ,需 要注意的点是要使用 的正确的编码, 否则会使用平台默认编码, 这个编码可能跟原来的编码相同, 也 可能不同。
19、Java 中怎样将 bytes 转换为 long 类型?
这个问题你来回答
标签:面试题,Java,JVM,线程,内存,2022,使用,方法 From: https://blog.51cto.com/u_15746412/5748335