程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

java之集合

发布于2021-06-12 15:48     阅读(386)     评论(0)     点赞(0)     收藏(3)


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底层是:数组+链表+红黑树

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

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

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

9)linkedHashSet
双向链表:确保遍历顺序和插入顺序一样
在这里插入图片描述

在这里插入图片描述
重点:
在这里插入图片描述为什么hashMap N o d e [ ] 能 存 放 L i n k e d H a s h M a p Node[]能存放LinkedHashMap Node[]LinkedHashMapEntry呢,由源码可以看出,他们是继承关系:
在这里插入图片描述

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

在这里插入图片描述

d)map的遍历
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
e)hashMap底层机制
ii)示意图
在这里插入图片描述
在这里插入图片描述
ii)程序分析
在这里插入图片描述
在这里插入图片描述
ii)第一次进去将进行扩容
在这里插入图片描述
从resize()方法可以看出是个Node<key,value>
在这里插入图片描述
ii)当hash值为null时候,将创建一个newNode加入到Node<k,v>[] 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的区别

在这里插入图片描述

原文链接:https://blog.csdn.net/weixin_42063820/article/details/116903206



所属网站分类: 技术文章 > 博客

作者:java小王子

链接:http://www.javaheidong.com/blog/article/222556/c54d1267eb8f37270a6b/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

0 0
收藏该文
已收藏

评论内容:(最多支持255个字符)