Java-JavaSE-集合Collection
- 概述
- 理解集合的关键:要清楚各实现类的内部数据结构!
- 集合是用来存储对象的容器
- 长度是可变的
- 不可以存储基本数据类型值
- 方法
- boolean add(E e)\addAll(Collection<? extends E> c)
- void clear();
- 清空集合
- remove(Object obj)\removeAll(Collection c)
- 方法会改变集合的长度
- 若存在多个相同的obj,那么只移除1个
- boolean contains(E e)
- Iterator<E> iterator()!!!!!!!!!
- boolean retainAll(Collection c)
- 取交集
- Object[] toArray()
- 将集合转成数组
- int size()
- 返回此集合的元素数
- boolean contains(Object o)
- 与HashSet不同,这里判断元素是否相同,仅依据对象的equals()方法
- Interface Iterator<E>
- 不同集合的共性的取出元素的特性的抽象
- 迭代的过程中,是不允许对集合进行操作的!不然会抛concurrentModificationException
- 为了能够在迭代过程中对集合做添加动作,所以出现了listIterator(),注意:是使用迭代器去操作
- 方法
- boolean hasNext()
- E next()---返回迭代器中的下一个元素
- 用法
- for( Iterator it=c.iterator(); it.hasNext(); ){it.next()....}
- sub Interface
- ListIterator
- 可以在迭代的过程中对List元素进行修改
- 方法
- boolean hasNext()
- 正向
- boolean hasPrevious()
- 逆向
- E next()\ E previous()
- void add(E e)
- void remove(E e)
- void set(E e)
- boolean hasNext()
- ListIterator
- List
- 有序(存入取出的顺序一致),元素都有角标,允许重复
- 特有方法(多与角标的操作有关)
- void add(index, element)
- void addAll(index, collection)
- E remove(index)
- E set(index, element)
- E get(index)
- int indexOf(E e)
- int lastIndexOf(E e)
- List subList(start, end)
- 包含头,不包含尾
- listIterator()!!!!!!!!
- 子类
- Vector
- 内部是可增长数组数据结构
- 同步的
- since 1.0
- 方法
- Enumeration elements()-与iterator()功能重复
- ArrayList
- 可变的数组数据结构
- 不同步
- 查询的速度快
- 数组在内存空间是连续的,所以查询快
- LinkedList
- 链接列表,链表
- 不同步
- 增删元素的速度很快
- 内存空间不连续
- 方法:
- addFirst()
- offerFirst()
- addLast()
- offerLast()
- getFirst()
- 若链表是空,则抛异常
- removeFirst()
- 移除第一个,会return这个元素
- peekFirst()
- 获取但不移除,若链表是空,则返回null
- pollFirst()
- 返回第一个并移除,若为空,返回null
- Vector
- 堆栈和队列数据结构
- 堆栈
- 先进后出
- 队列
- 先进先出
- 堆栈
- Set
- 元素不可重复,无序
- 方法与Collection方法一致
- 子类
- HashSet
- 内部还是一个数组
- 由哈希表(实际是HashMap的一个实例)支持
- 不保证迭代顺序,且不保证内部顺序是恒定的
- 不同步
- 往里面存元素的时候,就按照一定的规则选择存储位置
- 这个规则按照哈希算法给定
- 往里存的时候,先判断元素的哈希值,确定元素应该存储的位置
- 若位置上已有元素,那么equals()判断两个元素是否相同
- 不同,就存,怎么存,顺延?接一个挂链?
- 所以,你要存自定义对象的话,那么要自定义hashCode()和equals()方法,让它按照你的规则去判断俩对象是否相同
- 子类
- LinkedHashSet
- 可预知迭代顺序的Set,由hash表和链表共同支持
- 有序,无重复
- LinkedHashSet
- TreeSet
- 使用元素的自然顺序对元素进行排序,或根据创建Set时提供的Comparator进行排序,具体取决于所使用的构造方法
- 往里存自定义对象的时候(超过1个),对象要实现Comparable接口,覆盖compareTo()方法
- 这个方法里定义的排序规则,叫自然排序
- 若对象无自然排序,或者我不想用对象已定义好的自然排序,那么,就通过TreeSet的带参构造函数,传入一个排序规则Comparatorcomparator
- 若自然排序和比较器comparator同时存在,会依据比较器comparator
- 自定义比较器需要实现Comparator接口,并实现compare()方法
- compareTo()方法的返回值是负整数、0、正整数
- TreeSet判断元素是否相同的依据就是compareTo()方法的返回值,0就是相同,就无法存入TreeSet(Set是元素唯一的)
- 内部数据结构是二叉树
- HashSet
- interface Comparator
- methods
- int compare(T o1, T o2)
- boolean equals(Object obj)
- 定义一个自定义比较器类,实现Comparator,将此类的一个对象作为TreeSet的构造函数的参数
- methods
- 泛型
- ArrayList<String> s =new ArrayList<String>();
- Iterator<String> i=s.iterator();
- since JDK1.5
- 应用于编译时期,避免强转的麻烦
- 编译后,生成的class文件时不带泛型的(泛型的擦除),因为老的类加载器不识别的
- 泛型应用于引用数据类型
- 定义一个泛型类
- class Demo<T>{}
- 这个类中的某些方法的参数会是T
- public <S> void show(S s1){}这个方法的参数是泛型,且与类中的T不一致
- 当方法是静态时,不能使用类上声明的泛型,只能按上边这个方法去定义泛型
- public static <S> void method(S s1){}
- 也可以将泛型作为方法的返回值类型
- public <T> T get( T t ){}
- 当方法是静态时,不能使用类上声明的泛型,只能按上边这个方法去定义泛型
- class Demo<T>{}
- 注意:
- Collection<Person> c=new ArrayList<Student>(); //Student是Person的子类
- 这种情况是不被允许的。
- Collection<Person> c=new ArrayList<Student>(); //Student是Person的子类
- 泛型的通配符 ?
- 泛型的限定的两种场景:
- ? Extends E
- 允许E类型或者E的子类型
- ? super E
- 允许E类型或者E的父类型
- ? Extends E
- Map<K,V>
- 存储的是键值对
- 必须保证键的唯一性,且每个键最多对应一个值
- 方法:
- V put(K k, V v)
- 相当于添加元素
- 会返回这之前与k关联的v值,若之前没有对应的v,则返回null
- V remove(Object k)
- 删除这个键值对
- V get(Object k)
- 若没有这个k,则返回null
- boolean containsKey(Object k)
- boolean containsValue(Object v)
- int size()
- 获取键值对的个数
- Set<K> keySet()
- 返回键的Set集合
- Set<Map.Entry<K,V>> entrySet()
- Map.Entry<K,V>保存着K和V的映射关系
- 利用Set的iterator()方法获得Map.Entry对象
- 单个Map.Entry对象保存着单对键值对,利用其getKey()\getValue()获取键值
- Colleciton<V>values()
- 值并不是唯一的,所以返回值类型是Collection
- V put(K k, V v)
- 子类
- Hashtable
- 角色类似于Vector
- 内部结构是哈希表
- 同步的
- 不允许null的键或值
- 子类
- Properties
- 存储配置文件信息,多和 IO技术相结合
- System.getProperties()
- Set<String> stringPropertyNames()
- list(PrintStream out)
- store(流,注释 )
- 把东西从流中存储到硬盘
- load(流)
- 把东西从硬盘读到流中
- Properties
- HashMap
- 内部结构是哈希表
- 不同步
- 允许null的键或值
- 存内容时要注意覆写键的hashCode()\和equals()方法
- TreeMap
- 内部结构是二叉树
- 不同步
- 可以对键进行排序
- 存内容时要注意键的比较规则的定义
- Hashtable