1. Java的基本数据类型有哪些?
答:Java的基本数据类型包括:
- 整型:
byte
,short
,int
,long
- 浮点型:
float
,double
- 字符型:
char
- 布尔型:
boolean
2. Java中的变量作用域有哪些?
答:Java中的变量作用域主要有:
- 类变量(静态变量):作用域为整个类,可以在类的任何地方访问。
- 实例变量:作用域为类的非静态方法内,以及类的其他任何部分(包括其他方法)。
- 局部变量:作用域为声明它的代码块(如方法或循环)内。
3. 什么是Java中的封装、继承和多态?
答:
- 封装:将数据(变量)和对其的操作(方法)绑定在一起,作为一个独立的单元。通过封装,可以隐藏对象的属性和实现细节,仅对外公开接口,保证数据的安全性和完整性。
- 继承:子类继承父类的属性和方法,使得子类可以复用父类的代码。Java支持单继承,即一个子类只能有一个父类。
- 多态:指允许一个引用变量引用多种实际类型的对象,并根据引用的实际对象类型来执行对应的方法。多态的实现方式包括方法重载和方法重写。
4. 什么是Java中的构造函数?它有什么作用?
答:构造函数是一种特殊的方法,用于初始化对象的状态。它与类名相同,没有返回类型(连void
也没有)。构造函数在创建对象时自动调用,用于设置对象的初始状态。
5. Java中的访问修饰符有哪些?
答:Java中的访问修饰符主要有四种:
public
:任何类都可以访问。protected
:同一个包内的类以及子类可以访问。default
(无修饰符):只有同一个包内的类可以访问。private
:只有本类可以访问。
6. Java中的异常处理机制是怎样的?
答:Java中的异常处理机制通过try-catch-finally
语句块实现。try
块中放置可能抛出异常的代码,catch
块用于捕获并处理异常,finally
块用于执行无论是否发生异常都需要执行的代码(如资源清理)。此外,还可以使用throw
语句显式抛出异常,throws
关键字声明可能抛出的异常。
7. Java中的集合框架包括哪些主要接口和类?
答:Java集合框架主要包括以下接口和类:
- 接口:
Collection
,List
,Set
,Queue
,Map
等。 - 类:
ArrayList
,LinkedList
,HashSet
,LinkedHashSet
,TreeMap
,HashMap
,ArrayDeque
等。
这些接口和类提供了丰富的数据结构,用于存储和操作对象集合。
8. 什么是Java中的垃圾回收机制?
答:Java中的垃圾回收机制负责自动回收不再使用的内存空间,防止内存泄漏。当对象没有任何引用指向它时,垃圾回收器会将其标记为可回收状态,并在合适的时机释放其占用的内存。Java的垃圾回收机制大大简化了内存管理的工作,使开发人员可以更加专注于业务逻辑的实现。
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记【点击此处即可】免费获取
9. Java中的String类是不可变的吗?为什么这样设计?
答:是的,Java中的String
类是不可变的。这意味着一旦一个String
对象被创建,它的内容就不能被改变。不可变性的好处包括:
- 安全性:由于字符串内容不会被意外修改,因此可以安全地在多个线程之间共享字符串。
- 缓存哈希值:因为字符串是不可变的,它的哈希值可以被缓存起来,这样每次调用
hashCode()
方法时都可以直接返回缓存的哈希值,提高了效率。 - 字符串池:字符串池能够存储已经创建过的字符串对象的引用,当创建新的字符串对象时,会首先检查字符串池中是否已有相同的字符串,如果有则直接返回该字符串的引用,避免了重复创建对象。
10. Java中的==和equals()方法有什么区别?
答:==
操作符用于比较两个对象的引用是否相等,即它们是否指向内存中的同一个对象。而equals()
方法用于比较两个对象的内容是否相等。对于基本数据类型,==
比较的是值;对于引用类型,==
比较的是引用。而equals()
方法则需要根据具体的类来重写,以实现自定义的内容比较逻辑。在Java的Object
类中,equals()
方法默认的行为和==
是相同的,但很多类(如String
、Integer
等)都重写了equals()
方法以提供更有意义的比较。
11)什么是线程局部变量?
线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。
12)用 wait-notify 写一段代码来解决生产者-消费者问题?
请参考答案中的示例代码。只要记住在同步块中调用 wait() 和 notify()方法,如果阻塞,通过循环来测试等待条件。
13) 用 Java 写一个线程安全的单例模式(Singleton)?
请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的 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 类型?
这个问题你来回答 :-)
20)我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?
是的,我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 128。
21)存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么?如 C = (C) B;
22)哪个类包含 clone 方法?是 Cloneable 还是 Object?
java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义。并且需要知道 clone() 方法是一个本地方法,这意味着它是由 c 或 c++ 或 其他本地语言实现的。
23)Java 中 ++ 操作符是线程安全的吗?
篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记及答案的【点击此处即可】即可免费获取
不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。
24)a = a + b 与 a += b 的区别
+= 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。如果加法操作的结果比 a 的最大值要大,则 a+b 会出现编译错误,但是 a += b 没问题,如下:
-
byte a = 127;
-
byte b = 127;
-
b = a + b; // error : cannot convert from int to byte
-
b += a; // ok
(译者注:这个地方应该表述的有误,其实无论 a+b 的值为多少,编译器都会报错,因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)
25)我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?
不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。
26)3*0.1 == 0.3 将会返回什么?true 还是 false?
false,因为有些浮点数不能完全精确的表示出来。
27)int 和 Integer 哪个会占用更多的内存?
Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。
28)为什么 Java 中的 String 是不可变的(Immutable)?
Java 中的 String 不可变是因为 Java 的设计者认为字符串使用非常频繁,将字符串设置为不可变可以允许多个客户端之间共享相同的字符串。更详细的内容参见答案。
29)我们能在 Switch 中使用 String 吗?
从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法糖。内部实现在 switch 中使用字符串的 hash code。
30)Java 中的构造器链是什么?
当你从一个构造器中调用另一个构造器,就是Java 中的构造器链。这种情况只在重载了类的构造器的时候才会出现。
JVM 底层 与 GC(Garbage Collection) 的面试问题
31)64 位 JVM 中,int 的长度是多数?
Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。
32)Serial 与 Parallel GC之间的不同之处?
Serial 与 Parallel 在GC执行的时候都会引起 stop-the-world。它们之间主要不同 serial 收集器是默认的复制收集器,执行 GC 的时候只有一个线程,而 parallel 收集器使用多个 GC 线程来执行。
33)32 位和 64 位的 JVM,int 类型变量的长度是多数?
32 位和 64 位的 JVM 中,int 类型变量的长度是相同的,都是 32 位或者 4 个字节。
34)Java 中 WeakReference 与 SoftReference的区别?
虽然 WeakReference 与 SoftReference 都有利于提高 GC 和 内存的效率,但是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而软引用虽然不能阻止被回收,但是可以延迟到 JVM 内存不足的时候。
35)WeakHashMap 是怎么工作的?
WeakHashMap 的工作与正常的 HashMap 类似,但是使用弱引用作为 key,意思就是当 key 对象没有任何引用时,key/value 将会被回收。
36)JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用?
当你将你的应用从 32 位的 JVM 迁移到 64 位的 JVM 时,由于对象的指针从 32 位增加到了 64 位,因此堆内存会突然增加,差不多要翻倍。这也会对 CPU 缓存(容量比内存小很多)的数据产生不利的影响。因为,迁移到 64 位的 JVM 主要动机在于可以指定最大堆大小,通过压缩 OOP 可以节省一定的内存。通过 -XX:+UseCompressedOops 选项,JVM 会使用 32 位的 OOP,而不是 64 位的 OOP。
37)怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位?
你可以检查某些系统属性如 sun.arch.data.model 或 os.arch 来获取该信息。
38)32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?
理论上说上 32 位的 JVM 堆内存可以到达 2^32,即 4GB,但实际上会比这个小很多。不同操作系统之间不同,如 Windows 系统大约 1.5 GB,Solaris 大约 3GB。64 位 JVM允许指定最大的堆内存,理论上可以达到 2^64,这是一个非常大的数字,实际上你可以指定堆内存大小到 100GB。甚至有的 JVM,如 Azul,堆内存到 1000G 都是可能的。
标签:面试题,Java,int,2024,对象,线程,内存,JVM From: https://blog.csdn.net/2405_88603407/article/details/143392756篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记【点击此处即可】免费获取