集合进阶
0.1 概要
1. Collection (单列):
- List (可重复): ArrayList, LinkedList
- Set (不可重复): HashSet, TreeSet
2. Map (双列)
- HashMap
3. Tips (其他方面)
- Collection, Map, List, Set 等为接口
- ArrayList, LinkedList, HashSet, TreeSet, HashMap 等位实现类
- 技巧:Ctrl + Alt + v 快速生成
1. Collection :
1. Collection 集合常用方法:
1. boolean add(E e) //添加元素
2. boolean remove(Object o) //从集合中移除指定元素
3. void clear() //清空结合中所有元素
4. boolean contains(Object o) //判断集合中是否存在指定元素
5. boolean isEmpty() //判断集合是否为空
6. int size() //集合的长度,也就是集合中元素的个数
2. Collection 集合的便利:
Collection<String>() c = new ArrayList<String>();
Interator<String> i = c.interator();
while (i.hasNext())
{
String s = i.next();
System.out.println(s);
}
2. List :
1. List 集合常用方法 :
1. void add (int index, E element) //添加元素
2. E remove(int index) //删除指定索引处元素
3. E set(int index, Object o) //修改索引处的元素,返回被修改的元素(被修改前的元素)
4. E get(int index) //返回指定位置的元素
2. 特点
- ArrayList 底层是数组 (查询快,增删慢)
- LinkedList 底层是链表 (查询慢,增删快)
3. LinkedList :
LinkedList集合的特有功能:
1. void addFirst(E e) //头插元素
2. void addLast(E e) //尾插元素
3. E getFirst() //返回列表第一个元素
4. E getLast() //返回列表最后一个元素
5. E removeFirst() //删除列表第一个元素
6. E removeLast() //删除列表中最后一个元素
4. 其他
- List 的并发异常修改
- [10, 233, 3223] (集合输出格式)
3. Set:
1. 特点:
- 无重复元素
- 没有带索引的方法,所以不能使用普通的for循环
2. HashSet 集合特点:
- 底层数据结构是哈希表
- 对集合的迭代顺序不做保证,不保证存储和去取出的元素顺序一样
- 没有带索引的方法,所以不能使用普通的 for 循环便利
- 由于是 Set 集合,所以不包含重复元素
3. HashSet 存储元素:
- 要保证元素唯一性,需要重写 hashCode() 和 equals()
4. LinkedHashSet 集合特点:
- 哈希表和链表实现的 Set 接口,具有可以测的迭代次序
- 由链表保证元素有序,也就是存储和取出顺序一样
- 由哈希表保证元素唯一,也就是没有重复的元素
5. TreeSet 集合特点:
- 元素有序 (按照构造方法排序)
- TreeSet(): 根据元素的自然顺序进行排序
- TreeSet(Comparator<?> Comparator) : 根据指定的比较器进行排序
- 没有带索引的方法,不能使用普通 for 循环遍历
- 由于是 Set 集合,所以不包含重复元素
- (用 int 类型的包装类型Integer,因为是集合)
4. 其他
1. 哈希值
- 默认情况下,不同对象的哈希值不同。
- 而重写hashCode(), 可以使哈希值相同
2.自然排序Comparable
- 自然排序,就是让元素所属的类实现 Comparable 接口,重写ComparableTo(T O) 方法
- 接口:implements Comparable
(记得后面接收遍历名), 重写CompareTo(T O) 方法
3. 比较器的使用
- 用 Tree 集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序。
- 比较器排序,就是让集合构造方法结构 Comparator 实现类对象,重写 Comparable (T O1, T O2)方法
5. 泛型
1. 泛型定义格式
- <类型>: 指定一种类型的格式。这里的类型可以看成形参。
- <类型1,类型2 … > 指定多种类型的形式。这里的类型可以看作形参。
2. 泛型的好处
- 把运行期间的问题提前到了编译期。
- 避免了强制类型转换。
3. 泛型类定义格式:
- 修饰符 class 类名<类型> { }
- public class Generic
{ }
4. 泛型方法
格式:修饰符<类型> 返回值类型 方法名(类型 变量名) { }
范例:
public<T> void show(T t) { }
5. 泛型接口:
格式:修饰符 interface 接口名<类型> { }
范例
public interface Generic<T> { }
6. 类型通配符
类型通配符 <?>
例如:
List<?> list = new ArrayList<Object>();
类型通配符上限:<? extends 类型>
- 类型通配符下限:<? super 类型>
7. 可变参数
- 又称为参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的
格式:修饰符 返回值类型 方法名 (数据类型…变量名) { }
范例:
public static int sum (int ...a) { } //实际传递的是数组,需要迭代求和
实际例子
public class sum_1 {
public static void mian(String [] args) {
System.out.println(sum(21, 12, 21, 12, 12, 12, 12, 21))
}
public static int sum (int ...a) { //实际传递的是数组
int sum = 0;
for (int i : a) {
sum += i;
}
return sum;
}
}
6. Map :
1. 特点:
- 多态的方式创建 Map 对象
2. Map 集合的基本功能:
1. V put (K key, V value) //添加元素
2. V remove (Object key) //根据键删除元素
3. void clear() //清空
4. boolean containKey(Object key) //判断集合是否包含指定的键
5. boolean containValue(Object value) //判断集合是否包含指定的值
6. boolean isEmpty() //判断集合是否为空
7. int size() //返回集合长度
3. Map集合的获取功能:
1. V get(Object key) //根据键获取值
2. Set<K> keySet() //获取所有键的值
3. Collection<V> values() //获取所有值的集合
4. Set<Map.Enter<K,V>> entrySet() //获取所有键值对对象的集合 —— 获取所有键值对对象的集合后,可以用 getKey() 和 getValue() 的方法来获取键和值
4. 注意:
- 重写两个方法来保证键的唯一性:hashCode() 和 equals()
5. TreeMap: 参考TreeSet
- 默认按照键排序
7. Collections:
1. Collections 概述:
- 是针对集合操作的工具类
2. Collections 类的常用方法:
1. public static <T extends Comparable <?super T>> void sort (List<T> list) //升序排序
2. public static void reverse(List<?> list) //反转指定列表的元素 (单纯反转)
3. public static void shuffle(List<?> list) //使用默认的随机源随机排序列表