关系图(引用别人的图,觉得特别好,就放这了)
上篇简单概述了一下Java集合框架以及List集合和它的几个实现类
本文接着上文来进行
Set(跟 List 一样,Set 是 Collection 的子接口,Set 集合是以散列的形式存储数据,所以元素是没有顺序的,可以存储一组无序且唯一的数据。)
Set 常用实现类:
1. HashSet (可以存储一组无序且唯一的元素)
测试加实际应用
public class Test {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("Hello");
set.add("World");
set.add("Java");
set.add("Hello");
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
set.remove("World");
System.out.println("****************");
iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
2. LinkedHashSet(可以存储一组有序且唯一的元素)
测试加实际应用
import java.util.Iterator;
import java.util.LinkedHashSet;
public class Test {
public static void main(String[] args) {
LinkedHashSet linkedHashSet = new LinkedHashSet();
linkedHashSet.add("Hello");
linkedHashSet.add("World");
linkedHashSet.add("Java");
linkedHashSet.add("Hello");
System.out.println("LinkedHashSet的长度是"+linkedHashSet.size());
System.out.println("遍历LinkedHashSet");
Iterator iterator = linkedHashSet.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
linkedHashSet.remove("Java");
System.out.println(linkedHashSet.contains("Java"));
}
}
3. TreeSet
测试加实际应用
import java.util.Iterator;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
TreeSet treeSet = new TreeSet();
treeSet.add(new Data(1));
treeSet.add(new Data(3));
treeSet.add(new Data(6));
treeSet.add(new Data(2));
treeSet.add(new Data(5));
treeSet.add(new Data(4));
treeSet.add(new Data(1));
System.out.println("treeSet的长度"+treeSet.size());
System.out.println("treeSet遍历");
Iterator iterator = treeSet.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
class Data implements Comparable{
private int num;
public Data(int num) {
this.num = num;
}
/**
* A.compareTo(B)
* 返回值:
* 1 表示A大于B
* 0 表示A等于B
* -1 表示A小于B
* @param o
* @return
*/
@Override
public int compareTo(Object o) {
if(o instanceof Data){
Data data = (Data) o;
if(this.num < data.num){
return 1;
}else if(this.num == data.num){
return 0;
}else{
return -1;
}
}
return 0;
}
@Override
public String toString() {
return "Data{" +
"num=" + num +
'}';
}
}
总结:
重点来了!!!:
1. LinkedHashSet 如何判断两个对象是否相等?
首先会判断两个对象的 hashCode 是否相等
什么是 hashCode?
将对象的内部信息(内存地址、属性值等),通过某种特定规则转换成一个散列值,就是该对象的 hashCode。
-
两个不同对象的 hashCode 值可能相等。
-
hashCode 不相等的两个对象一定不是同一个对象。
集合在判断两个对象是否相等的时候,会先比较他们的 hashCode,如果 hashCode 不相等,则认为不是同一个对象,可以添加。
如果 hashCode 值相等,还不能认为两个对象是相等的,需要通过 equals 进行进一步的判断,equals 相等,则两个对象相等,否则两个对象不相等。
2 . LinkedHashSet 和 TreeSet 都是存储一组有序且唯一的数据,但是这里的两个有序是有区别的:
LinkedHashSet 的有序是指元素的存储顺序和遍历顺序是一致的。
TreeSet 的有序是指集合内部会自动对所有的元素按照升序进行排列,无论存入的顺序是什么,遍历的时候一定按照顺序输出。
欢迎志同道合的朋友关注公众号,我希望关注我的公众号不仅仅是关注,而是热爱编程,有求知的心理,遇到有什么问题可以留言。