Set集合
Set集合中的元素不会重复,这是Set集合和List集合的最大区别。
- addAll(Collection<? extends E> c):将集合c中的所有元素添加到本集合中
- containsAll(Collection<?> c):判断本集合是否包含c集合,包含返回true,否则返回false
Set集合的子类:
HashSet、LinkedHashSet、TreeSet
HashSet:
HashSet 底层数据结构是哈希表. HashSet 不是线程安全的 集合元素可以是 null。当HashSet集合中存入元素时,会调用HashCode()方法,返回HashCode值。HashSet集合会根据HashCode值来判断元素的存储位置,进行存储。当我们存入重复元素时,会算出相同的HashCode值,会发生覆盖现象。
- add(E e):添加元素e
- clear():清空本集合的所有元素
- contains(Object o):判断本集合是否含有元素o,含有返回true,否则返回false
- isEmpty():判断本集合是否是空集合
- iterator():产生迭代器
- remove(Object o):删除集合中元素o
- size() :返回本集合的元素个数
HashSet的遍历:
package demo4;
import java.util.HashSet;
import java.util.Iterator;
//HashSet
public class Test {
public static void main(String[] args) {
HashSet<String>hashSet=new HashSet<>();
hashSet.add("aaa");
hashSet.add("张三");
hashSet.add("aaa");
hashSet.add("李四");
hashSet.add("aaa");
hashSet.add("张三");
hashSet.add("王五");
System.out.println(hashSet);
//Iterator遍历
Iterator it=hashSet.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
System.out.println("=========================");
//增强for循环遍历
for(String s:hashSet){
System.out.println(s);
}
}
}
运行结果:
[aaa, 李四, 张三, 王五]
aaa
李四
张三
王五
=========================
aaa
李四
张三
王五
LinkedHashSet
此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。简单地说,LinkedHashSet的元素唯一,而且有序。
- LinkedHashSet(Collection<? extends E> c) :构造一个与指定 collection
中的元素相同的新链接哈希 set。 - LinkedHashSet(int initialCapacity):构造一个带指定初始容量和默认加载因子 (0.75) 的新空链接哈希
set。 - LinkedHashSet(int initialCapacity, float loadFactor):
构造一个带有指定初始容量和加载因子的新空链接哈希 set。
LinkedHashSet的遍历
package demo4;
import java.util.LinkedHashSet;
public class Test4 {
public static void main(String[] args) {
LinkedHashSet<Integer> lh=new LinkedHashSet<>();
lh.add(10);
lh.add(30);
lh.add(20);
lh.add(10);
lh.add(30);
lh.add(50);
for(Integer i:lh){
System.out.println(i);
}
}
}
运行结果:
10
30
20
50
TreeSet
TreeSet集合的特点: 元素唯一,并且可以自定义对元素进行排序
TreeSet底层存储采用二叉树的结构,当存入的值比本节点小时,放到左边位置;比本节点大时,放到右边位置;和本节点相同时,丢掉。依次类推,我们得到的最后结果就是有序且唯一啦。
- add(E e):添加元素
- addAll(Collection<? extends E> c) :将c集合中的所有元素添加到本集合中
- ceiling(E e) : 返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null。
- clear():清空元素
- comparator():比较器,排序必须要有的一个方法
- contains(Object o):判断本集合是否含有元素o,含有返回true,否则返回false
- first():返回此集合中当前第一个元素
- floor(E e) :返回此 集合 中小于等于给定元素的最大元素isEmpty() :判断集合是否为空
- iterator() :产生迭代器
- last():返回此集合中最后一个元素
- remove(Object o):删除本集合中元素o
- size() :返回本集合中元素的个数
排序方式:
- 自然排序:使用TreeSet集合进行元素的自然排序,那么对元素有要求,要求这个元素必须实现Comparable接口,否则无法进行自然排序
package demo5;
public class Student implements Comparable<Student> {
String name;
int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", 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 int compareTo(Student s) {
if(this.getName().length()-s.getName().length()>=0){//按照年龄长度排序
return 1;
}else {
return -1;
}
}
}
package demo5;
import java.util.TreeSet;
//treeSet:年龄排序,用年龄大小排
//自然排序
public class Test {
public static void main(String[] args) {
TreeSet <Student>ts=new TreeSet<>();
Student s1=new Student("张三",31);
Student s2=new Student("李四",33);
Student s3=new Student("呼延王五",23);
Student s4=new Student("阿三的小猫咪",13);
Student s5=new Student("张三",31);//注:虽然两个张三名字相同,但都是new出来的对象,地址值不同,所以不会覆盖
Student s6=new Student("武大大大",63);
Student s7=new Student("赵恒之",33);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
ts.add(s7);
for (Student s:ts){
System.out.println(s.toString());
}
}
}
运行结果:
Student{name='张三', age=31}
Student{name='李四', age=33}
Student{name='张三', age=31}
Student{name='赵恒之', age=33}
Student{name='呼延王五', age=23}
Student{name='武大大大', age=63}
Student{name='阿三的小猫咪', age=13}
- 使用比较器排序
注:本测试按照年龄进行排序。其学生对象和上个代码中的学生对象基本相同,就是少了Comparable接口,没有重写compareTo方法
package demo6;
import java.util.Comparator;
public class MyComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
int num1=o1.getAge()-o2.getAge();//根据年龄从小到大进行排序
int num2=num1==0? o1.getName().compareTo(o2.getName()):num1;//要是年龄相同,比较姓名,姓名也相同的话,视为同一个人。姓名不同的话,按照录入顺序排序
return num2;
}
}
package demo6;
import java.util.TreeSet;
//比较器排序
public class Test {
public static void main(String[] args) {
MyComparator mc = new MyComparator();
TreeSet<Student>ts=new TreeSet<>(mc);
ts.add(new Student("张三55555", 23));
ts.add(new Student("王菲444", 23));
ts.add(new Student("李四8888888888888888888", 20));
ts.add(new Student("钟楚红", 18));
ts.add(new Student("张曼玉444", 25));
ts.add(new Student("王祖贤7777", 36));
ts.add(new Student("刘德华", 26));
ts.add(new Student("赵六", 27));
ts.add(new Student("赵六", 26));
ts.add(new Student("赵六", 26));
ts.add(new Student("老王", 27));
for (Student s:ts){
System.out.println(s.getName()+"\t"+s.getAge());
}
}
}
运行结果:
钟楚红 18
李四8888888888888888888 20
张三55555 23
王菲444 23
张曼玉444 25
刘德华 26
赵六 26
老王 27
赵六 27
王祖贤7777 36