set体系:
无序 唯一.
HasSet :
Set集合 无索引 不可以重复. 存取的位置不一致
HashSet<String> hs = new HashSet<>)();
boolean b1 = hs.add("a");
boolean b2 = hs.add("a");
hs.add("b");
hs.add("c");
hs.add("d");
System.out.println(hs); //哈洗塞得 继承体系中有重写toString方法
System.out.println(b1);
System.out.println(b2);
for(String string : hs)
Sysytem.out.println(string)
HasSet 是如何保证唯一性的?:
依赖两个方法:重写equals() 和 hascold()
实际开发中,这两个方法不用我们自己写就自动生成即可.
为什么hashCode() 方法的规则写的这么复杂?
因为我们知道不同的对象的哈希值一般不同,
所以哈希值不一样的对象肯定是不同的对象
没必要在去equals 方法比较对象的属性,这样做就可以提高效率
总结:记忆
hashSet 保证元素唯一性依赖: hashCode() 和equals()方法 如果是hashSet存储对象
必须重写这俩个方法
理解.看源码.我们发现HashSet类的add方法.决定是否添加元素依赖的是以下这个判断
步骤?:1, 判断要添加的元素和集合中遍历到的当前元素的哈希值是否相同
如果相同: 说明这两个对象有可能一样 接着判断
如果不同: 说名这两个对象肯定不是同一个对象,直接添加
2,判断两个对象的地址值是否相等
如果相等: 说明两个对象是同一个对象不添加.
如果不等:说明两个对象有可能不是同一个对象.紧接着一次比较对象的个个属性值就可以了
3,调用equals 方法比较对象的各个属性值
HashSet<Person> hs = new HashSet<>()
hs.add(new Person("张散",23))
hs.add(new Person("撒的",23))
hs.add(new Person("散发的复苏",23))
hs.add(new Person("俄方的",23))
hs.add(new Person("松岛枫",23))
hs.add(new Person("果然",23))
System.out.println(hs.size());
System.out.println(hs);
LinkedHashSet:
底层是链表实现的 具有唯一性 唯一一个有序 是set集合中唯一一个能保证怎么存就怎么取的集合对象
因为是HashSet的子类 也是保证元素唯一的 与HashSet的原理一样
LiinkedHashSet<String> lhs = new LinkedHashSet<>()
lhs.add("a");
lhs.add("a");
lhs.add("a");
lhs.add("a");
lhs.add("a");
System.out.println(lhs);
练习题:
编写一个程序, 获取10个1-20的随机数 要求随机数不能重复 并把最终的随机数输出到控制台
分析: 有Random类 创建随机数对象
需要存储10个随机数 而且不能重复 用HashSet集合
如果HashSet的size是小于10就可以不断的存储 如果大于等于10就停止存储
通过Random类中的nextInt(n)方法 获取1-20之间的随机数 并将这些随机数存储在HashSet集合中 遍历HashSet
Random r = new Random();
HashSet<integer> hs = new HashSet<>();
while(hs.size()< 10)
hs.add(r.nextInt(20) + 1)
for(integer integer : hs)
System.out.println(integer);
思考:使用Scanner从键盘读取一行输入 打印出不同的字符
思路:1,创建Scanner 接受用户输入内容,
2,因为要去重,用HashSet来存
3,把字符串转成字符数组
4,遍历字符数组,把里边的元素一次添加到集合中
5,遍历集合.
Scanner sc = new Scanner(System.in)
System.out.println("请输入一航字符串");
HashSet<Character> hs = new HasSet<>()
String line = sc.nextLine();
char[] arr = line.toCharArray();
for(char c : arr)
hs.add(c);
for(Character ch : hs)
System.out.println(ch)
以知:ArrayList(String) list = new ArrayList<>();
list.add("a")
list.add("a")
list.add("a")
list.add("b")
list.add("b")
list.add("b")
list.add("b")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
如果去除其中的重复元素.
分析:创建一个List集合 存储若干个重复元素
单独定义方法去除重复
在打印List集合
ArrayList<String> list = new ArrayLIst<>();
list.add("a")
list.add("a")
list.add("a")
list.add("b")
list.add("b")
list.add("b")
list.add("b")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
getSingle(list);
System.out.println(list);
方法:去除list集合中的重复元素
1,创建一个LinkedHashSet集合
2,将List集合中的所有元素添加到LinkedHashSet集合
3,将list集合中的元素清除 ,在把LinkedHashSet集合中的元素添加回List集合中
public static void getSingle(List<String>list)
LinkedHashSet<String> lhs = new LinkedHashSet<>();
lhs.addAll(list);
list.clear();
list.addArr(lhs);
TreeSet是怎么保证元素唯一性的:
是用来对元素进行排序的 同样也可以保证元素唯一
让基本类去实现ComParable 然后重写接口中的comPareTo方法
comPareTo方法反悔值是一个int类型
当comPareTo方法反悔0的时候值有一个元素
当comPareTo方法反悔正数的时候集合会怎么存就怎么取 (元素往右放)
当comPareTo方法反悔的负数时候集合会倒叙存储 (元素往左放)
用TreeSet 排序的时候注意事项
一定要分析清楚什么是主要条件 什么是次要条件.
掌握.如果是升序(从小到大)排列就是this. - p.
如果是降序(从大到小) 排列:就是p. - this .
简单记忆, 前-后 就是从小到大. 后-前就是从大到小
TreeSet(Interger) ts = new TreeSet<>()
ts.add(1);
ts.add(1);
ts.add(2);
ts.add(2);
ts.add(3);
ts.add(3);
System.out.println(ts);
implements Comparable
TreeSet(Person> ts = new TreeSet<>();
ts.add(new Person("张散",22));
ts.add(new Person("张散的",22));
ts.add(new Person("张散是",22));
ts.add(new Person("张散发",22));
ts.add(new Person("张散去",22));
System.out.println(ts)
年龄排序:int num = this.age - o.age;
return num == 0 ? this.name.comPareTo(o.name) :num
TreeSet(Person> ts = new TreeSet<>();
ts.add(new Person("张散",223));
ts.add(new Person("张散的",222));
ts.add(new Person("张散是",122));
ts.add(new Person("张散发",2232));
ts.add(new Person("张散去",2442));
system.out.println(ts);
System.out.println('张'+0);
System.out.println('张'+0);
System.out.println('张'+0);
System.out.println('张'+0);
姓名排序:int num = this.name.comPareTo(o.name);
return num == 0? this .age - o.age :num
int result = this.name .length() - p.name.length();// 安姓名长度排
result =(result == 0 ) ? this.name.compareTo(p.name) :result// 长度一样,按照姓名的内容排
result = (result == 0 )? this.age - p.age :result ;// 姓名的长度 内容都一样 按照年龄排
return result;
需求:将字符串按照长度排序
TreeSet<String> ts = new TreeSet<>(new CompareBylen(){
});//comparator c = new comparator
ts.add("aaaaaaaa");
ts.add("z");
ts.add("wc");
ts.add("nba");
ts.add("cba");
System.out.println(ts);
第二种方式:
创建TreeSet集合对象的时候 传一个比较器借口的 子类对象进来.
class CompareBylen implements Comparator<String>
public int compare(String s1 , String s2)//按照字符串长度比较
int num = s1.length() - s2.length(); //长度为主要条件
return num == 0 ? s1.compareTo(s2) : num;//内容为次要条件
注意:
1,如果创建TreeSet集合的时候传入了比较起接口对象,并且基本类也实现了Comparable 接口
那么排序的规则有限使用比较器传入的比较器
简单既.
如果两种排序方式都有 优先使用集合自带的比较器
在次提示. 一定要记住.什么是主要什么是次要
TreeSet的原理:
TreeSet是用来排序的.可以指定一个顺序,.对象存入之后会按照指定的顺序排列
|