目录
思维导图
一、1.set集合特点&遍历方式
特点:
set集合的特点:
不重复:基本数据类型&&String
无序遍历方式是foreach和迭代器
package com.wyy.set;
import java.util.HashSet;
import java.util.Iterator;
/**
* set集合的特点:
* 不重复:基本数据类型&&String
* 无序
* @author Administrator
*
*/
public class Demo1 {
public static void main(String[] args) {
HashSet<Object> set = new HashSet<>();
set.add("zs");
set.add("ls");
set.add("ww");
set.add("老六");
set.add("ls");
System.out.println(set.size());
System.out.println("==========增加for=============");
for (Object obj : set) {
System.out.println(obj);
}
System.out.println("=======迭代器==========");
Iterator<Object> it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
二、set集合去重原理
原理:
* set底层去重原理
* 1.set去重底层原理是与对象的hashCode以及equals方法相关
* 2.判断重复元素的时候,是比较hashcode值,在调用equals比较内容
package com.wyy.set;
import java.util.HashSet;
/**
* set底层去重原理
* 1.set去重底层原理是与对象的hashCode以及equals方法相关
* 2.判断重复元素的时候,是比较hashcode值,在调用equals比较内容
*
*
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) {
HashSet<Object> set = new HashSet<>();
set.add(new Person("zs", 18));
set.add(new Person("ls", 23));//distrinct
set.add(new Person("ww", 43));
set.add(new Person("老六", 13));
set.add(new Person("zs", 18));
System.out.println(set.size());
}
}
class Person /*implements Comparable<Person>*/{
private String name;
private int age;
private int level;
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 int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(String name, int age, int level) {
super();
this.name = name;
this.age = age;
this.level = level;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", level=" + level + "]";
}
@Override
public int hashCode() {
System.out.println("=========hashCode==========");
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return 1;
}
@Override
public boolean equals(Object obj) {
System.out.println("========equals===========");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
当我们把equals判断注释掉后,案例如下:
package com.wyy.set;
import java.util.HashSet;
/**
* set底层去重原理
* 1.set去重底层原理是与对象的hashCode以及equals方法相关
* 2.判断重复元素的时候,是比较hashcode值,在调用equals比较内容
*
*
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) {
HashSet<Object> set = new HashSet<>();
set.add(new Person("zs", 18));
set.add(new Person("ls", 23));//distrinct
set.add(new Person("ww", 43));
set.add(new Person("老六", 13));
set.add(new Person("zs", 18));
System.out.println(set.size());
}
}
class Person /*implements Comparable<Person>*/{
private String name;
private int age;
private int level;
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 int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(String name, int age, int level) {
super();
this.name = name;
this.age = age;
this.level = level;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", level=" + level + "]";
}
@Override
public int hashCode() {
System.out.println("=========hashCode==========");
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return 1;
}
@Override
public boolean equals(Object obj) {
System.out.println("========equals===========");
// if (this == obj)
// return true;
// if (obj == null)
// return false;
// if (getClass() != obj.getClass())
// return false;
// Person other = (Person) obj;
// if (age != other.age)
// return false;
// if (name == null) {
// if (other.name != null)
// return false;
// } else if (!name.equals(other.name))
// return false;
return true;
}
}
先调用hashcode值,若hashcode值相等,就去调equals值
若hashcode不相等,就不equals方法了
三、set集合自然排序接口
* 现象:
* 1.String默认是能够排序
* 2.自定义的对象无法排序、报类型转换异常
package com.heminjie.set;
import java.util.Comparator;
import java.util.TreeSet;
/**
* set集合排序
* java.lang.Comparable 自然排序 排序的规则是单一的,不能够应对复杂的变化需求
* Java.util.comparator;比较级排序
* @author Administrator
*
*/
public class Demo3 {
public static void main(String[] args) {
/**
* 现象:
* 1.String默认是能够排序
* 2.自定义的对象无法排序、报类型转换异常
*/
// Exception in thread "main" java.lang.ClassCastException:
// com.heminjie.set.Person cannot be cast to java.lang.Comparable
TreeSet set = new TreeSet<>();
set.add(new Person("zs", 18,1));
set.add(new Person("ls", 24,4));
set.add(new Person("ww", 26,2));
set.add(new Person("laoliu", 20,3));
set.add(new Person("bajie", 18,3));
for (Object obj : set) {
System.out.println(obj);
}
}
}
* 1.String默认是能够排序
* 2.自定义的对象无法排序、报类型转换异常* java.lang.Comparable 自然排序 排序的规则是单一的,不能够应对复杂的变化需求