JAVA集合框架(二)-List和Set

时间:2021-10-02 17:56:46

List的常用实现类

list集合是有序的,顺序即添加的顺序,元素是可重复的。

  • ArrayList
  • LinkedList
  • Vector

ArrayList

底层基于数组实现。在add元素的过程中,如果超过了数组容量,会自动扩容。
主要特点:随机访问快(数组的特性),但是在中间插入和移除元素时较慢(涉及数组拷贝动作)。

LinkedList

底层基于链表数据结构设计。
主要特点:在中间插入和删除操作快。但是随机访问较慢(需要遍历node指针)。
LinkedList的一些专有方法:

  • void addFirst(E e) 将指定元素添加到此集合的开头
  • void addLast(E e) 将指定元素添加到此集合的末尾
  • E getFirst() 返回此集合的第一个元素
  • E getLast() 返回此集合的最后一个元素
  • E removeFirst() 删除此集合中的第一个元素
  • E removeLast() 删除此集合中的最后一个元素

Vector的实现类似ArrayList。只是Vector是线程安全的。它的大部分方法都加了同步锁synchronized

Set的常用实现类

set集合不保存重复的元素。

  • HashSet
  • TreeSet
  • LinkedHashSet

HashSet

HashSet按照Hash算法存储集合中的元素,具有很好的存取和查找性能。
通过元素的hash()和equals()方法来判断元素是否重复。因此,HashSet中元素的存储顺序是和元素的添加顺序不一样的。

LinkedHashSet

LinkedHashSet是HashSet的子类。使用链表来维护元素的添加次序,因此存储顺序就是元素的添加顺序。

TreeSet

底层元素存储基于红黑树数据结构实现。TreeSet保证了存入集合中的元素处于有序状态。这种有序可以是自然排序和定制排序。
自然排序:
TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后让集合按照升序排列。
加入集合中的元素需要实现Comparable接口,重写compareTo()。

public class Person implements Comparable<Person>{ private String name; private int age; public Person(String name, int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public void setAge(int age) { this.age = age; } // 按年龄排序 public int compareTo(Person person) { int ret = (this.age - person.age); return ret; } } 测试类: public class setMain { public static void main(String[] args) { Set<Person> personSet = new TreeSet<Person>(); personSet.add(new Person("张三",10)); personSet.add(new Person("王五",23)); personSet.add(new Person("李四",15)); System.out.println(personSet); } } 

输出:

[Person [name=张三, age=10], Person [name=李四, age=15], Person [name=王五, age=23]]

定制排序:
如果要定制排序,需要在TreeSet构造器中传入Comparator比较器。

public class NameComparator implements Comparator<Person>{ public int compare(Person person1, Person person2) { return person1.compareTo(person2); } } 测试类: public class setMain { public static void main(String[] args) { Set<Person> set = new TreeSet<Person>(new NameComparator()); set.add(new Person("张三",10)); set.add(new Person("王五",23)); set.add(new Person("李四",15)); System.out.println(set); } } 

输出:

[Person [name=张三, age=10], Person [name=李四, age=15], Person [name=王五, age=23]]