当前位置: 移动技术网 > IT编程>开发语言>Java > java学习之高级语法 --- Set 集合

java学习之高级语法 --- Set 集合

2020年11月12日  | 移动技术网IT编程  | 我要评论
Set 集合▶ java.util.Set 接口 extends Collection 接口Set 接口的特点:(1)不允许存储重复的元素(2)没有索引,没有带索引的方法,也不能使用普通的for循环遍历▶ java.util.HashSet集合implements Set 接口HashSet 接口的特点:(1)不允许存储重复的元素(2)没有索引,没有带索引的方法,也不能使用普通的for循环遍历(3)是一个无序集合,存储元素和取出元素的顺序可能不一致(...

Set 集合

▶  java.util.Set 接口 extends Collection 接口

Set 接口的特点:

(1)不允许存储重复的元素

(2)没有索引,没有带索引的方法,也不能使用普通的for循环遍历

 

▶  java.util.HashSet 集合  implements  Set接口

HashSet 接口的特点:

(1)不允许存储重复的元素

(2)没有索引,没有带索引的方法,也不能使用普通的for循环遍历

(3)是一个无序集合,存储元素和取出元素的顺序可能不一致

(4)底层是一个哈希表结构,特点是 “ 查询速度快 ”

 

▶  哈希值是一个十进制的整数,由系统随机给出

(就是对象的地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实际存储的物理地址)

在Object类有一个方法可以获取对象的Hash值:int hashCode() ; --- 该方法返回调用这个方法的对象的哈希码值

hasCode方法的源码:  public native int hashCode() ;  

                                      native:代表该方法调用的是本地操作系统的方法

public class Person extends Object {

}

public class DemoHahCode {
	
	public static void main(String[] args) {
		
		// Person类继承了Object类,所以可以使用Object类的hashCode方法
		Person p1 = new Person() ;
		int h1 = p1.hashCode();
		System.out.println(h1);
		
		Person p2 = new Person() ;
		int h2 = p2.hashCode();
		System.out.println(h2);
		
	}

}

 

▶  HashSet集合存储数据的结构 --- 哈希表(哈希表的特点:速度快)

jdk1.8版本之前 : 哈希表 = 数组+链表

jdk1.8版本之后 : 哈希表 = 数组+链表

                              哈希表 = 数组+红黑树(提高查询速度)

【 什么时候用红黑树呢?如果链表的长度超过了8位,则会把链表转换为红黑树以提高查询速度 】

数组结构:把元素进行分组(相同哈希值的元素一组)

链表 / 红黑树结构:把相同哈希值的元素连接到一起

 

▶  Set集合存储元素不重复的原理

前提:存储的元素必须重写hashCode方法和equals方法

具体说明:

            

Set集合在调用add方法的时候,add方法会调用元素的hashCode方法和equals方法,判断元素是否重复

---> add方法会调用s1的hashCode方法,计算字符串“abc”的哈希值,哈希值是96354,在集合中找有没有96354这个哈希值的元素,发现没有,就会把s1存储到集合中。

---> add方法会调用s2的hashCode方法计算字符串“abc”的哈希值,哈希值是96354,在集合中找有没有96354这个哈希值的元素,发现有(哈希冲突),则s2会调用equals方法和哈希值相同的元素进行比较,s2.equals(s1)返回true,两个元素的哈希值相同,equals方法返回true则说明两个元素相同,这样就不会把s2存储到集合中

---> add方法会调用“重地”的hashCode方法计算字符串的哈希值,哈希值是1179395,在集合中找有没有1179395这个哈希值的元素,发现没有,就会把“重地”存储到集合中。

---> add方法会调用“通话”的hashCode方法计算字符串的哈希值,哈希值是1179395,在集合中找有没有1179395这个哈希值的元素,发现有(哈希冲突),“通话”会调用equals方法和哈希值相同的元素进行比较,“通话”.equals(“重地”)返回false,两个元素的哈希值相同,equals方法返回false则说明两个元素不同,就会把“通话”存储到集合中

 

▶  HashSet 存储自定义类型元素

set集合报错元素唯一:存储的元素(String,Integer,...,Student,Person,...)必须重写hashCode方法和equals方法

要求:同名同年龄的人视为同一个人,只能存储一次

 

▶  LinkedHashSet 集合

java.util.LinkedHashSet集合 extends HashSet集合

LinkedHashSet集合特点:底层是一个哈希表(数组+链表/红黑树)+链表 ----- 多了一条链表(记录元素的存储顺序,保证元素有序)

 

▶  可变参数

可变参数是 jdk1.5 之后出现的新特性

可变参数使用前提:当方法的参数列表数据类型已经确定,但是参数的个数不确定就可以使用可变参数

使用格式:定义方法时使用

                 修饰符  返回值类型  方法名(数据类型...变量名){   }

可变参数的原理:可变参数的底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数,传递的参数的个数可以是 0个(不传递)、1、2、...、多个

可变参数的注意事项:

(1)一个方法的参数列表只能有一个可变参数

(2)如果方法的参数有多个,那么可变参数必须写在参数列表的末尾

本文地址:https://blog.csdn.net/Learning_xzj/article/details/109608564

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网