热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:java之集合

篇首语:本文由编程笔记#小编为大家整理,主要介绍了java之集合相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了java之集合相关的知识,希望对你有一定的参考价值。






1.集合的体系图

在这里插入图片描述


2.数组vs集合

a)数组:
在这里插入图片描述
b)集合
在这里插入图片描述


3.集合的继承图(主要的一些类)

集合主要两种:单列集合(对象)、双列集合(键值对)
a)collection
在这里插入图片描述
b)Map
在这里插入图片描述


4.collection接口实现类的接口

a)
在这里插入图片描述
b)collection的子类都可以使用Iterator迭代器
在这里插入图片描述
ii)迭代器原理:
可重复;
在这里插入图片描述
ii)增强for循环
在这里插入图片描述


5.List接口

在这里插入图片描述
在这里插入图片描述


6.arrayList

a)可以放任何值,可以加入null,并且多个
b)底层是由数组实现
c)arrayList等同vector,效率高于vector,但是线程不安全
d)创建一个对象分析
在这里插入图片描述
源码分析
ii)无参数
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
ii)指定大小的参数
构造器的差别
在这里插入图片描述


7.vector

扩容机制:
在这里插入图片描述


8.LinkedList

在这里插入图片描述
在这里插入图片描述a)添加的源码分析:

import java.util.LinkedList;
public class LinkList {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.add(1);
System.out.println("linkedList:"+linkedList);
}
}

在这里插入图片描述b)删除的源码分析:
linkedList.remove();

在这里插入图片描述
在这里插入图片描述注解:核心方法是unlinkFirst()
个人一开始比较疑惑的是:
if (next == null)
last = null;
else
next.prev = null;
当next为空的时候,证明没有下一个元素了,所以最后一个肯定也为null;
else:不为空的话,作为第一元素的prev也应该指向为空,(至于为啥这里last不用在重新指向呢?是因为add()的时候,last代表最后一个元素,只要元素存在,last值就一定还为发生改变)

两者比较:
两者都是线程不安全
在这里插入图片描述


9.set接口

单向链表
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
a)遍历的二种方式(没有普通for循环,因为没有通过索引获取的方法)
ii)迭代器
在这里插入图片描述
ii)增强for循环
在这里插入图片描述
在这里插入图片描述
b)hashset底层机制(底层是hashMap)
hashMap底层是:数组+链表+红黑树

在这里插入图片描述
在这里插入图片描述
分析:
ii)hashSet底层是hashMap,第一次进来的时候先进行扩容到16,默认加载因为是0.75,即没每次达到当前数组长度的0.75倍时候,扩容到当前数组长度2;
在这里插入图片描述

ii)当根据计算得到新进来的元素在tab的索引的已经存在元素的时候,比较他们之间的hashcode+equal(),倘若符合条件,将对元素进行覆盖;

ii)如果p可能是树,最后一种情况就是链表;
当进行链表的遍历时候,没有相等的话,就加载链表的末端,如果加进来的数量大于等于8-1的时候,将调用树化的方法;
ii)链表循环有两处跳出的判断:一处是成功往链表加入节点;一处是判断元素的hash()+equal()符合条件
在这里插入图片描述

c)源码分析:
在这里插入图片描述
d) hashset地扩容和转换为红黑树机制

e)hashSet比较原理
(hashcode()+equals())

注释:例如一个对象Dog
输出(new Dog(“name”) 其实是new Dog(“name”).toString())

9)linkedHashSet
(可以看成是在HashSet的基础上加上before和after保证元素的插入顺序)
双向链表:确保遍历顺序和插入顺序一样
在这里插入图片描述

在这里插入图片描述
重点:
在这里插入图片描述
为什么hashMap




N


o


d


e


[


]











L


i


n


k


e


d


H


a


s


h


M


a


p



Node[]能存放LinkedHashMap


Node[]LinkedHashMap
Entry呢,由源码可以看出,他们是继承关系:
在这里插入图片描述


10.Map主要结构图

在这里插入图片描述
a)jdk8 map 接口特点
在这里插入图片描述
b)map.put存的和取的顺序是不一样的,
得到key的时候,先根据hashcode()计算位置,在根据equals()来判断,这也是key为啥不能重复的原因,倘若放重复的key,将会把之前的k-v替换掉

在这里插入图片描述

c)一个k-v是放在hashMap




N


o


d


e








h


a


s


h


M


a


p



Node里面 hashMap


NodehashMap
Node node = newNode(hash,key,value,null),而node是实现entry;
然后再把一个个newNode放在set里面,方便遍历,事实上set里面的(keySet《set》,values《Collection》)只是简单的指向,并非真正的重新存入一份数据。
在这里插入图片描述

在这里插入图片描述

d)map的遍历
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
e)hashMap底层机制
ii)示意图
在这里插入图片描述
在这里插入图片描述
ii)程序分析
在这里插入图片描述
在这里插入图片描述
ii)第一次进去将进行扩容
在这里插入图片描述
从resize()方法可以看出是个Node
在这里插入图片描述
ii)当hash值为null时候,将创建一个newNode加入到Node[] tab 数组
在这里插入图片描述
ii)当为重复的时候,将实现覆盖
在这里插入图片描述
ii)当判断是链表的时候,有两种情况跳槽循环:
链表长度大于等于8;链表存在元素相等的情况
在这里插入图片描述
ii)当长度达到8的时候,并不是马上树化,长度不够64的情况会先进行扩容
在这里插入图片描述


11.hashTable

a)基本介绍
在这里插入图片描述
b)扩容
在这里插入图片描述


12.propeties

在这里插入图片描述


13.集合的选择

在这里插入图片描述


14.treeSet

在这里插入图片描述
a)treeSet底层是treeMap
在这里插入图片描述
在这里插入图片描述
b)cpr代表传进去的内部类,进行循环比较
在这里插入图片描述


15.treeMap

(无参构造是没有顺序的,和treeSet类似)
当添加的key相等时候,value是会替换的
在这里插入图片描述


16Conllections工具类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


17.hashSet和treeSet如何实现去重

在这里插入图片描述


18.运行下面代码,将会报错

传入无参构造时候,将会把person转为Comparable,而person并未实现Comparable接口,所以会出现类型异常
在这里插入图片描述
一开始p1和p2能够加入,
当p1.name改变时候
set.remove(p1);由于hashCode发生了改变,无法移除到原来的对象,所以此时还保持着两个元素;
set.add(new Person(1001,“cc”)),计算出来的hashcode不一样,所以会存放进去;
当set.add(new Person(1001,“AA”)),虽然和第一个的hashcode一样,但是此时的内容是不一样的,所以将形成链表挂在第一个的后面

在这里插入图片描述


19.vector和Arraylist的区别

在这里插入图片描述






推荐阅读
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
author-avatar
1257523034_627418
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有