List类包含ArrayList与LinkedList
都有索引,可以重复存储元素,且存储有序
通过名字可以知道ArrayList的底层为数组结构而LinkedList的底层为链表结构
对于这两种结构而言,ArrayList的遍历查询速度要快于LinkedList。
查询速度快慢的原因在于:
对于读取速度而言,从缓存中读取要快于从内存中读取,而cpu读取数据是按照缓存行读取到缓存的,即cpu会把需要的数据加载到缓存中,查找数据时会先从缓存找,找不到时再进入内存找
数组作为连续内存,cpu会把一片连续的内存空间读入,这样连续内存的数组会更容易整块读取到缓存中,当进行遍历时,直接命中缓存,而链表是跳跃式的地址,很容易跳出缓存,进入内存查找数据,会慢很多。
List的遍历遍历可以通过迭代器或增强for循环或简单for循环进行,但增强for循环的底层依然是迭代器。
需要注意的是在涉及到遍历时进行内容修改的情况下,单使用迭代器会导致程序报错,原因在于通过集合修改集合中的元素造成迭代器获取元素中判断预期修改值和实际修改值不一致
2.SetSet常用的有HashSet、LinkedHashSet与TreeSet
HashSet的底层为哈希表,通过调用hashcode获取哈希值并计算存储位置,若当前位置无元素则直接存入,若有则进行元素比较,若哈希值不同则放进当前位置末尾,若相同则通过equals方法比较两个元素的内容,若不同则存入,若相同则不存储当前元素
LinkedHashSet底层包含一个哈希表与一个链表,通过链表来确定存储元素的位置顺序
TreeSet的底层为一个二叉排序树,内部元素存储有序,且可按一定顺序进行自然排序,可用方式有两种,一为在建立类时调用实现Comparable接口,并在类中重写compareTo方法,按要求的主要条件和次要条件来写排序方法。二为创建该类对象并调用构造方法时,让集合构造器方法接收Comparator的实现类对象,重写compare方法
3.MapMap常用的有HashMap,LinkedHashMap,TreeMap
Map存储的元素都具有对应关系,一个key值可以对应数个value值,因此,Map的遍历稍显繁琐
分两种方式:
1.
-
获取所有键的集合。用keySet()方法实现
-
遍历键的集合,获取到每一个键。用增强for实现
-
根据键去找值。用get(Object key)方法实现
SetkeySet = map.keySet(); //遍历键的集合,获取到每一个键。用增强for实现 for (String key : keySet) { //根据键去找值。用get(Object key)方法实现 String value = map.get(key); System.out.println(key + "," + value); }
2.
-
获取所有键值对对象的集合
-
Set
> entrySet():获取所有键值对对象的集合
-
-
遍历键值对对象的集合,得到每一个键值对对象
-
用增强for实现,得到每一个Map.Entry
-
-
根据键值对对象获取键和值
-
用getKey()得到键
-
用getValue()得到值
-
//获取所有键值对对象的集合
Set> entrySet = map.entrySet();
//遍历键值对对象的集合,得到每一个键值对对象
for (Map.Entry me : entrySet) {
//根据键值对对象获取键和值
String key = me.getKey();
String value = me.getValue();
System.out.println(key + "," + value);
}



