Set及其子类
Collation总结
1.Set
a.Set集合的特点:
无序(存储和取出不一致),集合中的元素不可以重复。
import java.util.HashSet; import java.util.Set; public class Demo01 { public static void main(String[] args) { //创建Set集合对象 // Set是接口不能直接实例化 // Set<String> a = new Set<String>(); Set<String> a = new HashSet<String>(); a.add("hello"); a.add("is"); a.add("me"); a.add("is"); a.add("me"); a.add("hello"); //增强for遍历 for (String s : a) { System.out.println(s); } } } /*out: me is hello */
2.HashSet
a.底层数据结构是哈希表(是一个元素为链表的数组)
b.哈希表底层依赖两个方法:
hashCode()、equals()执行顺序:
首先比较哈希值是否相同?相同:
继续执行equals()方法:
true:元素重复了,不添加false:直接把元素添加到集合中
不同:
直接把元素添加到集合中
c.如何保证元素的唯一性?
由hashCode()、equals()保证。
e.HashSet存储字符串并遍历
import java.util.HashSet; public class HashSet存储字符串并遍历 { public static void main(String[] args) { //创建HashSet集合对象; HashSet<String> a = new HashSet<String>(); a.add("hello"); a.add("is"); a.add("me"); a.add("hello"); a.add("is"); a.add("me"); for (String s : a) { System.out.println(s); } } } /*out: me is hello*/
f.HashSet存储自定义对象并遍历
import java.util.HashSet; class Student{ private String name; private int age; public Student() { super(); } public Student(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; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } //重写equals方法 比较的是内容 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } public class HashSet存储自定义对象并遍历 { public static void main(String[] args) { //创建HashSet集合对象 HashSet<Student> a = new HashSet<Student>(); //添加对象 a.add(new Student("Tom",21)); a.add(new Student("Peter",20)); a.add(new Student("Tom",21)); a.add(new Student("Jack",23)); //遍历 for (Student s : a) { System.out.println(s.getName()+"---"+s.getAge()); } } } /*out: Tom---21 Tom---21 Peter---20 Jack---23*/
3.TreeSet
a.底层数据结构是红黑树(自然平衡二叉树)
b.保证元素的排序方式:
i.自然排序(元素具备比较性)
让元素所属的类实现 Comparable 接口
ii.比较器排序(集合具备比较性)
让集合构造方法接收 Comparator的实现类对象
c.如何保证元素的唯一性?
根据比较的返回值是否是0来决定
import java.util.TreeSet; public class Demo01 { public static void main(String[] args) { //创建TreeSet对象 TreeSet<Integer> a = new TreeSet<Integer>(); //给集合添加元素 //3,2,5,8,4,7,6 a.add(3); a.add(2); a.add(5); a.add(8); a.add(4); a.add(7); a.add(6); //遍历 for (Integer i : a) { System.out.print(i+" "); } } } //out:2 3 4 5 6 7 8
4.Collection集合总结:
Collection|--List 有序,可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢。线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢。线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
|--Set 无序,唯一
|--HashSet
底层数据结构是哈希表。如何保证元素唯一性的呢?
依赖两个方法:hashCode()和equals()开发中自动生成这两个方法即可
|--LinkedHashSet
底层数据结构是链表和哈希表由链表保证元素有序由哈希表保证元素唯一
|--TreeSet
底层数据结构是红黑树。如何保证元素排序的呢?
自然排序比较器排序
如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
5.Collection集合我们到底使用谁呢?
唯一?(不确定?用ArrayList)是:Set
排序?(不确定,用HashSet)
是:TreeSet否:HashSet
否:List
安全?(不确定,用ArrayList)
是:Vector否:
查询多:ArrayList增删多:LinkedList