十 java集合框架(2):set接口 -尊龙游戏旗舰厅官网
尊龙游戏旗舰厅官网
收集整理的这篇文章主要介绍了
十 java集合框架(2):set接口
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
文章目录
- set接口和常用方法
- 基本介绍
- set接口常用方法
- set接口的遍历方式
- set实现类--hashset
- 基本介绍
- hashset底层机制
- 源码分析
- hashset的add方法
- hashset扩容机制
- 代码实践
- set实现类--linkedhashset
- 基本介绍
- 源码分析
- set实现类--treeset
- 基本介绍
- 源码分析
课程视频:https://www.bilibili.com/video/bv1ya411t76k
基本介绍
无序(添加和取出的顺序不一致),没有索引
不允许重复元素,所以最多包含一个null
jdk api中set接口的实现类有
set接口常用方法
和list接口一样,set接口也是collection的子接口,因此,常用方法和collection接口一样。
modifier and typemethod and descriptionboolean | add(e e)如果指定的元素不存在,则将其指定的元素添加(可选操作)。 |
boolean | addall(collection c)将指定集合中的所有元素添加到此集合(如果尚未存在)(可选操作)。 |
void | clear()从此集合中删除所有元素(可选操作)。 |
boolean | contains(object o)如果此集合包含指定的元素,则返回 true 。 |
boolean | containsall(collection c)返回 true如果此集合包含所有指定集合的元素。 |
boolean | equals(object o)将指定的对象与此集合进行比较以实现相等。 |
int | hashcode()返回此集合的哈希码值。 |
boolean | isempty()如果此集合不包含元素,则返回 true 。 |
iterator | iterator()返回此集合中元素的迭代器。 |
boolean | remove(object o)如果存在,则从该集合中删除指定的元素(可选操作)。 |
boolean | removeall(collection c)从此集合中删除指定集合中包含的所有元素(可选操作)。 |
boolean | retainall(collection c)仅保留该集合中包含在指定集合中的元素(可选操作)。 |
int | size()返回此集合中的元素数(其基数)。 |
default spliterator | spliterator()在此集合中的元素上创建一个 spliterator 。 |
object[] | toarray()返回一个包含此集合中所有元素的数组。 |
toarray(t[] a)返回一个包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。 |
set接口的遍历方式
同collection的遍历方法一样,因为set接口是collection接口的子接口。
基本介绍
hashset 实现了set接口
hashset 实际上是hashmap(源码如下)
public hashset() {map = new hashmap<>(); }可以存放null值,但是只能有一个null
hashset不保证元素是有序的,取决于hash值,再确定索引的结果
不能有重复元素/对象
hashset底层机制
hashset 底层是hashmap,hashmap底层是(数组 链表 红黑树)
相较数组存储效率高
代码实现
//模拟一个hashsetmap的底层(hashmap的底层结构)//1.创建一个数组,数组的类型是node[] //2.有些人,直接把node[]数组称为表 node[] table = new node[16];//3.创建结点 node john = new node("john",null); table[2] = john; node jack = new node("jack", null); john.next = jack;//将jack节点挂载到 john后 node rose = new node("rose",null); jack.next = rose;//将roes结点挂载到jack后 node lucy = new node("lucy", null); table[3] = lucy; system.out.println(table);存储结构
源码分析
hashset的add方法
hashset扩容机制
注意:
- 每添加一个元素(包括在table表,与表中链表)即添加一个节点,会执行一次 size,当size > threshold 时就会执行扩容。
- table表扩容并不是表的16个大小被添加完才执行,当所有元素的个数大于临界值时就会执行扩容。
具体可以查看博客 https://blog.csdn.net/weixin_39667787/article/details/86678215
代码实践
题目描述:
定义一个eeployee类,该类包括:private成员属性name,age
关键:重写hashcode()与equals()方法
快捷键:alt insert => equals() and hashcode() => 选择相应的参数
public class demo17_hashsetexercise {public static void main(string[] args) {hashset hashset = new hashset();hashset.add(new employee("jack", 18));hashset.add(new employee("mike", 28));hashset.add(new employee("jack", 18));system.out.println(hashset);//[employee{name='mike', age=28}, employee{name='jack', age=18}]} } class employee {string name;int age;@overridepublic boolean equals(object o) {if (this == o) return true;if (o == null || getclass() != o.getclass()) return false;employee employee = (employee) o;return age == employee.age && objects.equals(name, employee.name);}@overridepublic int hashcode() {return objects.hash(name, 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;}public employee(string name, int age) {this.name = name;this.age = age;}@overridepublic string tostring() {return "employee{" "name='" name '\'' ", age=" age '}';} }基本介绍
- linkedhashset 是 hashset的子类
- linkedhashset 底层是一个linkedhashmap,底层维护了一个 数组 双向链表
- linkedhashset 根据元素的 hashcode 值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存得。
- linkedhashset 不允许添加重复元素
说明:
源码分析
public class demo19_linkedhashset_source {public static void main(string[] args) {linkedhashset set = new linkedhashset();set.add(new string("aa"));set.add(456);set.add(456);set.add(new customer("刘",1001));set.add(123);set.add("kobe");for (int i = 0; i < 100; i) {set.add(new customer("kobe",24));}//也会树化 parent、left、rightsystem.out.println(set);//1. linkedhashset 加入顺序和遍历顺序一致//2. linkedhashset 底层是一个linkedhashmap(是hashmap的子类)//3. linkedhashset 底层结构(数组table 双向列表)//4. 添加第一次时,直接将数组table扩容到16,存放的结点类型 linkedhashmap$entry//5. 数组是hashmap$node[] , 存放的元素/数据是 linkedhashmap$entry 类型/*//继承关系是在内部类完成 , 都是静态内部类static class entry树化后的结点结构
基本介绍
- 不允许添加重复元素,不允许添加 null,不允许添加
- 无序(没有按照输入顺序进行输出)
- 遍历结果有顺序
- 底层为排序二叉树(红黑树),且采用中序遍历得到结果 (左节点,根节点,右节点)
源码分析
public class demo_treeset {public static void main(string[] args) {//treeset treeset = new treeset();//使用匿名内部类实现comparator接口,并重写compare方法,指定排序方法treeset treeset = new treeset(new comparator() {@overridepublic int compare(object o1, object o2) {return ((string)o1).length() - ((string)o2).length();}});//添加数据treeset.add("jack");treeset.add("tom");treeset.add("sp");treeset.add("abc");//tom 和 abc 长度相等,key相等,添加失败system.out.println(treeset);//[sp, tom, jack]//1.当我们使用无参构造器时,创建treeset时,底层默认创建treemap/*public treeset() {this(new treemap总结
以上是尊龙游戏旗舰厅官网为你收集整理的十 java集合框架(2):set接口的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: web前端学习笔记01利用纯css书写二