本文共 4510 字,大约阅读时间需要 15 分钟。
List | Set | Map | |
---|---|---|---|
元素顺序 | 有序 | 无序 | key无序、value无序 |
元素是否可重复 | 可重复 | 不可重复 | key不可重复、value可重复 |
注意:List中存储的元素有序,指的是读出的顺序与存入的顺序是一致的,这叫做有序。比如说List添加了元素1,3,2,那么循环遍历List读出的元素顺序也是1,3,2,而不是1,2,3,这才叫List的存储元素有序。
public class Demo { public static void main(String[] args) { Listlist = new ArrayList<>(); // 读入的顺序是:1,3,2 list.add(1); list.add(3); list.add(2); // 取出的顺序也是:1,3,2 System.out.println(list); }}/** * 打印结果: * [1, 3, 2] */
而元素可重复,指添加到List集合中的元素可以是重复的元素,重复的元素可以是值相等的基本数据类型数据,也可以是重写equals和hashCode方法的对象。
class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return name != null ? name.equals(person.name) : person.name == null; } @Override public int hashCode() { return name != null ? name.hashCode() : 0; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; }}public class Demo { public static void main(String[] args) { Listlist = new ArrayList<>(); // 添加重复元素 list.add(1); list.add(1); list.add(2); System.out.println(list); // 添加重复对象 List personList = new ArrayList<>(); Person p1 = new Person("张三"); Person p2 = new Person("张三"); personList.add(p1); personList.add(p2); System.out.println(personList); }}/** * 打印结果: * [1, 1, 2] * [Person{name='张三'}, Person{name='张三'}] */
注意:Set存储的元素是无序的,这里的无序指的是存入的顺序与输出的顺序可能是不一致的。例如存入的元素顺序是1,3,2,那么输出的元素顺序可能是1,2,3或者其他,这取决于hashCode值。因为元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,所以输出顺序是按照hashCode值来的。
public class Demo { public static void main(String[] args) { Setset = new HashSet<>(); // 输入元素的顺序是:1,3,2 set.add(1); set.add(3); set.add(2); // 输出元素的顺序是:1,2,3 System.out.println(set); }}/** * 打印结果: * [1, 2, 3] */
Set存储的元素是不允许重复的,无论是基本数据类型的元素还是对象。
class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return name != null ? name.equals(person.name) : person.name == null; } @Override public int hashCode() { return name != null ? name.hashCode() : 0; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; }}public class Demo { public static void main(String[] args) { // 存入基本数据类型的重复元素 Setset = new HashSet<>(); set.add(1); set.add(1); set.add(2); System.out.println(set); // 存入重写了equals和hashCode方法的对象 Set personSet = new HashSet<>(); personSet.add(new Person("张三")); personSet.add(new Person("张三")); personSet.add(new Person("李四")); System.out.println(personSet); }}/** * 打印结果: * [1, 2] * [Person{name='李四'}, Person{name='张三'}] */
Map存储的元素是键值对(key-value