Java 中部分类概念的区分

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框架。

你可能感兴趣的:(Java 中部分类概念的区分)