集合类(hashmap等)
Java集合可以分为Collection与Map两个体系
Collection接口:单列集合,用来存储一个个的对象
list接口:存储有序的,可以重复的数据 “动态数组。也需要重写equals方法
- ArrayList:作为List接口的主要实现类;线程不安全,效率高;底层使用Object[] elementtype存储
- LinedList:对于频繁的插入,删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
- Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementtype存储
Set接口:存储无序的,不可重复的数据(无序性:不是随机存储,存储的数据不是按照添加的顺序存储在底层数组,而是根据数据的哈希值。 不可重复性:包子添加的元素按照equals判断时,不能返回true,相同的元素只能有一个)
要求:向Set中添加的数据,其所在的类一定要重写hashCode()和equals()HashSet. 底层:数组+链表的结构。作为set接口的主要实现类;线程不安全的;可以存储null值
添加元素的过程,以hashset为例:
我们向HAshset中添加元素a,首先调用a所在类的HashCode()方法,计算出a的哈希值,此哈希值可以通过某种算法计算出其在HASHSET底层数组中的存放位置(即索引位置),判断数组此位置上是否有其他元素:
如没有,则添加成功------>情况1
如果有其他元素b,则比较二者的哈希值
如果二者的哈希值不相同,则元素a添加成功------>情况2
如果哈希值相同,今儿调用a所在类的equals方法:
equals方法返回true,元素a添加失败
equals方法返回false,元素a添加成功------>情况3
对于情况23而言:元素a与已经存在指定索引位置上数据以链表的方式存储
jdk7:元素a放到数组中,指向原来的元素
jdk8:原来的元素放在数组中,指向元素aLinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历
在添加数据的同时,每个数据还维护了两个引用,记录次数据前一个数据和后一个数据,对于频繁的遍历操作,LinkedHashSet效率高于HashSetTreeSet:同一个类new的才能放进去 可以按照添加对象的指定属性,进行排序 红黑树(自然排序和定制排序)自然排序(实现COmparato接口),比较两个对象是否相同的标准为:ComparaTo()返回0,不再是equals()
Map接口:双列集合,用来存储(key-value)对的数据
HashMap:作为主要的实现类;线程不安全,效率高;存储null的key和value
- LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序来实现遍历
原因:在原有的HAshmap底层结构基础上,添加了一堆指针,指向前一个和后一个。对于频繁的遍历操作,此类执行效率高于hashmap- TreeMap:保证按照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序底层使用红黑树
- LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序来实现遍历
Hashtable:古老的实现类;线程安全,效率低;不能存储null的key和value
Properties:常用来处理配置文件。key和value都是String型
HashMap的底层:数组➕链表(jdk7及之前) 数组+链表+红黑树(jdk8)- Map结构的理解:
Map 的key:无序的,不可重复的,使用set存储所有的key。---->key所在的类要重写equals和hashcode
Map的value:无序的,可重复的,使用Collection存储所有的value---->value所在的类要重写equals
一个键值对:key-value构成了一个entry对象
Map的entry:无序的,不可重复的,使用set存储所有的entry
- Map结构的理解:
迭代器遍历list
Interator<integer> interator=list.iterator();
while(iterator.hasNext()){
int stuSoce=iterator.next();
System.out.println(stuScore);
}</integer>
ArrayList,LinkedList,Vector 的异同
同:都是实现了list接口,存储数据的特点相同:存储有序的,可重复的数据
不同: