Java集合类

来源:互联网 发布:php自学要多久 编辑:程序博客网 时间:2024/05/16 18:42

Java集合类

1.特点

1.1 Collection

每个“槽”中只能保存一个元素

1.1.1 Set

  • 相同数只保存一次
  • 除TreeSet外,所有Set均与Collection完全一样

1.1.2 List

  • 以特定顺序保存数据
  • 尽管List要用的方法都在Collection中,但它与Collection存在着明显不同

1.1.3 Queue

  • 不用Collectioin方法

1.2 Map

每个“槽”中能保存两个个元素
* 不必考虑Map尺寸,会自动扩容

2.实现类的具体比较

2.1 ArrayList和LinkedList

  • ArrayList:执行操作时性能不同,擅长于随机访问元素,但插入和删除元素较慢
  • LinkedList:执行操作时性能不同,操作类型多于ArrayList,插入和删除元素较快,随机访问较慢

2.2 HashSet、TreeSet和LinkedHashSet

加入Set的元素必须定义equals()方法,及其子类也应该有。且Set和Collection一样不保证维护元素的次序
* HashSet:最快获取元素的方式,该Set中元素无顺序。必须定义hashCode()
* TreeSet:该Set中元素有顺序,按照比较结果升序保存元素。必须定义Comparable接口。
* LinkedHashSet:按照添加元素顺序保存元素。和HashSet一样快,也必须定义hashCode()。内部维护链表的顺序是按照插入的顺序;如果遍历时,结果也是按插入的顺序显示。

2.3 HashMap、TreeMap和LinkedHashMap

  • HashMap:最快获取元素的方式,该Map中元素无顺序。插入和查询的开销是固定的。可通过构造器设置容量和负载因子,以调整容器性能。其键必须实现equals()方法。
  • TreeMap:该Map中元素有顺序,按照比较结果升序保存元素。基于红黑树实现,其内部会被排序(由comparable决定)。且TreeMap是唯一带有subMap()方法的Map,可以返回一个子树。其键必须实现Comparable
  • LinkedHashMap:按照添加元素顺序保存元素,并保持了HashMap的查询速度。迭代访问时反而更快,因为它使用链表维护内部次序。

3.接口方法列表

Array

  • Arrays.asList():会对原数组产生影响,除非在另一容器中创建副本。

Collection

Collection的子类也有如下方法:
* add():传入一个元素,就算传入一个List也只会增加一个元素
* addAll():传入一个List
* remove()
* removeAll()
* size()
* contains
* containsAll()
* iterator()
* shuffle()
* toArray():将任意地Collection转换为一个数组

Collection中不含有get(),因为Set是自己维护内部顺序的。想要获取Collection元素,只能用迭代器。

List

  • get()
  • List.indexOf()

Set

Map

  • Map.put(key,value)
  • Map.get(key)

4.实现类方法列表

ArrayList

LinkedList

  • add()、addFirst()和addLast()相同
  • removeFirst()和remove()相同
  • getFirst()和element()相同
  • peek()和poll()相同

5. Foreach和迭代器

5.1 Foreach

对foreach语法来说,只要是数组和实现Iterable的类都可以适用,具体地说:
* 数组可用于foreach,但数组没有实现Iterable
* 任何Collection可用于foreach:因为Collection实现了Iterable,但Map没有。
* 任何实现了Iterable接口的类都可以用于foreach

6.高级特性

事实上,所有的Collection子类型都有一个可以接受另一个Collection对象的构造器。

7.Comparable和Comparator

实现Comparator需要覆盖 compare 方法:

public class Person{     String name;     int age}class PersonComparator implements Comparator {     public int compare(Person one, Person another) {          int i = 0;          i = one.name.compareTo(another.name); // 使用字符串的比较          if(i == 0) { // 如果名字一样,比较年龄,返回比较年龄结果               return one.age - another.age;          } else {               return i; // 名字不一样, 返回比较名字的结果.          }     }}   Collections.sort( personList , new PersonComparator()) 可以对其排序

实现Comparator需要覆盖 compare 方法:

public class Person{     String name;     int age}class PersonComparator implements Comparator {     public int compare(Person one, Person another) {          int i = 0;          i = one.name.compareTo(another.name); // 使用字符串的比较          if(i == 0) { // 如果名字一样,比较年龄,返回比较年龄结果               return one.age - another.age;          } else {               return i; // 名字不一样, 返回比较名字的结果.          }     }}   Collections.sort( personList , new PersonComparator()) 可以对其排序

用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,
但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义
的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自
己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

0 0