内容摘抄自互联网,仅做学习用途,如有侵权,立马删。
1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么?
1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么?
(1)boolean
boolean
数据类型非
true
即
false
。这个数据类型表示
1 bit的
信息,但是它的大小并没有精确定义。
《Java
虚拟机规范》中如是说:
“
虽然定义了
boolean
这种数据类型,但是只对它提供了非常有限的支持。在
Java
虚拟机中没有任何供
boolean
值专用的字节码指令,
Java
语言表达式所操作的
boolean
值,在编译之后都使用
Java
虚拟机中的
int
数据类型来代替,而
boolean
数组将会被编码成
Java
虚拟机的
byte
数组,每个元素
boolean
元素占
8
位
”
。这样我们可以得出
boolean
类型单独使用是
4
个字节,在数组中又是
1
个字节。
那虚拟机为什么要用int
来代替
boolean
呢?为什么不用
byte
或
short
,这样不是更节省内存空间吗?实际上,使用
int
的原因是,对于当下
32
位的
CPU
来说,一次进行32位的数据交换更加高效。
综上,我们可以知道:官方文档对boolean类型没有给出精确的定义,《Java虚拟机规范》给出了“单独时使用4个字节,boolean数组时1个字节”的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。这其实是一种时空权衡。
boolean类型的封装类是Boolean。
(
2
)
byte
——
1 byte
——
Byte
(
3
)
short
——
2 bytes
——
Short
(
4
)
int
——
4 bytes
——
Integer
(
5
)
long
——
8 bytes
——
Long
(
6
)
float
——
4 bytes
——
Float
(
7
)
double
——
8 bytes
——
Double
(
8
)
char
——
2 bytes
——
Character
2. 谈一谈”==“与”equals()"的区别。
《Think in Java》中说:“
关系操作符生成的是一个
boolean
结果,它们计算的是操作数的值之间的关系
”
。
"
=="
判断的是两个对象的内存地址是否一样,适用于原始数据类型和枚举类型(它们的变量存储的是值本身,而引用类型变量存储的是引用);
equals
是
Object
类的方法,
Object对它
的实现是比较内存地址,我们可以重写这个方法来自定义“相等”这个概念。比如类库中的
String
、
Date
等类就对这个方法进行了重写。
综上,对于枚举类型和原始数据类型的相等性比较,应该使用"==";对于引用类型的相等性比较,应该使用equals方法。
3. Java中的四种引用及其应用场景是什么?
- 强引用: 通常我们使用new操作符创建一个对象时所返回的引用即为强引用
- 软引用: 若一个对象只能通过软引用到达,那么这个对象在内存不足时会被回收,可用于图片缓存中,内存不足时系统会自动回收不再使用的Bitmap
- 弱引用: 若一个对象只能通过弱引用到达,那么它就会被回收(即使内存充足),同样可用于图片缓存中,这时候只要Bitmap不再使用就会被回收
- 虚引用: 虚引用是Java中最“弱”的引用,通过它甚至无法获取被引用的对象,它存在的唯一作用就是当它指向的对象回收时,它本身会被加入到引用队列中,这样我们可以知道它指向的对象何时被销毁。
4. object中定义了哪些方法?
clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()
5. hashCode的作用是什么?
请参见
散列表的基本原理与实现
6. ArrayList, LinkedList, Vector的区别是什么?
- ArrayList: 内部采用数组存储元素,支持高效随机访问,支持动态调整大小
- LinkedList: 内部采用链表来存储元素,支持快速插入/删除元素,但不支持高效地随机访问
- Vector: 可以看作线程安全版的ArrayList
7. String, StringBuilder, StringBuffer的区别是什么?
- String: 不可变的字符序列,若要向其中添加新字符需要创建一个新的String对象
- StringBuilder: 可变字符序列,支持向其中添加新字符(无需创建新对象)
- StringBuffer: 可以看作线程安全版的StringBuilder
8. Map, Set, List, Queue、Stack的特点及用法。
- Map<K, V>: Java中存储键值对的数据类型都实现了这个接口,表示“映射表”。支持的两个核心操作是get(Object key)以及put(K key, V value),分别用来获取键对应的值以及向映射表中插入键值对。
- Set<E>: 实现了这个接口的集合类型中不允许存在重复的元素,代表数学意义上的“集合”。它所支持的核心操作有add(E e),remove(Object o), contains(Object o),分别用于添加元素,删除元素以及判断给定元素是否存在于集中。
- List<E>: Java中集合框架中的列表类型都实现了这个接口,表示一种有序序列。支持get(int index), add(E e)等操作。
- Queue<E>: Java集合框架中的队列接口,代表了“先进先出”队列。支持add(E element), remove()等操作。
- Stack<E>: Java集合框架中表示堆栈的数据类型,堆栈是一种“后进先出”的数据结构。支持push(E item), pop()等操作。
更详细的说明请参考官方文档,对相关数据结构不太熟悉的同学可以参考《
算法
导论》或其他相关书籍。
9. HashMap和HashTable的区别
- HashTable是线程安全的,而HashMap不是
- HashMap中允许存在null键和null值,而HashTable中不允许
更加详细的分析请参考
深入解析HashMap、HashTable
10. HashMap的实现原理
简单的说,HashMap的底层实现是“基于拉链法的散列表”。详细分析请参考
深入解析HashMap、HashTable
11. ConcurrentHashMap的实现原理
ConcurrentHashMap是支持并发读写的HashMap,它的特点是读取数据时无需加锁,写数据时可以保证加锁粒度尽可能的小。由于其内部采用“分段存储”,只需对要进行写操作的数据所在的“段”进行加锁。关于ConcurrentHashMap底层实现的详细分析请参考
Java并发编程:并发容器之ConcurrentHashMap
12. TreeMap, LinkedHashMap, HashMap的区别是什么?
- HashMap的底层实现是散列表,因此它内部存储的元素是无序的;
- TreeMap的底层实现是红黑树,所以它内部的元素的有序的。排序的依据是自然序或者是创建TreeMap时所提供的比较器(Comparator)对象。
- LinkedHashMap能够记住插入元素的顺序。
更加详细的说明请参考
HashMap,LinkedMap,TreeMap的区别
13. Collection与Collections的区别是什么?
Collection<E>是Java集合框架中的基本接口;Collections是Java集合框架提供的一个工具类,其中包含了大量用于操作或返回集合的静态方法。
对Java集合框架还不太熟悉的小伙伴请参考
Java核心技术点之集合框架
14. 对于“try-catch-finally”,若try语句块中包含“return”语句,finally语句块会执行吗?
答案是会执行。只有两种情况finally块中的语句不会被执行:
- 调用了System.exit()方法;
- JVM“崩溃”了。
15. Java中的异常层次结构
Java中的异常层次结构如下图所示:
我们可以看到Throwable类是异常层级中的基类。Error类表示内部错误,这类错误使我们无法控制的;Exception表示异常,RuntimeException及其子类属于未检查异常,这类异常包括ArrayIndexOutOfBoundsException、NullPointerException等,我们应该通过条件判断等方式语句避免未检查异常的发生。IOException及其子类属于已检查异常,编译器会检查我们是否为所有可能抛出的已检查异常提供了异常处理器,若没有则会报错。对于未检查异常,我们无需捕获(当然Java也允许我们捕获,但我们应该做的事避免未检查异常的发生)。
16. Java面向对象的三个特征与含义
三大特征:封装、继承、多态。详细介绍请戳
Java面向对象三大特性
17. Override, Overload的含义与区别
- Override表示“重写”,是子类对父类中同一方法的重新定义
- Overload表示“重载”,也就是定义一个与已定义方法名称相同但签名不同的新方法
18.排序算法的实现
这部分是面试必考内容,我们需要反复研究;