集合三大接口:
Collection、map、Iterator
使用自定义类如果有异常,则自定义对象要实现Comparable接口
List 接口 (有序、允许重复、允许空值)
- ArrayList 大小可变动态数组 线程不安全 插入删除效率低 *3/2+1增长
- Linkedlist 双向链表 适合频繁插入、删除
- Vector 可增大缩小 适合多线程访问 线程安全的 *2增长
//清除所有元素
list.clear();
//集合长度
System.out.println(list.size());
//是否包含元素
System.out.println(list.contains(10));
//查找元素首次出现位置
System.out.println(list.indexOf(10));
//集合是否为空
System.out.println(list.isEmpty());
//删除指定索引的元素
System.out.println(list.remove(5));
Set 接口 (不允许重复、最多包含一个null)
- HashSet 无序、底层使用HashMap、
- TreeSet 自然顺序排序、底层TreeMap实现、存储自定义对象必须实现Comparable/Comparator接口
- LinkedHashSet 使用哈希表+双向链 插入顺序输出 底层LinkedHashMap实现
Iterator 接口迭代器
public static void iterator(Collection<String> c){
Iterator<String> it = c.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
Map接口
Map<K,V> 键值对
- HashMap key的HashCode顺序 哈希表+链表实现 每次重新排列的方式:元数组长度*2 默认容量:16 线程不安全
- Hashtable 不允许null的键值对 默认容量:11 线程安全
- TreeMap 使用二叉树中的红黑树实现 以key的自然顺序排列
Map<String,String> map = new HashMap<String, String>();
map.put("小白", "白色");
map.put("小黑", "黑色");
map.put("小红", "红色");
//通过键得到对应的值
System.out.println(map.get("小白"));
//map的数量
System.out.println(map.size());
//键里是否含有对应值
System.out.println(map.containsKey("小红"));
map接口输出方式:- 使用map.keySet()方法吧所有的key独享转换成Set集合,然后迭代set集合取出每个key,再通过key从map中取出value
- 使用map.values()方法吧所有的value对象转换成Collection集合,然后进行迭代
- 使用map.entrySet()方法吧所有的Entry对象转换成Set集合,然后进行迭代。
//方式二:
Collection<String> c = map.values();
Iterator<String> iter = c.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
//方式三:
Set<Entry<Integer,String>> entrys = map.entrySet();
Iterator<Entry<Integer,String>> iter2 = entrys.iterator();
while(iter2.hasNext()){
Entry<Integer,String> entry = iter2.next();
System.out.println(entry.getKey()+"--"+entry.getKey());
}
hashCode深入分析:
两对象hashCode不相等一定不是同一对象。如果相等也不一定是同一对象两对象equals相等则是同一对象,不相等则不是同一对象 关键判断标准
hashCode协定:
同一词运行保持一致
equals相等 hashCode必须相等
Collections工具类