Java学习之集合框架

Java集合框架

官方已经重写了所有集合的tostring()

集合的由来

  • 处理多个相同数据我们采用数组,但数组空间固定不能动态增长,插入或删除元素比较麻烦。我们使用集合来解决这个问题。
  • 集合特点:元素类型可以不同,集合长度可变,空间不固定。
  • Java中对一下数据结构和算法进行了封装即集合(简化和提升开发效率)
  • JCF集合框架。提供了用于管理集合的类和接口
  • image-20201119092618545

Java中的数组

  • Java中的数组,长度是不可变的,如果要修改长度,只能new新生成
  • Java中的数组,因为长度不可变,所以不能随意增加或删除,即使删除了元素,但是还会保存当前类型的默认值

element 元素

Collection 接口

Set接口

Set接口:包含不重复元素的集合接口

HashSet类

默认16

实现了Set接口的类

  • add()
  • remove() 如果存在这个元素,则删除
  • contains() 查找指定元素
  • size()
  • retainAll(); 反选 只保留括号中存在的元素
  • containsAll() 查找指定全部元素

set支持for each

深拷贝和浅拷贝

TreeSet

默认0

List接口

list中的所有方法几乎很set一样,但list是有序的

arrayList在获取元素时,性能很高,但是在删除元素时性能极低

ArrayList类

默认10

可变数组 ArrayList是线程不安全的

  • add() 追加到最末尾的方法
  • add(index,element ) 插入到指定位置
  • clear() 从列表中删除所有元素。
  • get(int index) 返回此列表中指定位置的元素。
  • remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。
  • remove补充:
  • set(int index, E element) 用指定的元素替换此列表中指定位置的元素。 set是替代 ,add是增加
  • subList() 类似于substring
  • 数组自身已经对负值进行了约束
  • fast 快速移除

System.arraycopy(填充数组,从第一位开始填,被填充的数组,被从几位开始填,到第几位结束) 拷贝数组最快的方法

transient 临时形态 只在序列化中存在价值

HashSet和ArrayList线程都是不安全的,所有当在实际开发中,如果多线程调用时,一定不能使用这二个类

img

LinkedList

线程不安全的

  • addFirst(E e) 在该列表开头插入指定的元素。
  • addLast(E e) 将指定的元素追加到此列表的末尾。
  • element() 检索但不删除此列表的头(第一个元素) 速度很快的一个方法
  • poll() 检索并删除此列表的头(第一个元素)。
  • push(E e) 将元素推送到由此列表表示的堆栈上。

字典顺序,以位(每一位)比较 位数越高优先级越高

Iterator接口

迭代器

hasNext();

next();

ListIterator(); list独有的迭代器

enum 枚举

在Java中枚举其实也算是一个类,因为它也是构造函数

public enum Day{
    a,b,c;
}

Map

HashMap

默认16

HashMap只能使用for each 遍历

需要使用HashMap.entrySet() 实现

put(key,value) 增加一个键值对 当key 一样时 会改变key对应的value

get() 得到一个值

keySet() 得到所有的Key 返回一个Set

values() 得到所有的value的值 Values是个内部类。

entrySet() 返回键值对到set中。

HashMap的循环使用方法:(只能用foreach)

HashMap map = new HashMap();
		map.put("a", "aaa");
		map.put("b", "bbb");
		map.put("c", "ccc");
		
		for(Object object : map.entrySet())	//map的循环处理所有数据(开发必用)
		{
			Map.Entry mEntry = (Map.Entry)object;
			System.out.println(mEntry.getKey()+"……………………"+mEntry.getValue());
		}

ConcurrentHashMap :线程安全

TreeMap

Hashtable类

是线程安全的

Hashtable只有一把同步锁,导致所有的用户访问时,不管是否访问相同的key,都会出现同步化排队

只会出现在笔试和口试中

Hashtable里面不允许出现null

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqZf4Vm8-1617810101402)(D:\截图\1615974133.jpg)]

ConcurrentHashMap 和 Hashtable 的区别

ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。

  • 底层数据结构: JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;
  • 实现线程安全的方式(重要):在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。(默认分配16个Segment,比Hashtable效率提高16倍。) 到了 JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。(JDK1.6以后 对 synchronized锁做了很多优化) 整个看起来就像是优化过且线程安全的 HashMap,虽然在JDK1.8中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本;② Hashtable(同一把锁) :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。

… 动态接收参数 JDK 1.5版本开始

不允许有多个动态参数

  • 违背了严谨
  • 就是可以接收0个一个或者多个东西

泛型 JDK 1.5开始的内容

  • 官方建议集合类型都要使用泛型
  • 泛型是值所有的类类型,不包含八种基本类型
    ut 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。

… 动态接收参数 JDK 1.5版本开始

不允许有多个动态参数

  • 违背了严谨
  • 就是可以接收0个一个或者多个东西

泛型 JDK 1.5开始的内容

  • 官方建议集合类型都要使用泛型
  • 泛型是值所有的类类型,不包含八种基本类型
  • 1.6版本中新增,构造函数可以使用空三角函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值