list集合是有序的,顺序即添加的顺序,元素是可重复的。
底层基于数组实现。在add元素的过程中,如果超过了数组容量,会自动扩容。
主要特点:随机访问快(数组的特性),但是在中间插入和移除元素时较慢(涉及数组拷贝动作)。
底层基于链表数据结构设计。 主要特点:在中间插入和删除操作快。但是随机访问较慢(需要遍历node指针)。 LinkedList的一些专有方法:
set集合不保存重复的元素。
HashSet按照Hash算法存储集合中的元素,具有很好的存取和查找性能。 通过元素的hash()和equals()方法来判断元素是否重复。因此,HashSet中元素的存储顺序是和元素的添加顺序不一样的。
LinkedHashSet是HashSet的子类。使用链表来维护元素的添加次序,因此存储顺序就是元素的添加顺序。
底层元素存储基于红黑树数据结构实现。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]]
关注蚂蚁编程 ↓