java小白的第二十三课——集合框的架总结及分析

集合框架

有序 可重复 有索引
无序 不可重复 无索引
Iterable接口
collection 子接口
List 子接口
Set 子接口
ArrayList类
LinkedList类
Version类
HashSet类
TreeSet类
Map 接口
hashMap类
TreeMap类

List

  1. List 和 Set的区别
    • 相同点:都是Collection接口的子接口
    • List接口 是有序 可重复 也有索引
    • Set接口 是无序 不可重复 没有索引
  2. ArrayList LinkedList Version的关系
类名区别
ArrayList 一个可扩容、可重复的有序数组,可以存入所有元素包括null。
检索的效率高,插和删效率低
默认长度是10
不支持线程同步
LinkedList 双向链表数据类型
相比增删效率高,查的效率低
可以模拟堆栈(先进后出)、队列(先进先出)
方法不同步
Vector和ArrayList一样 主要的区别就是 线程同步,以及特殊的扩容方法

  1. ArrayList 是基于数组模型的,可变数组集合,里面的值是连续的 所以特别查询效率高,但是插入或者删除的时候都会需要,先复制后面的值,再去移动,所以效率比较低
    add
    deleteEle
  2. LinkedList :是双向链表型,所以数据并不是挨着的,所以查找只能依靠内部算法进行查找,但是增和删的效率比较高

在这里插入图片描述
5. vector:它和ArrayList类似,但是线程安全,但是效率较低。

Set

  1. HashSet 和 TreeSet
  • HashSet : 无序不重复的集合,可以添加(add)删除(remove),但是不能指定获取也不能用for,因为没有无序无下标,可以使用foreach,Iterator获取。
  • TreeSet:自然顺序排序(数字顺序字母顺序Unicode码顺序)的不重复集合,也不同步
  1. HashSet怎么保证元素不重复
    1.HashCode码如果不同就直接插入集合
    2.HashCode如果相同再去判断equals

  2. .HashSet 怎么深层次判断对象的内容

//重写hashCode方法
@Override
public int hashCode(){
	//Object.hash 底层执行的是Array.hashCode 会获取到每个元素的hashCode然后进行运算 返回一个新的值
	return Object.hash(属性1,属性2,...,属性N);
}

public boolean equals(Object o){
	//==判断内存地址相同不
	if(this == o)return true;
	if(o == null || o.Class() != this.Class() )return false;
	类型 n = (类型)o;
	return String属性.equals(n.String属性) &&
			int属性 == n.int属性 && ...
}

泛型:

  • 概念:泛型是JDK1.5之后出现的 ,本质上是参数化类型(ParameterizedType),可以用在方法、类型、接口中,分为泛方法、泛类型、泛接口。泛型的应用之一就是:为了限制集合里数据的类型,保证数据统一。

  • 创建泛型变量
    泛型变量

  • 获取这个类里面的属性并比较是不是属于ParameterizedType
    在这里插入图片描述

  • 结果
    在这里插入图片描述

  • 泛型擦除: 泛型只在编译期起作用,当编译结束后就清除泛型,不会参与运行

  • 自定义泛型:

    • T Type 任意类型
    • E Element 元素
    • K,V Key,value 分别是键和值
    • ? 不确定类型
    • <? extends T> 子类和本身
    • <? super T>父类和本身

Map

  • 概念:映射键值关系的对象,键不能重复,值可以重复。

HashMap

  • HashMap是通过哈希算法来确定存储的位置,所以它是无序的,但是再好的哈希算法也免不了计算出相同值得状态,这种情况就叫哈希冲突也叫哈希碰撞,所以HashMap最终的数据存储是使用哈希+链表的格式 。

来源于woshimaxiao1的博客

  • 当然是以哈希表为主,而链表只是为了解决哈希碰撞的。
  • 增删改查的时候,会找哈希表,如果找到的地方没有链表就直接返回,如果有再去看链表。
  • hashMap不支持线程安全,所以需要特殊处理才能在线程使用:
    • 使用HashTable类
    • 使用Collections.synchroizedCollection包装一下

更深度的分析就去看这位大佬的文章Java集合之一—HashMap

TreeMap:

  • 红黑树的数据结构,自然顺序排序,也可以使用Comparable来自定义规则。
  • 至于红黑树就是这个样子
    Tree
  • 多用于需要排序的场景下
  • 可以使用 Comparatpr进行排序
new TreeMap<>(new Comparator<Object>() {
            @Override
            public int compare(Object o1, Object o2) {
                return 0;
            }
        });
  • 排序源码: 重写的Comparator类通过构造方法传入,走到getEntry,如果传入了Comparator了之后就还行getEntryUsingComparator这个方法。
  • 在这里插入图片描述在这里插入图片描述

HashTable

  • hashTable也是用键值对来存放元素的,其中hashTable不能存储key=null的键值对,hashTable中的方法都实现了synchronize,是线程安全的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值