1.Hashcode的作用
Java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不可重复。当我们在Set中添加元素的时候,怎么判断集合中是否存在该元素,我们可以用equals方法来判断,但是当元素很多的时候,这种方法显然就很慢了。
于是有人发明哈希算法来提高集合中查找元素的效率。这种方式将集合分成多个存储区域,每一个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据对象的哈希码就可以确定该对象应该存储的那个区域。
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算的一个值。这样一来,每当集合添加新的元素的时候,先调用这个元素的hashCode方法,就一下能定位到它应该放置的物理位置。如果位置上没有任何元素,就可以直接放置该位置,不需要任何比较;如果这个位置有元素,那就调用equals方法与新元素进行比较,相同的话就不存了,不相同就散列其他的地址。这样一来调用equals方法就大大降低了,几乎只需要一两次。
2.String、String StringBuffer 和 StringBuilder 的区别是什么?
String是只读字符串,它并不是基础数据类型,而是一个对象。从底层源码来看是一个final类型的字符数组,所引用的字符串不能被改变,一经定义,无法进行增删改。每次对String的操作都会生成新的String对象。
private final char value[];
每次+操作:隐式在堆上new了一个与原字符相同的StringBuilder对象,在调用append方法将原字符和+后面的字符拼接。
StringBuffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,从 AbstractStringBuilder抽象类中我们可以看到
/**
* The value is used for character storage.
*/
char[] value;
他们的底层都是可变字符数组,以后进行频繁的字符串操作时,建议使用StringBuffer和StringBuilder来进行操作。另外StringBuffer堆方法同步锁或对调用的方法加了同步锁,所以是线程安全的。而StringBuilder对方法没有加同步锁,所以是非线程安全的。
3.ArrayList和linkedList的区别?
Array(数组)是基于索引(Index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。
Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有 数据, (因为删除数据以后, 需要把后面所有的数据前移)
缺点: 数组初始化必须指定初始化的长度, 否则报错
例如:
int[] a = new int[4];//推介使用int[] 这种方式初始化
int c[] = {23,43,56,78};//长度:4,索引范围:[0,3]
List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,他继承Collection。
List有两个重要的实现类:ArrayList和LinkedList
ArrayList:可以看作是能够自动增长容量的数组。
ArrayList的toArray方法是返回一个数组
ArrayLIst的asList方法返回一个列表
ArrayList底层的实现是Array,数组扩容实现。
LinkedList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能,但在get和set方面弱于ArrayList。当然,这些对比都是指数据量很大或者操作很频繁。
4.HashMap和HashTable的区别
1.两者父类不同
HashMap是继承AbstractMap类,而HashTable是继承自Dictionary类。不过他们都实现了map,Cloneable(可复制),Serializable(可序列化)这三个接口。
2.对外提供的接口不同
Hashtable比HashMap多提供了elments() 和contains() 两个方法。 elments() 方法继承自 Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。
contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实 上,contansValue() 就只是调用了一下contains() 方法。
3、对null的支持不同
HashTable:key和value都不能为null。
HashMap:key可以为null,但是为了保证key的唯一性,只能有一个key为null;可以有多个key对应的value为null。
4.安全性不同
HashMap是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自己处理多线程的安全问题。
HashTable是线程安全的,它的每个方法上都有synchronized 关键字,因此可直接用于多线程中。
虽然HashMap是线程不安全的,但是比HashTable的效率要高很多,这样设计是合理的,因为大部分的使用场景都是单线程的。当需要多线程操作的时候可以使用线程安全ConcurrentHashMap。
ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为 ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。
5.初始容量大小和每次扩充容量大小不同
6.计算hash值的方法不同
5.Collection包结构,与Collections的区别?
Collection是集合类的上级接口,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、 Set;
Collections是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种 集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的 Collection框架。
标签:Java,ArrayList,基础,value,线程,数组,集合,方法 From: https://blog.csdn.net/2302_81614773/article/details/139841452