java数据容器
Collection接口实现类的特点
1.Collection接口的实现子类可以存放多个元素,每个元素可以是Object
2.有些Collection接口的实现类,是有序的(List),有些不是有序的(Set)
3.List 主要分为ArrayList、 LinkedList 和 Vector;
ArrayList(查询快)
ArrayList是Array(动态数组)的数据结构,ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
1.允许插入的元素重复
2.插入的元素是有序的
3.动态扩容
4.非线程安全,异步
5.基于动态数组的数据结构
6.擅长随机访问(get set)
LinkedList (增删快)
LinkedList是Link(链表)的数据结构。LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。故查找的时候比较慢。
LinkedList底层通过双向链表实现,双向链表的每个节点用内部类Node表示。LinkedList通过first和last引用分别指向链表的第一个和最后一个元素。
1、LinkedList维护了元素插入的时候的顺序;
2、实现了Queue、Deque接口;
3、是非线程安全的;
4、适合删除操作,因为,删除不会发生移位;
5、可以包含重复的元素;
LinkedeList和ArrayList的区别
1、数据结构不同
ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构。
2、效率不同
当随机访问List (get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
ArrayList增删慢,查询快。LinkedList增删快,查询慢。
3、自由行不同
ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
4、主要控件开销不同
ArrayList主要控件开销在于需要在List列表预留一定空间;而LinkList主要控件开销在于需要存储节点信息以及节点指针信息。
Set接口
Set接口是Collection接口的子类,其继承了所有方法。
HashSet集合则实现了Set接口,其内部存储数据时依靠哈希表。
TreeSet
TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet, Cloneable, java.io.Serializable接口。
TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。
TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。
TreeSet 实现了Cloneable接口,意味着它能被克隆。
TreeSet 实现了java.io.Serializable接口,意味着它支持序列化。
TreeSet为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。
另外,TreeSet是非同步的。 它的iterator 方法返回的迭代器是fail-fast的。
两种排序方式:自然排序(实现Comparable接口) 和 定制排序(Comparator)
Set接口的遍历方式
同Collection接口的遍历方式一样,因为Set接口是Collection接口的子接口
1.可以使用迭代器
2.增强for循环
不能使用普通for循环遍历,因为不能使用索引的方式来获取集合中的元素
Map
Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。键和值可以是任意数据类型,并且键对象Key不允许重复,这样在访问Map集合中的元素时,只要指定了Key,就能找到对应的Value。
Map接口中常用集合概述
Map接口中常用的集合为HashMap、LinkedHashMap。
- HashMap<K,V> 存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
- LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
- Hashtable<K,V>:慢慢淘汰了。
Map集合的遍历方式
1.利用键获取值的方式。首先调用Map的keySet()方法,把Map中的所有键存储到一个Set中,然后就可以遍历Set,拿到key了,最后通过get操作获取value的值。
2.entrySet()方法。
Map接口中又写了一个接口:Entry是映射关系的接口。方便理解,可以把key-value想成一对夫妻,而Entry就是结婚证。
Map接口中有方法entrySet(),通过这个方法可以得到一个Set集合,集合中存放的是Entry类型的对象(映射关系的对象,结婚证)。Entry接口的getKey()、getValue()方法可以得到key和value。