Java基础

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更好的性能,但在getset方面弱于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框架。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值