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);
	}
}

三,TreeSet:
能够对自然数排序,集合里必须加的是同一种数据类型,才能进行比较。
在这里插入图片描述
不但对数字可以排序,对字符,字符串也可以排序,但是一定要是同一数据类型的。且也数据不能重复,一旦重复,也会进行比较,相同的元素只进去一遍。

comparable :已有的类已经实现了这个接口,所以已有的类进在TreeSet中可以直接排序。但是对于自己写的类,需要重写Comparable。是在你要排序的类中去实现comparable接口,也就是说你得在你要排序的类中先写一个方法用来声明你想让你类中的属性根据什么规则来排序。

compareTo() 方法用于将 Number 对象与方法的参数进行比较。可用于比较 Byte, Long, Integer等。
该方法用于两个相同数据类型的比较,两个不同类型的数据不能用此方法来比较。

案例:

package 集合;

import java.util.TreeSet;
class Person implements Comparable{
	String name;
	int age;
	//**************************************
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	@Override
	//***************************************
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	@Override
	//*******************************************
	//*实现Comparable接口后重写compareTo方法
	public int compareTo(Object o) {
		Person p1=null;//p1需要被初始化
		if(o instanceof Person){
			p1=(Person)o;//p1向下强转为Person类型
		}
		int t=new Integer(this.age).compareTo(p1.age);
		//先以年龄排序
		if(t==0){
			return this.name.compareTo(p1.name);
			//如果年龄相同,再以名字排序
		}
		return t;
		//返回类型有3种
		/*
		 * 大于0表示当前对象比比较对象大
		 * 小于 0表示当前对象比比较对象小
		 * 等于0表示当前对象和比较对象一样大
		 * */
	}
}
//**************************************************
public class Test {
	public static void main(String[] args) {
		TreeSet st=new TreeSet();
		Person p1=new Person("王五",18);
		Person p2=new Person("赵六",18);
		st.add(p1);
		st.add(p2);
		System.out.println(st);
	}
}

注意:

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。也就是他的作用是向下转型的时候先试水的,如果符合,就向下转型,不然就返回false。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值