- Collection
- 层次结构 中的根接口。
- Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
- 继承关系图:
- List
- 有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
- Set
- Set 接口是Collection的子接口,Set接口没有提供额外的方法,但实现 Set 接口的容器类中的元素是没有有顺序的,而且不可以重复。
- Set 容器可以与数学中“集合”的概念相对应。
- 实现类:
- LinkedHashSet:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。
- HashSet:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。
- TreeSet:基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
- TreeSet:是自然顺序对元素排序,适合做索引。
- Map
- 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
- Map的实现类
- 实现类有HashMap、TreeMap、Hashtable、LinkedHashMap
- Map的常用方法
- V put(K key, V value)
- 将指定的值与此映射中的指定键关联(可选操作)。
- V get(Object key)
- 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
- boolean isEmpty()
- 如果此映射未包含键-值映射关系,则返回 true。
- void clear()
- 从此映射中移除所有映射关系(可选操作)。
- V remove(Object key)
- 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
- int size()
- 返回此映射中的键-值映射关系数。
- V put(K key, V value)
- hashcode
- hashcode是一种编码方式,在Java中,每个对象都会有一个hashcode,Java可以通过这个hashcode来识别一个对象。至于hashcode的具体编码方式,比较复杂(事实上这个编码是可以由程序员通过继承和接口的实现重写的),可以参考数据结构书籍。而hashtable等结构,就是通过这个哈希实现快速查找键对象。这是他们的内部联系,但一般编程时无需了解这些,只要知道hashtable实现了一种无顺序的元素排列就可以了。.
- 两个对象值相同(x.equals(y) == true),则一定有相同的hash code。
- 以下是java语言的定义:
- 对象相等则hashCode一定相等;
- hashCode相等对象未必相等。
- 这也涉及到如何写自定义的hashCode方法的问题:必须符合以上条件。
- Collection类对象在调用remove、contains等方法时需要比较对象是否相等,这会涉及到对象类型的equals方法和hashCode方法;
- 对于自定义类型,需要重写equals和hashCode方法以实现自定义的对象相等规则。
- 哈希算法的本质就是通过算法,快速定位到我们存储东西的地方
- hashcode代码示例:
-
public static void main(String[] args) { String s1 = "通话"; String s2 = "重地"; System.out.println(s1.hashCode()==s2.hashCode()); System.out.println(s1.equals(s2)); }
-
- 增强for循环
- 语法示例:
-
//增强for循环 for (String s : l1) { System.out.println(s); }
- Iterator迭代器
- 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
- Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
- Iterator接口的方法:
- hasNext();
- 如果仍有元素可以迭代,则返回 true。
- next();
- 返回迭代的下一个元素。
- remove();
- 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
- hasNext();
- 在遍历的过程中正确的移除某一个元素使用Iterator类的remove()方法。
- 代码案例:
-
while(iterator.hasNext()){ String s = iterator.next(); if(s.equals("c3")){ //c.remove("c3");//错误,不能使用集合的remove方法 iterator.remove(); } }
-
- Collections
- 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法。
- 常用方法
- void sort(List)
- 对List容器内的元素排序
- void shuffle(List)
- 对List容器内的对象进行随机排列
- void reverse(List)
- 对List容器内的对象进行逆续排列
- void fill(List, Object)
- 用一个特定的对象重写整个List容器
- void copy(List dest,List src)
- 将src List容器内容拷贝到dest List容器
- int binarySearch(List, Object)
- 对于顺序的List容器,采用折半查找的方法查找特定对象(Integer 不能,String 可以)
- void sort(List)
- Arrays工具类
- 此类包含用来操作数组(比如排序和搜索)的各种方法。
- 常用方法
- Arrays.toString
- 将数组转换成字符串输出
- Arrays.sort
- 数组排序
- Arrays.hashCode
- 得到数组的hashCode
- Arrays.fill
- 数组元素填充
- Arrays.toString
- Comparable<T>比较器
- 此接口强行对实现它的每个类的对象进行整体排序。
- 这种排序被称为自然排序,类的compareTo方法被称为它的自然比较方法。
- 比较器中的方法:
- compareTo(T o):比较此对象与指定对象的顺序。
- 对于自定义类,需要使用Collections的排序方法,该自定义类必须实现比较器的接口,并重写抽象方法。
- 泛型:
- JDK1.4以前类型不明确:
- 装入集合的类型都被当作Object对待,从而失去自己的实际类型。
- 从集合中取出时往往需要转型,效率低,容易产生错误。
- JDK1.5后增加了泛型,好处:
- 增强程序的可读性和稳定性。
- JDK1.4以前类型不明确:
- Map.Entry<K,V>嵌套类
- 映射项(键-值对)。Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类。
- 常用方法:
- getKey()
- 返回此项对应的键。
- getValue()
- 返回此项对应的值。
- getKey()
- HashMap与HashTable的区别:
- HashMap 键值均可为空
- HashTable 键值均不能为空
- HashTable 线程安全