1.重载和重写的区分
重写(Override):重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重载(reload):一个类中多态性的一种表现,同名方法的参数列表不同
2.equals与==的区分
==:比较的是变量在内存中存放的内存地址是否相同,即是否是同一个对象
equals:用来比较的是两个对象的内容是否相等
3.String、StringBuffer和StringBuilder的区分
String是只读字符串,并不是基本的数据类型,而是一个对象。从底层代码来看是一个final类型的字符数组。一经创建,则不能修改。每次对String的操作都会生成新的String对象
StringBuffer和StringBuilder的底层都是可变字符数组
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以线程是安全的。
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
4.ArrayList和LinkedList的区别
ArrayList和LinkedList是List的两个重要实现类。
ArrayList可以看作是能够自动增长的数字。在set和get操作时比LinkedList性能更好
LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能
5.HashMap和HashTable的区别
5.1 两个的父类不同
HashMap和HashTable都实现map、Cloneable(可复制)、Serializable(可序列化)这三个接口
HashMap是继承自AbstMap类
HashTable是继承自Dictionary类
5.2 对外提供的端口不同
HashTable比HashMap多提供了elements()和contains()两个方法
elements()返回HashTable中的value的枚举
contains()判断HashTable是否包含传入的value。它的作用与containsValue()一致。事实上,containsValue()只是条用了一下contains()方法
5.3 对null值的支持不同
HashTable:Key和Value都不能为null
HashMap:key可以为空,但是只能由一个,因为必须保证Key的唯一性,可以有多个key的value为null
5.4 安全性不同
HashMap是线程不安全的,多线程并发可能会产生死锁等问题,需要单独处理多线程的安全问题
HashTable是线程安全的,每个方法上都有synchronized关键字,因此可直接用于多线程中。
HashMap的效率远高于HashTable。这样设计是合理性是因为大部分的使用场景都是单线程。当需要多线程操作时可以用ConcurrentHashMap。
ConcurrentHashMap虽然也是线程安全的,但是它的效率比HashTable要高好多倍,因为它使用了分段锁,并不对整个数据进行锁定。
5.5 初始化容量大小和每次扩容大小不同
HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
HashMap扩容时是当前容量翻倍即:capacity*2,
Hashtable扩容时是容量翻倍+1即:capacity*2+1。
5.6 计算hash的方法不同
Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模
HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸。
6.Collection包结构,与Collections的区别
Collection是集合类的上级接口,子接口有Set、List、LinkedList、ArrayList、Vector、Stack、Set
Collections是集合类的一个帮助类。它包含有各种有关集合操作的静态多态方法,用于实现对各种集合的搜索、排序、线程安全话等操作。此类不能实例化,就像一个工具类,服务于java的Collection框架。