java中的Set集合与Map集合

71 阅读3分钟

一、Set集合(单列)

特点

	1.去重
	2.存取顺序不一致
	3.没有索引概念

二、TreeSet集合

特点

	除了拥有其父类Set的特点之外,还能够排序
	使用的时候一定要指定排序规则

排序规则的指定

	排序返回值
		为负则存左边
		为正存右边
		为0代表元素重复,不存

实现排序的方法

	法1:实现comparable接口,并重写接口的compareTo方法
	法2:构造参数传入比较器排序
	两种排序使用原则
		对于自定义的类,优先使用比较器排序
		已经有默认的Comparable接口排序,但不满足排序需求,则需要使用比较器排序
                    

三.HashSet集合

特点

	1.保证元素不重复
	2.不保证元素顺序

LinkedHashSet

特点

		1.不重复
		2.存取有序
                    

四、HashMap(双列集合)

特点

	父类Map<K,V>是一个泛型接口,泛型参数有俩,分别为K,V,代表了所要存储的键值对类型
	键是唯一的,值是可重复的,且键值对一一对应
	键和值都可以为null
	无序

Map接口中的方法

			put :添加
			get :获取
			remove :删除
			containsKey :是否包含Key
			containsValue :是否包含value
			clear : 清除所有的内容
			isEmpty :是否存在
			size :长度
			keySet :key值获取
			values : 获取所有的value值
                            

使用注意

如果Key存的是自定义对象,那么一般要重写equals和hashCode方法,才能保证键唯一
一般用String作为键,使用较多
    
    TreeMap
特点
	根据键排序的map
	如果键为自定义对象则需要实现Comparable接口或者构造器传入比较器

LinkedHashMap

特点

	保证读取顺序

可变参数

方法的参数是可变的
形式:修饰符 返回值 方法名称(参数类型... 参数名)
	public void sum(int.... a)
可变参数实际是一个动态数组
如果一个方法有多个参数,且包含可变参数,则可变参数要放在最后
    

HashMap底层数据结构

什么是hash值?

	1.是根据对象的地址或者属性生成的一个int类型的整数
	2.如果重写了hashCode则是按照对象属性计算hash3.如果没有重写hashCode则是按照对象地址计算hash

hash碰撞

	两个不同对象的hash值一样

哈希表(hash桶)

	其实就是一个数组,但是元素的位置是根据对象的hash值计算出来的

jdk1.8之前

数组+链表
			1.首先创建一个长度为16的数组,加载因子为0.75,
			2.接着根据元素的hash值以及数组长度,计算出元素存储的位置(数组索引)
			3.如果计算出来的当前索引位置为null,则直接添加
			4.如果计算出的索引位置不为null,则继续调用equals方法比较元素内容
				内容一样,则不存
				内容不一样:新的元素存在该数组位置,老的元素以链表形式挂在新元素下面
			
                            
数组扩容时机
一旦数组内存储的数据>数组长度*加载因子时,数组长度就会扩大到二倍

jdk1.8之后

数组+链表+红黑树
	当链表长度大于8之后,会把链表变成进行树化,树化成红黑树,提高查询效率