一.HashSet
1.Set集合
*一个不包含重复元素的 collection,且无顺序
2.HashSet存储自定义对象保证元素唯一性
public class temp2 {
public static void main(String[] args) {
HashSet<String> sSet = new HashSet<>();
sSet.add("a");
sSet.add("b");
sSet.add("a");
System.out.println(sSet);
}
}
// b a
3.HashSet如何保证元素唯一性的原理
a.HashSet原理
* 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数 * 当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象 如果没有哈希值相同的对象就直接存入集合 如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存
b.将自定义类的对象存入HashSet去重复
* 类中必须重写hashCode()和equals()方法 * hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率) * equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储
4.LinkedHashSet的概述和使用
5.练习题
- a.产生10个1-20之间的随机数要求随机数不能重复
- b.用Scanner从键盘读取一行输入,去掉其中重复字符
/*使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符
* aaaabbbcccddd
*/
public class Temp7 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一行字符:");
String string = scanner.nextLine();
char[] cs = string.toCharArray();
Set<Character> cSet = new HashSet<Character>();
for (Character character : cs) {
cSet.add(character);
}
System.out.println(cSet);
}
}
- c.将集合中的重复元素去掉
public class Temp {
/*
* 将集合中的重复元素去掉
*/
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(4);
list.add(5);
list.add(45);
list.add(4);
list.add(45);
System.out.println(list);
Set<Integer> set = new HashSet<>();
set.addAll(list);
list.clear();
list.addAll(set);
System.out.println(list);
}
}
二.TreeSet
1概念
*使用元素的自然顺序(Comparable接口)对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
2.TreeSet存储自定义对象
//创建Person对象,并实现Comparable接口
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.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
//参数p为已创建的Person对象
public int compareTo(Person p) {
// 比较名字,即比较字符串
// return this.name.compareTo(p.name);
// 比较年龄
// return this.age - p.age;
// 按照姓名的长度排序
return this.name.length() - p.name.length();
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class Temp12 {
public static void main(String[] args) {
TreeSet<Person> tSet = new TreeSet<>();
tSet.add(new Person("ass", 23));
tSet.add(new Person("ds", 13));
tSet.add(new Person("essss", 21));
tSet.add(new Person("bsss", 17));
List<Person> list = new ArrayList<>();
list.addAll(tSet);
for (Person person : list) {
System.out.println(person);
}
}
}
3.TreeSet保证元素唯一和比较器排序的原理及代码实现)
4.TreeSet原理
a.特点
* TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
b.使用方式
- 自然顺序(Comparable)
- TreeSet类的add()方法中会把存入的对象提升为Comparable类型
- 调用对象的compareTo()方法和集合中的对象比较
- 根据compareTo()方法返回的结果进行存储
- 比较器顺序(Comparator)
- 创建TreeSet的时候可以制定 一个Comparator
- 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
- add()方法内部会自动调用Comparator接口中compare()方法排序
- 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
- 两种方式的区别
- TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
- TreeSet如果传入Comparator, 就优先按照Comparator
- 自然顺序(Comparable)
5.集合框架练习
- a.在一个集合中存储了无序并且重复的字符串,定义一个方法,让其有序(字典顺序),而且还不能去除重复
- b.从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt
- c.程序启动后, 可以从键盘输入接收多个整数, 直到输入quit时结束输入. 把所有输入的整数倒序排列打印.
- d.键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。
6.List,Map总结
- List
- a.普通for循环, 使用get()逐个获取
- b.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
- c.增强for循环, 只要可以使用Iterator的类都可以用
- d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
- Set
- a.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
- b.增强for循环, 只要可以使用Iterator的类都可以用
- 普通for循环,迭代器,增强for循环是否可以在遍历的过程中删除