Java集合

集合:
用来表示一组被称为元素的对象,一些集合允许数据重复,一些集合不允许数据重复
集合与数组的区别:
1:数组的长度固定,而集合的长度可变
2:数组的存储类型单一,而集合并不单一。

Collection接口:
是所有集合的根元素继承与Iterable。
Iterable接口:是一个迭代器,里面有默认增强for循环的实现,也可以返回Iterator迭代器。
Iterator: 就是一个最原生迭代器。

List接口,集合的一种:
ArrayList:
使用动态数组实现,初始容量是10,每次扩容1.5,有序,元素可重复,线程不安全由于数组是Java底层自带的数据结构,有下标的存在,所以查询的速度较快,对于更改以及删除较慢。

LinkedList:
双向链表的结构,里面有一个Node类用来充当节点,由于链表不牵扯扩容,所以不牵扯到长度限制以及扩容,链表中不存在真实的下标,每一次操作几乎都要通过迭代,所以其查询速度较慢,但是由于不需要维护下标所以更改与删除较快,
线程不安全。

Vector :
底层使用动态数组实现,由于大部分方法都被synchronized实现所以线程是安全的,但是速度较慢。

Map:
虽然map是我们集合框架的一部分,但是其并没有继承我们的collection接口,Map里面需要传入两个泛型,是一个key value键值对存在。

HashMap与HashTable的区别:
1:作者不同
2:诞生时间不同HashTable诞生于JDK1.0,HashMap诞生于JDK1.2
3:继承父类不同HashTable继承于Dictionary,HashMap继承于AbstractMap
4:对外提供的方法不一样,HashTable比HashMap多了两个方法,elements与contains方法。
5: key与value对null的支持不一样,HashTable不支持,HashMap支持。
6:线程安全不同HashTable安全,HashMap不安全
7:计算hash值的方式不同
8:初始容量不同HashTable的初始容量是11,每次扩容是2n+1,HashMap是16,每次扩容是2n(2倍)

如何解决HashMap线程安全问题:
1:ConcurrentHashMap 是HashMap的代替品,由于里面用了同步代码块所以线程是安全的。
2:使用同步代码块对 map加锁。

set:
继承于Collection接口,但是其底层是使用map的key来实现的,所以没有下标的存在,值无序并且值不能重复。由于set需要使用hashCode算法与equals方法来对比元素是否重复,所以我们写的类需要重写这两个方法。

set如何保证value不重复:
1:对比value的hash值(是否发生了hash碰撞)是否相同,如果hash值相同就用equals方法对比值是否相同
因为如果两个对象的hash值相同的话,有可能值是不同的(Aa与BB),如果hash值不同代表肯定值不同。
TreeSet与HashSet的区别:

Comparable接口,用来定义排序的接口,实现这个接口需要重写compareTo方法,我们可以在方法内对比对象的属性,如果返回1代表排后面,如果返回-1代表排在前面,当我们的类实现了这个接口后,就可以使用TreeSet自然排序以及使用Collections.sort(list)方法对集合排序。

Comparator接口,用来定义排序的接口,实现这个接口需要重写compare方法,我们可以在方法内对比对象的属性,如果返回1代表排后面,如果返回-1代表排在前面,当我们的类实现了这个接口后,就可以使用Collections.sort(list,接口实现类对象)方法对集合排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郑要做干饭人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值