java集合之set知识点梳理

2.4.Set
Set:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素
用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。
对象的相等性
引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用hashCode方法,会得到相同的结果,如果对象所属的类没有覆盖Object的hashCode方法的话,hashCode会返回每个对象特有的序号(java是依据对象的内存地址计算出的此序号),所以两个不同的对象的hashCode值是不可能相等的。
如果想要让两个不同的Person对象视为相等的,就必须覆盖Object继下来的hashCode方法和equals方法,因为Object hashCode方法返回的是该对象的内存地址,所以必须重写hashCode方法,才能保证两个不同的对象具有相同的hashCode,同时也需要两个不同对象比较equals方法会返回true
该集合中没有特有的方法,直接继承自Collection。
—| Itreable 接口 实现该接口可以使用增强for循环
—| Collection 描述所有集合共性的接口
—| List接口 可以有重复元素的集合
—| ArrayList
—| LinkedList
—| Set接口 不可以有重复元素的集合
案例:set集合添加元素并使用迭代器迭代元素。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Demo4 {
public static void main(String[] args) {
//Set 集合存和取的顺序不一致。
Set hs = new HashSet();
hs.add(“世界军事”);
hs.add(“兵器知识”);
hs.add(“舰船知识”);
hs.add(“汉和防务”);
System.out.println(hs);
// [舰船知识, 世界军事, 兵器知识, 汉和防务]
Iterator it = hs.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}

2.4.1.HashSet
—| Itreable 接口 实现该接口可以使用增强for循环
—| Collection 描述所有集合共性的接口
—| List接口 可以有重复元素的集合
—| ArrayList
—| LinkedList
—| Set接口 不可以有重复元素的集合
—| HashSet 线程不安全,存取速度快。底层是以哈希表实现的。

注意:HashSet集合在判断元素是否相同先判断hashCode方法,如果相同才会判断equals。如果不相同,是不会调用equals方法的。

HashSet 和ArrayList集合都有判断元素是否相同的方法,
boolean contains(Object o)
HashSet使用hashCode和equals方法,ArrayList使用了equals方法

练习:使用HashSet存储字符串,并尝试添加重复字符串
回顾String类的equals()、hashCode()两个方法。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Demo4 {
public static void main(String[] args) {
// Set 集合存和取的顺序不一致。
Set hs = new HashSet();
hs.add(“世界军事”);
hs.add(“兵器知识”);
hs.add(“舰船知识”);
hs.add(“汉和防务”);

	// 返回此 set 中的元素的数量
	System.out.println(hs.size()); // 4

	// 如果此 set 尚未包含指定元素,则返回 true
	boolean add = hs.add("世界军事"); // false
	System.out.println(add);

	// 返回此 set 中的元素的数量
	System.out.println(hs.size());// 4
	Iterator it = hs.iterator();
	while (it.hasNext()) {
		System.out.println(it.next());
	}
}

}

  使用HashSet存储自定义对象,并尝试添加重复对象(对象的重复的判定)

package cn.itcast.gz.map;

import java.util.HashSet;
import java.util.Iterator;

public class Demo4 {
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add(new Person(“jack”, 20));
hs.add(new Person(“rose”, 20));
hs.add(new Person(“hmm”, 20));
hs.add(new Person(“lilei”, 20));
hs.add(new Person(“jack”, 20));

	Iterator it = hs.iterator();
	while (it.hasNext()) {
		Object next = it.next();
		System.out.println(next);
	}
}

}

class Person {
private String name;
private int age;

Person() {

}

public Person(String name, int age) {

	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
public int hashCode() {
	System.out.println("hashCode:" + this.name);
	return this.name.hashCode() + age * 37;
}

@Override
public boolean equals(Object obj) {
	System.out.println(this + "---equals---" + obj);
	if (obj instanceof Person) {
		Person p = (Person) obj;
		return this.name.equals(p.name) && this.age == p.age;
	} else {
		return false;
	}
}

@Override
public String toString() {

	return "Person@name:" + this.name + " age:" + this.age;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值