本文主要是介绍双非硕转测试之Java学习笔记(一):集合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Java学习-----集合
- 简单概括
- 单列集合--collection
- list接口:
- vector类:
- LinkedList类:
- set接口:
- HasSet类:
- LinkedHashSet类:
- 双列集合--Map
- Map接口:
- HashMap类:
- HashTable类:
- Properties类:
简单概括
- 集合的定义:集合是一个容器,可以容纳多个对象,并且可以动态的增加。
- 集合的目的:解决数组无法动态增加的缺点,并且提供多种方法进行crud等等。
- 集合的分类:单列集合–collection,和双列集合map。
单列集合–collection
collection接口进行遍历的方法:
1.通过迭代器 Iterator,原理如下图
2.增强for循环,原理如下图
list接口:
定义:是collection接口的子接口,这就意味着list可以继承collection的方法。
常用方法:add、addAll、get、indexOf、remove、set、subList等等。
子类:ArrayList、vector、LinkedList。
ArrayList类:
1.这里需要注意其扩容机制,如下图所示:
2.线程不安全,所以效率高。
vector类:
1.底层 是一个对象数组。
2.线程同步的,也就是线程安全,但是效率没有ArrayList高。
3.ArrayList和vector的比较,如下图:
LinkedList类:
1.底层实现了双向链表和双端队列的特点。
2.线程不安全,没有实现同步。
3.ArrayList和LinkedList的对比,实际上可以看做链表和数组的区别,如下图:
set接口:
定义:是collection接口的子接口,无序,不允许重复元素。
常用方法:和collection接口一样。
子类:HashSet、TreeSet。
HasSet类:
1.底层实际是HashMap,而HashMap的底层是数组+链表+红黑树实现的。
2.之所以是无序的,是因为元素存放的位置是基于哈希值计算得到的,因此无法确定索引的结果。
3.原理如下图所示
4.关于HashSet的扩容机制,如下图所示:
LinkedHashSet类:
1.是HashSet的子类,意味继承lHashSet的方法。
2.LinkedHashSet的底层是LinkedHashMap,底层是通过数组和双向链表实现的。
3.因为链表的存在,LinkedHashSet可以确保遍历的顺序和插入顺序一致。
双列集合–Map
Map接口:
1.Map与Collection是并列的关系,不存在继承关系
2.Map中的元素是以键值对的方式保存的,不可以重复。
3.Map中的键值对的关系是一对一的,通过key值就能获得value值。
4.Map接口的遍历方法有多种,也比较复杂,这里只介绍一种,通过KeySrt的方式获取所有的键:Set keySet = map.Set();再通过key值取得对应的value值。
5.常用方法:put、get、remove、size、isEmpty、clear等等。
5.子类:HashMap、HashTable、Properties。
HashMap类:
1.方法实现Map接口的方法。
2.关于扩容机制:
- 先判断table是否为null,为空则为数组扩容(16)。
- 通过hash得到一个索引位置,如果为空则直接挂上去。
- 修改次数++。
- 计算table目前存放元素的个数,并且和临界值判断,如果大于则要扩容。
- 当索引位置冲突时,就判断如果哈希值和(key值或者value值)相等,就直接替换了。
- 如果哈希值和key值或者value值有一个不相等,就判断是否是红黑树,如果是则按红黑树的规则添加。
- 如果是链表,加入的元素则要挨个与链表中的元素判断,不相等则还要判断是否需要树化,不需要就直接加在后面,元素相等的话就直接break,放弃插入。
HashTable类:
1.方法基本和HashMap一致,都实现了Map接口的方法。
2.是线程安全的,而HashMap是线程不安全的。
3.不允许存在null键值。
Properties类:
1.使用特点和HashTable类似。
2.通常用作配置文件。
这篇关于双非硕转测试之Java学习笔记(一):集合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!