-
集合(Collection)
1.1 使用集合的好处
(1)可以动态保存任意多个对象,使用比较方便!
(2)提供了一系列方便的操作对象的方法:add、remove、set、get等
(3)使用集合添加、删除新元素的示意代码
1.2 单列集合(主要存放值)
1.2.1 List 接口
特点:可以重复、元素有序
(1)LinkedList:
底层源码分析:底层是双向链表,增删效率高,改查的效率低
(2)ArrayList:线程不安全
底层源码分析:
ArrayList 中维护了一个 Object 类型的数组 elementData. transient Object [] elementData // transient 表示该属性不会被序列化
当创建 ArrayList 对象时,如果使用无参构造器,则初始 elementData 容量为0,第一次添加,扩容element为10,如需在次扩容,扩容
1.5倍如果使用指定大小构造器,则初始 elementData 容量为指定大小,如需在次扩容,扩容
1.5倍(3)Vector
底层源码分析:
Vector 底层也是一个对象数组,protected Object [] elementData;
Vector 是线程同步的,线程安全,因为 Vector 类的操作方法中有 synchronized 关键字
在开发过程中,如果需要考虑线程同步,建议使用 Vector
如果无参,默认10,满后按照 2 倍扩容。
如果指定大小,则每次按照 2 倍扩容
1.2.2 Set 接口
(1)基本介绍
1)无序
2)不允许重复元素
3)JDK 的实现类有 TreeSet、HashSet
(1)HashSet
(2)TreeSet
(3)LinkedHashSet 是 HashSet 的子类
底层:数组+双向链表
1.2.3 集合常用方法
List list = new ArrayList(); // add:添加元素 list.add("Jack"); // [Jack] // remove:移除元素 list.remove("Jack"); // 删除值为 Jack 的元素 list.remove(0); // 删除索引为 0 的元素 // contains:查找元素 list.contains(true); // contains()判断list中是否包含指定元素,返回布尔值 // size:获取元素个数 list.size(); // isEmpty:判断是否为空 list.isEmpty(); // clear:清空 list.clear(); ArrayList list2 = new ArrayList(); // addAll:添加多个元素 list.addAll(list2); // containsAll:查找多个元素是否存在 list.containsAll(list2); // removeAll:删除多个元素 list.removeAll(list2);1.2.4 List 常用方法
List list = new ArrayList(); list.add("张三丰"); list.add("贾宝玉"); // void add(int index , Object ele) 在索引为 index 处插入ele元素 list.add(0, 5); // void addAll(int index, Collection eles) 在索引为 index 后,插入 eles 集合中的所有元素 // void indexOf(Object obj) 返回Obj元素出现的第一次位置 // void lastIndexOf(Object obj) 返回Obj元素出现的最后一次位置 // void remove(int index) 移除索引为 index 的元素 // void set(int index, Object ele)将元素 ele 替换到索引为 index 中 // List subList(int fromIndex, int toIndex):返回 fromIndex 到 toIndex 中的子集合 // 注意返回的子集合 fromIndex <= subList < toIndex1.2.5 Set 常用方法
Set set = new HashSet(); set.add(1); set.add(1); set.add(null); set.add("21312"); System.out.println(set); // [null, 1, 21312] 不能添加重复元素,无序1.2.7 遍历(集合、Set)
// 集合可以通过: 迭代器、增强for循环、 for 循环 遍历 Collection col = new ArrayList(); col.add(new Book("三国演义", "罗贯中", 10.1)); col.add(new Book("红楼梦", "曹雪芹", 12)); Iterator iterator = col.iterator(); while (iterator.hasNext()) { Object next = iterator.next(); System.out.println(next); } // Set 可以使用 迭代器、增强for循环遍历
1.3 双列集合(主要存放键值对)
1.3.1 Map
(1)HashMap:线程不安全,没有实现同步
子类: LinkedHashMap
底层:`数组+链表+红黑树`
(1)key不能重复,value可以重复
(2)无序
(3)一般 Map 的 key 使用 String 类
(4)常用方法
```
containsKey:查找键是否存在
keySet:获取所有的键
values:获取所有的值
entrySet:获取所有关系 k - v
// 通过 HashMap 获取值的方法
Map hashMap = new HashMap();
hashMap.put("No1", new Staff("小李", 188888, 1));
hashMap.put("No2", new Staff("小2",5000000, 2));
hashMap.put("No3", new Staff("小3", 30, 3));
Set keySet = hashMap.keySet();
for (Object key : keySet) {
Staff stf = (Staff) hashMap.get(key);
if(stf.getSalary() > 18000)
System.out.println(stf.getSalary());
}
Set entrySet = hashMap.entrySet();
Iterator iterator = entrySet.iterator();
while (iterator.hasNext()) {
Map.Entry next = (Map.Entry)iterator.next();
Staff emp = (Staff)next.getValue();
System.out.println(emp.getSalary());
}
```
(2)hashTable
(1)存放 k - v 键值对模式
(2)hashTable 的 key 和 value 都不能为 null,否则抛出异常 NullPointException
(3)hashTable 使用方法与 hashMap 基本一致
(4)hashTable 是线程安全的
(3)TreeMap
子类:Properties
-
集合总结
(1)先判断存储的类型:单列 or 双列
(2)单列:Collection 接口
允许重复:List
增删多:LinkedList [ 底层维护了一个双向链表 ]
改查多:ArrayList [ 底层维护 Object 类型的可变数组 ]
不允许重复:Set
无序:HashSet [ 底层是 HashMap,维护了一个哈希表,即(数组+链表+红黑树) ]
排序:TreeSet
插入和取出顺序一致:LinkedHashSet,维护 数组 + 双向链表
(3)键值对:Map
键无序:HashMap [ 底层是:哈希表 jdk7:数组 + 链表, jdk8:数组+链表+红黑树 ]
键排序:TreeMap
键插入和取出顺序一样:LinkedHashMap
读取文件:Properties
-
Collections 工具类
reverse(list):反转 List 中的元素 sort(list):升序排序 swap(list, int i, int j):将 i 和 j 交换位置 shuffle(list):随机排序 sort(list, Comparator):根据指定的规则进行排序 Object max(Collection) :返回集合中最大元素 Object max(Collection , Comparator):根据 Comparator 指定顺序,返回最大元素 Object min(Collection) Object max(Collection , Comparator) int frequency(Collection, Object):返回指定集合中指定元素的出现次数 void copy(list dest, list src):将 src 中的内容复制到 dest 中 boolean replaceAll(List list, Object oldVal, Object newVal):使用新值替换掉 list 中的旧值 List arrayList = new ArrayList(); arrayList.add("12312"); arrayList.add("41"); arrayList.add("414"); Collections.sort(arrayList, new Comparator() { // [41, 414, 12312] ,按照字符长度排序 @Override public int compare(Object o1, Object o2) { return ((String)o1).length() - ((String)o2).length(); } });