java集合基础总结

Java集合总结

什么是集合?

集合可以看做是一种容器,用来存储对象信息,所有集合都位于java.util包,只有支持多线程的集合类位于java.util.concurrent包下。

数组和集合的区别:

1.   
数组长度不能改变,并且无法保存具有映射关系的数据,而集合可以保存不确定长度数量的数据,能保存具有映射关系的数据。

2.   
集合只能存储对象类型的数据,而数组存储基本类型和对象集合基本框架如下

Java  的集合类主要有俩个根接口,collection和map(用来存储键值对映射)。collection的四个子接口set,list,queue,deque所以java的集合有set,list,queue,deque。map。

Collection接口的遍历:collection接口继承了iterable接口,iterable中有iterator方法,所有collection接口可以通过迭代器遍历。

List接口的遍历:list接口的父接口是collection所以他也有iterator方法也可以进行迭代器遍历,List接口还提供了listiterator方法增加了hasprevious()和pervious逆向遍历集合。

Set接口遍历:加强for循环,迭代器遍历。

List:有序可以重复的集合,实现类有:

ArrayList,底层基于数组,内存连续。不可同步,增删慢,查询快,初始容量是10默认扩容1.5倍,线程不安全。

linkedlist,底层基于链表存储数据,不可同步,增删快,查询慢,内存不连续,不需要扩容。

satck,有一个口,先进后出。入栈:往里添加元素,出栈:从栈中获取元素。扩容和vector一致,线程安全。

Vector:底层基于数组,默认10,扩容俩倍。是一个古老的集合,很少用。

Linkedlist还实现了栈形式来操作

Linkedlist list=New linkedlist;

List.push()//入栈

List.pop()//出栈

Linkedlist还实现了单向队列形式来操作

List.add()//入队

List.remove//获取头元素并删除

List.element()//获取头元素不删除

Linkedlist还实现了双向队列形式来操作

List.addFirst();//入队 List.removeFirst//出队

List.addFirst()//入队List.removeLast//出队

List.getFirst()//获取元素 List.getLast()//获取元素

set:无序不可重复的集合,判断放进去的对象是否相等,用的是equals。常与hashcode一起使用来提高效率。实现类,

hashSet:不保证存放的顺序,底层是数组加链表,容量16,默认扩容1倍。当向hashset中放一个对象时,是通过hashcode和equals来判断的

linkedhashset:他也是根据hashcoe来决定储存位置的,他和hashcode不同的时使用链表来维护元素的次序。它是保证数据存放顺序的,所有他的性能低于hashset。(利于遍历)

Treeset:在treeset的元素会自动排序,默认是升序,如果想自定义排序,需要实现一个compareable接口重写compareto方法

Deque,是一个双向队列,可以从俩端来添加删除元素,实现类既可以当队列使用也可以当栈使用。

ArrDeque:底层是基于数组的双向队列。底层是动态的可分配的数组来储存结合元素的。当集合元素超出该数组时候,会从新分配一个数组来储存。

Queue:这种数据结构先进先出,例如排队。

PriorityQuque:他的元素不是按照加入的顺序,是按照元素的大小排序。

Map

Map是存储键和值的容器,它不是collection接口的子接口,它也是一个集合类。一个键对应一个值。键可以重复值不可以重复,它的实现类有hashMap,hashtable,weakhashMap。

Hashtable:常用方法put,get。不允许储存空值和空键,初始容量11,默认扩容一倍在加1。同步式线程安全的映射。通过initial capacity和load factor俩个参数来调整性能。通常默认的load factor 是0.75正好实现均衡,在调大的话,可以节省空间但是会影响像get  put方法。

底层实现:key会通过计算其散列函数来确定对应的value的位置,因此所有对象都必须实现hashcode和equals方法。

hashMap:允许空值和空键。初始容量16,默认扩容1倍。异步线程不安全,它迭代子操作时间和容量成比例,所有不要将容量设置过高和load factor设置太低。

hashMap的存取实现

hashMap的遍历方法:

1.把键放到set集合中。然后用for循环遍历。

2.把Entry放到set集合中然后遍历set

hashMap的数据结构:hashMap里面实现了一个静态内部类Entry,属性有key,value,next。它的value 是key的哈希值对数组长度取模得到的

weakhashMap:他是hsahmap的改进,它对key实行弱应用。,如果一个key不在被外部引用,那么该key可以被GC回收 。

解决hash冲突的办法:

1开放地址法:

(线性探测法:挨个往下找,下一个冲突继续往下找)

(平发探测法)

(伪随机探测在散列:哈希h1=(3+2)%11=5,如果h1还冲突就往下找,不冲突就把元素放入第5个单位)

再哈希法:这种是构造多个不同的hash函数,发生冲突在计算直到没有冲突。增加了计算时间。

链地址法:(拉链法:hashMap就用的这个,这个方法很容易造成链表长度过大,访问的时间会很长,所以要增大数组的长度来换取链表的长度)

再散列rehash的过程:

当hash表达到默认容量时,需要调整table大小。当达到最大可能值时,那么该方法调整到integer。MAX—value返回,这时就要创建一张新表,将原表映射到新表中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值