集合类分成Collection与map两个大类,Collection接口下的子类中存的都是单个的元素,Map接口下的子类存储的所有元素都是以键值对的形式储存的。
——————————————————————————————————————————
Collection接口
- Set接口(不能存储重复的元素)
a:HashSet,用哈希表结构存储数据,存储的方式的无序的
b:LinkedHashSet,用哈希表与链表结合的方式存储数据,有序的存储
c:TreeSet,将存储的元素按照自然顺序排序存储 - List接口(可以存储重复的元素)
a:ArrayList,以数组形式存储数据,查询快增删慢
b:LinkedList,以链表形式存储数据,查询慢增删快
c:Vector,数组结构。线程安全的
Map接口
- HashMap 储存结构为哈希表结构,元素储存是无序的
- LinkedHashMap 是HashMap的子类,采用哈希表+链表的结构储存,保证元素储存的顺序一致。
——————————————————————————————————
对于用哈希表结构参与储存的结构,如:
HashSet,HashMap,LinkedHashSet,LinkedHashMap等,都是需要考虑重写hashcode与equals方法来判断是否包含重复的值(对于Map,则是保证键不重复),对于储存的元素类型是自定义的类型,需要重写hashcode()和equals()方法。
先判断hashcode()值是否相同,若不同,则不是同一元素,可以储存;若相同,继续比较equals方法,若返回true,则为相同元素,若为false,则不同可以储存。
对ArrayList集合,其有contains方法验证是否包含相同的元素,对储存自定义的类型,同样需要重写equals方法,否则比较的为地址值。
——————————————————————————————————
关于Map的遍历问题
-
第一种方式:通过生成Entry键值对,利用entrySet得到set集合,再利用迭代器,通过遍历迭代器,得到每一个键值对对象,在对每一个对象取键和值
Map<Integer,String> map=new HashMap<>(); map.put(1,"Java"); map.put(2,"love"); map.put(3,"bigdata"); Set<Map.Entry<Integer, String>> entrySet = map.entrySet(); Iterator<Map.Entry<Integer, String>> iterator = entrySet.iterator(); while (iterator.hasNext()){ Map.Entry<Integer, String> entry=iterator.next(); Integer key = entry.getKey(); String value = entry.getValue(); System.out.print(key+":"+value); }
-
第二种:通过KeySet得到所有键的set集合,用迭代器取出每一个键的值,然后根据键找到值
Map<Integer,String> map=new HashMap<>();
map.put(1,"Java");
map.put(2,"love");
map.put(3,"bigdata");
Set<Integer> keySet = map.keySet();
Iterator<Integer> iterator = keySet.iterator();
while (iterator.hasNext()){
Integer key = iterator.next();
String value = map.get(key);
System.out.print(key+": "+value);
}