目录
1. se接口
特点:值不重复,存放元素,元素无索引
注:List是按添加顺序排放的
两种实现:
HashSet :特点:不重复,无序的
TreeSet:特点:不重复,可以根据元素进行排序
两种循环:增强for循环和迭代器遍历
1. HashSet
默认初始容量(16)和负载因子(0.75)
1. 创建及其常用方法
创建默认的HashSet集合 HashSet<String> set = new HashSet<>();
创建容量20的HashSet集合 HashSet<String> set = new HashSet<>(20);
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) {
HashSet<Person> set = 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{id=3, name='张三3'}, Person{id=4, name='张三4'},
Person{id=2, name='张三2'}, Person{id=1, name='张三1'},
Person{id=1, name='张三1'}]
*/
注: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 + '\'' +
'}';
}
}
import java.util.HashSet;
public class HashSetTest {
public static void main(String[] args) {
HashSet<Person> set = 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{id=1, name='张三1'}, Person{id=2, name='张三2'},
Person{id=3, name='张三3'}, Person{id=4, name='张三4'}]
*/
3. 常用方法
判断集合是否存在指定元素 set.contains("a");
判断集合是否为空 set.isEmpty();
删除集合中指定元素 set.remove("a");
集合存储元素的个数 set.size();
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set.add("a");
set.add("d");
System.out.println(set.contains("a"));//true
System.out.println(set.isEmpty());//false
System.out.println(set.remove("a"));//true
System.out.println(set.size());//3
System.out.println(set);
}
}
4. 两种循环
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo {
public static void main(String[] args) {
HashSet<String> 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<String> it = set.iterator();
while (it.hasNext()){
String str = it.next();
}
System.out.println(set);
}
}
2. TreeSet
1. 创建
默认的创建方式: TreeSet<Integer> tset = new TreeSet<>();
2. 添加方法
添加时要对元素进行排序和去重(实现compareTo()),比较大小,值如果 == 0了,则说明有重复
public class Person implements Comparable<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 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) {
TreeSet<Person> tset = 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) {
TreeSet<Integer> tset1 = 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
}
}
Map