java035:Set接口及其子类集合

一,Set:存储无顺序,元素不能重复
在这里插入图片描述
为什么它里面的元素不能重复?如上图,当集合放进元素3的时候直接放进去,但是放元素2的时候,要和集合里面的元素3比较,如果相同,就不再放进去了,如果不同就放进去,所以里面放的元素越多,比较的次数也就越多,存放也就越慢。
在这里插入图片描述
所以我们可以很方便的判断一个字符串中有多少种字符?

import java.util.HashSet;
import java.util.Set;
public class Test {
	public static void main(String[] args) {
		String str="abcdadchgsnjsaahsgdjb";
		Set s=new HashSet();
		for (int i = 0; i <str.length(); i++) {
			s.add(str.charAt(i));
		}
		System.out.println(s.size());
}
}

二,HashSet:底层采用Hash算法,增删效率高,查询效率也高,但是占用空间大(开辟的对内存空间大)
Hash码的作用就是用来减少比较次数的!
他是如何减少比较次数的?如下图:如果元素的HashCode码不一样,会在堆内存里面重新开辟空间来存放元素,如果他们的HashCode码一样,像1和6,则会进入同一个空间,后面进来的和前面的比较,如果相同,则不会写入到集合,如果不同,则会写入到集合里面,这样可以减少比较次数。
在这里插入图片描述
Hash码:每个对象都有一个Hash码,这个hash码就是每一个对象的内存地址换算出来的一个数字。
注意:hashCode一样,不一定是同一个对象。hashCode不一样,肯定不是同一个对象
比如:(a ,2)和(b ,1)的HashCode就一样,但不是同一个对象。
instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
自定义一个HashSet

package 集合;
import java.util.HashSet;
import java.util.Set;
class Person{
	String name;
	int age;
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	//**********************************************
	//*********重写hashcode,String属性的内存地址加上age的属性值,把它定义成
	//hashCode
	public int hashCode() {
		return this.name.hashCode()+this.age;
	}
	//*********************************************
	//**************判断值是否相同.instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。
	//instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
	public boolean equals(Object obj) {
		Person p1=null;
		if(obj instanceof Person){
			p1=(Person)obj;
		}
		return this.name.equals(p1.name)&&this.age==p1.age;//this代表p2
	}
	//***********************************************
	//*****************重写tostring
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
public class Test {
	public static void main(String[] args) {
		Set s=new HashSet();
		Person p1=new Person("a",2);
		Person p2=new Person("b",1);
		s.add(p1);
		s.add(p2);
		System.out.println(s);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44699728/article/details/90034667
今日推荐