①不能保证元素的排列顺序
②HashSet 不是线程安全的
③集合元素可以是 null
2、HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。因此对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode()方法,以实现对象相等规则,即:“相等的对象必须具有相等的散列码”。
3、向HashSet中添加元素的过程:
我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(索引位置)。接着判断数组此位置上是否已经有元素:
如果此位置上没有其他元素,则元素a添加成功。—>情况1
如果此位置上有其他元素b(或以链表形式存在多个元素),则比较元素a与元素b的hash值:
如果hash值不相同,则元素a添加成功。—> 情况2
如果hash值相同,进而需要调用元素a所在类的equals()方法:
如果equals()返回true,元素a添加失败
如果equals()返回false,则元素a添加成功。—>情况3
对于添加成功的情况2和情况3而言:元素a与已经存在指定索引位置上数据以链表的方式存储。(七上八下)
jdk 7 : 新来元素a放到数组中,指向已存在的旧元素。
jdk 8 : 已存在的旧元素在数组中,指向新来元素a
底层为“数组+链表”,数组初始容量为16,当如果使用率超过0.75(16*0.75=12)就会扩大容量为原来的2倍。(16扩容为32,依次为64,128…等)
重写equals()方法的时候一般都需要同时复写hashCode()方法。通常参与计算hash值的对象的属性也应该参与到equals()中进行计算
1、LinkedHashSet 是 HashSet 的子类,也是根据元素的 hashCode 值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
2、LinkedHashSet插入性能略低于 HashSet,但在迭代访问(遍历) Set 里的元素时有很好的性能。
3、LinkedHashSet 不允许集合元素重复。
1、TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。元素应为相同类的对象。
2、TreeSet底层使用红黑树结构存储数据。
3、TreeSet 两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。
4、自然排序
①TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按条件排列。如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable 接口。实现 Comparable 的类必须重写compareTo(Object obj) 方法,两个对象通过compareTo(Object obj) 方法的返回值来比较大小。
②向 TreeSet 中添加元素时,只有第一个元素无须比较compareTo()方法,后面添
加的所有元素都会调用compareTo()方法进行比较。
③因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是同
一个类的对象。
④对于 TreeSet 集合而言,它判断两个对象是否相等的唯一标准是两个对象通过 compareTo(Object obj) 方法比较的返回值。
import java.util.Iterator;
import java.util.TreeSet;
/**
-
@Author: Yeman
-
@Date: 2021-09-16-16:48
-
@Description:
*/
class Student implements Comparable{
String name;
int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
//姓名从小到大,年龄从大到小排列
public int compareTo(Object o) {
if (o instanceof Student){
Student student = (Student) o;
int nameResult = this.name.compareTo(student.name);
if (nameResult == 0){
return -Integer.compare(this.age,student.age);
}else {
return nameResult;
}
}else throw new RuntimeException(“类型不匹配”);
}
@Override
public String toString() {
return “Student{” +
“name='” + name + ‘’’ +
“, age=” + age +
‘}’;
}
}
public class TreeSetTest {
public static void main(String[] args) {
TreeSet treeSet = new TreeSet();
treeSet.add(new Student(“Tom”,18));
treeSet.add(new Student(“Tom”,22));
treeSet.add(new Student(“jim”,18));
treeSet.add(new Student(“Anne”,19));
treeSet.add(new Student(“Lily”,25));
treeSet.add(new Student(“LiLei”,25));
Iterator iterator = treeSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
5、定制排序
①定制排序,通过Comparator接口来实现,需要重写compare(T o1,T o2)方法。
②要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。
③仍然只能向TreeSet中添加类型相同的对象。否则发生ClassCastException异常。
④使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
为什么我不完全主张自学?
①平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。
除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。
我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。
应该学哪些技术才能达到企业的要求?(下图总结)
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。
应该学哪些技术才能达到企业的要求?(下图总结)
[外链图片转存中…(img-iF7kDFBC-1712134298163)]
[外链图片转存中…(img-V3wntRKr-1712134298163)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!