1. se接口
特点:值不重复,存放元素,元素无索引
注:List是按添加顺序排放的
两种实现:
HashSet :特点:不重复,无序的
TreeSet:特点:不重复,可以根据元素进行排序
两种循环:增强for循环和迭代器遍历
1. HashSet
默认初始容量(16)和负载因子(0.75)
1. 创建及其常用方法
创建默认的HashSet集合 HashSet
创建容量20的HashSet集合 HashSet
2. add(E e)
添加元素时,如何判断元素是否存在(判断HashMap的键是如何判断的),在添加元素时,在里面判断元素是否存在
解决两个问题: 1. 效率要高;(hashCode()效率高,但不安全)2. 安全(equals() 绝对安全,效率低)
add添加时,先用内容调用hashCode() 方法,计算出一个哈希值(int),用hash值比较是否相同,效率高,但是只用哈希值比较不安全,这时会调用equals()方法对每个字符进行比较。
例: new Person() 在内存中创建一个对象,有一个内存地址
public static int hashCode(Object o) {
return o != null ? o.hashCode() : 0;
}
默认调用object类中hashCode()方法。
import java.util.HashSet; public class HashSetTest { public static void main(String[] args) { HashSetset = new HashSet<>(); Person p1 = new Person(1,"张三1"); Person p2 = new Person(2,"张三2"); Person p3 = new Person(3,"张三3"); Person p4 = new Person(1,"张三1"); Person p5 = new Person(4,"张三4"); set.add(p1); set.add(p2); set.add(p3); set.add(p4); set.add(p5); System.out.println(set); } }
注:Person类中没有进行重写Object类中的hashCode(),默认调用的是Object类中的,取出的是内存地址。
一般的类都会进行重写object类中hashCode()方法,重写后的计算方式都是根据对象中的包含的内容的值进行计算的,重写后添加时,调用自己类中的hashCode() ;
例题:
import java.util.Objects; public class Person { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person(int id, String name) { this.id = id; 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 id == person.id && name.equals(person.name); } @Override public int hashCode() { return Objects.hash(id, name); } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + ''' + '}'; } }3. 常用方法
判断集合是否存在指定元素 set.contains("a");
判断集合是否为空 set.isEmpty();
删除集合中指定元素 set.remove("a");
集合存储元素的个数 set.size();
import java.util.HashSet; import java.util.Iterator; public class HashSetDemo { public static void main(String[] args) { HashSet2. TreeSet 1. 创建set = new HashSet<>(); set.add("a"); set.add("b"); set.add("c"); set.add("a"); set.add("d"); for (String t:set ) { System.out.println(set); } Iterator it = set.iterator(); while (it.hasNext()){ String str = it.next(); } System.out.println(set); } }
默认的创建方式: TreeSet
添加时要对元素进行排序和去重(实现compareTo()),比较大小,值如果 == 0了,则说明有重复
public class Person implements Comparable{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person(int id, String name) { this.id = id; this.name = name; } @Override public int compareTo(Person o) { return this.id - o.id; // return this.name.compareTo(o.name); } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + ''' + '}'; } }
public class TreeSetTest { public static void main(String[] args) { TreeSettset = new TreeSet<>(); Person p1 = new Person(01, "小段"); Person p2 = new Person(02, "小小"); Person p3 = new Person(04, "小王"); Person p4 = new Person(01, "小段"); Person p5 = new Person(03, "小新"); tset.add(p1); tset.add(p2); tset.add(p3); tset.add(p4); tset.add(p5); //添加时要对元素进行排序和去重(使用conpareTo()方法) //比较大小,值如果 == 0,有重复 System.out.println(tset); } }
3. 常用方法
删除第一个元素 tset1.pollFirst();
删除最后一个元素 tset1.pollLast();
查找第一个元素 tset1.first();
查找最后一个元素 tset1.last();
import java.util.TreeSet; public class TreeSetDemo1 { public static void main(String[] args) { TreeSettset1 = new TreeSet<>(); tset1.add(3); tset1.add(2); tset1.add(4); tset1.add(1); tset1.add(2); System.out.println(tset1);//[1, 2, 3, 4] System.out.println(tset1.first());//1 tset1.pollFirst(); System.out.println(tset1);//[2, 3, 4] System.out.println(tset1.first());//2 System.out.println(tset1.last());//4 tset1.pollLast(); System.out.println(tset1);//[2, 3] System.out.println(tset1.last());//3 } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)