Set集合特点:
package 集合进阶.Collection单列.Set;
import java.util.HashSet;
import java.util.Set;
/*
Set集合特点:
不包含重复元素集合
无序输出
没有带索引的方法,所以不能使用普通for遍历
*/
public class Set集合特点 {
public static void main(String[] args) {
//创建集合对象
Set<String> set = new HashSet<String>();
//添加元素
set.add("hello");
set.add("world");
set.add("java");
set.add("hello");
//遍历
for (String s : set) {
System.out.println(s);
}
}
}
HashSet集合概述和特点:
package 集合进阶.Collection单列.Set;
import java.util.HashSet;
/*
hashSet集合特点:
底层数据结构是哈希表
对集合的迭代顺序不做任何保证,也就是说不保证存储和取出的元素顺序一致
没有带索引的方法,不能用普通for遍历
由于是Set集合,所以不包含重复元素的集合
*/
//存储字符串并遍历
public class HashSet集合概述和特点 {
public static void main(String[] args) {
//创建集合对象
HashSet<String> hs = new HashSet<String>();
//添加元素
hs.add("hello");
hs.add("world");
hs.add("java");
//遍历
for (String s : hs){
System.out.println(s);
}
}
}
TreeSet集合概述和特点:
package 集合进阶.Collection单列.Set;
/*
TreeSet集合特点:
1.元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序取决于构造方法
TreeSet():根据其元素的自然排序进行排序
TreeSet(Comparator comparator):根据指定的比较器进行排序
2.没有索引的方法,不能使用普通for遍历
3.由于Set集合,所以不包含重复元素集合
*/
//存储整数并遍历
import java.util.TreeSet;
public class TreeSet集合概述和特点 {
public static void main(String[] args) {
//创建集合对象
// <>里面要用引用类型因为int为基本类型
//他的引用类型为包装类integer
TreeSet<Integer> ts = new TreeSet<Integer>();
//添加元素
ts.add(10);
ts.add(40);
ts.add(30);
ts.add(50);
ts.add(20);
ts.add(30);
//遍历集合
for (Integer i :ts){
System.out.println(i);
}
}
}
LinkedHashSet集合特点:
package 集合进阶.Collection单列.Set;
import java.util.LinkedHashSet;
/*
LinkedHashSet集合特点:
哈希表和链表实现的Set接口,具有可预测的迭代次序。
由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
由哈希表保证元素唯一,没有重复元素
*/
//存储字符串并遍历
public class LinkedHashSet集合概述和特点 {
public static void main(String[] args) {
//创建集合对象
LinkedHashSet<String> LinkedHashSet=new LinkedHashSet<String>();
//添加元素
LinkedHashSet.add("hello");
LinkedHashSet.add("world");
LinkedHashSet.add("java");
LinkedHashSet.add("world");
//遍历集合
for (String s : LinkedHashSet){
System.out.println(s);
}
}
}
案例
不重复的随机数:
package 集合进阶.Collection单列.Set;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
/*
需求:
编写一个程序,获取10个1-20之间的随机数,要求不能重复
思路:
创建set集合对象
创建随机数对象
判断集合的长度小于10
是,产生一个随机数,添加到集合
重复
遍历集合
*/
public class 不重复的随机数 {
public static void main(String[] args) {
//创建set集合对象
// Set<Integer> set = new HashSet<Integer>();//无序
Set<Integer> set = new TreeSet<Integer>();//有序
//创建随机数对象
Random rand = new Random();
//判断集合的长度小于10
while(set.size()<10){
int number = rand.nextInt(20)+1;
set.add(number);
}
//遍历集合
for(Integer i : set){
System.out.println(i);
}
}
}
哈希值:
package 集合进阶.Collection单列.Set.哈希值;
public class Student {
String name;
int age;
public Student() {
}
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;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/*
@Override
public int hashCode() {
return 0;
}*/
}
package 集合进阶.Collection单列.Set.哈希值;
/*
哈希值:
是JDK根据对象的地址或者字符串或数字算出来的int类型的数值
Object类中有一个方法可以获取对象的哈希值
public int hashCode():返回对象的哈希码值
*/
public class HashDemo {
public static void main(String[] args) {
//创建学生对象
Student s1=new Student("程序员",20);
//同一个对象多次调用hashCode()方法返回的哈希值是相同的
System.out.println(s1.hashCode());//1060830840
System.out.println(s1.hashCode());//1060830840
Student s2 = new Student("架构师",30);
//默认情况下,不同对象的哈希值是不同的
//通过方法重写,可以实现不同对象的哈希值相同
System.out.println(s2.hashCode());//2137211482
//不同对象哈希值相同,说明字符串重写了hashCode()方法
System.out.println("hello".hashCode());//99162322
System.out.println("world".hashCode());//113318802
System.out.println("java".hashCode());//3254818
System.out.println("world".hashCode());//113318802
System.out.println("重地".hashCode());//1179395
System.out.println("通话".hashCode());//1179395
}
}
Comparable.自然排序:
package 集合进阶.Collection单列.Set.Comparable.自然排序;
public class Student implements Comparable<Student>{
String name;
int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Student s) {
// return 0;
// return 1;
// return -1;
//按年龄大小排序
int num=this.age-s.age;//从小到大
// int num=s.age-this.age;//从大到小
//年龄相同时,按照姓名的字母顺序排序
int num2=num==0?this.name.compareTo(s.name):num;
return num2;
}
}
package 集合进阶.Collection单列.Set.Comparable.自然排序;
/*
自然排序Comparable的使用
存储学生对象并遍历,创建TreeSet集合使用无参构造方法
要求:按年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论:
用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
自然排序,就是让元素所属的类实现Comparable接口,重写comparableTo(To)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
*/
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
//创建集合对象
TreeSet<Student> ts=new TreeSet<Student>();
//创建学生对象
Student s1=new Student("xishi",29);
Student s2=new Student("wangzhaojun",28);
Student s3=new Student("diaochan",30);
Student s4=new Student("yangyuhuan",33);
Student s5=new Student("linqingxia",33);
Student s6=new Student("linqingxia",33);
//添加学生对象到集合
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
//遍历结合
for (Student s : ts) {
System.out.println(s.getName()+","+s.getAge());
}
}
}
Comparable.比较器:
package 集合进阶.Collection单列.Set.Comparable.比较器;
public class Student {
String name;
int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package 集合进阶.Collection单列.Set.Comparable.比较器;
/*
比较器Comparable的使用
存储学生对象并遍历,创建TreeSet集合使用带参构造
要求:按年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论:
用TreeSet集合存储自定义对象,有参构造方法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接收Comparable的实现类对象,重写compare(To1,To2)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
*/
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
//创建集合对象
TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//this.age-s.sge
//s1,s2
int num=s1.getAge()-s2.getAge();
int num2=num==0?s1.getName().compareTo(s2.getName()) :num;
return num2;
}
});
//创建学生对象
Student s1=new Student("xishi",29);
Student s2=new Student("wangzhaojun",28);
Student s3=new Student("diaochan",30);
Student s4=new Student("yangyuhuan",33);
Student s5=new Student("linqingxia",33);
Student s6=new Student("linqingxia",33);
//添加学生对象到集合
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
//遍历结合
for (Student s : ts) {
System.out.println(s.getName()+","+s.getAge());
}
}
}