集合

集合

数组与集合的区别:

1.集合与数组存储数据概述:
  • 集合、数组都是对多个数据进行存储操作的结构,简称Java容器。

  • 说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)

2.数组存储的特点:
  • 一旦初始化以后,其长度就确定了。
  • 数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指定类型的数据了。比如:String[] arr;int[] arr1;Object[] arr2;
  1. 数组存储的弊端:
  • 一旦初始化以后,其长度就不可修改。
  • 数组中提供的方法非常限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。
  • 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
  • 数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。
  1. 集合存储的优点:
    解决数组存储数据方面的弊端。

Collection接口:

单列集合,用来存储一个一个的对象

  • ​ List接口:存储序的、可重复的数据。
    • ArrayList、LinkedList、Vector
  • ​ Set接口:存储无序的、不可重复的数据
    • HashSet、LinkedHashSet、TreeSet

通用功能:

  • 添加 add
  • 删除 remove
  • 记数 size
  • 包含 contains
  • 清空 clear
  • 是否空 isEmpty

在这里插入图片描述

迭代器(Iterator)

  • hasNext();//判断是否有与乃是没有被遍历
  • next(); //返回游标当前位置,并向下移动一个位置
  • remove();//删除游标左面的元素,最起码执行一次next代码才能使用该代码,只能执行一次

在这里插入图片描述

public class void main (String [] args){}
Iterator<String> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
	}
}

List接口

存储的数据特点:存储序的、可重复的数据。

常用方法:(记住)

  • 增:add(Object obj)

  • 删:remove(int index) / remove(Object obj)

  • 改:set(int index, Object ele)

  • 查:get(int index)

  • 插:add(int index, Object ele)

  • 长度:size()

  • 遍历:① Iterator迭代器方式

    ​ ② 增强for循环

    ​ ③ 普通的循环

常用实现类:
Collection接口:单列集合,用来存储一个一个的对象

  • List接口:存储序的、可重复的数据。 -->“动态”数组,替换原的数组
  • ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储
  • LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
  • Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储

Set接口

存储的数据特点:无序的、不可重复的元素

set的实现类是HashSet,HashSet的底层是HashMap

以HashSet为例说明:

Hash具有两大特性

  1. 无序性:不等于随机性。存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的。
  2. 不可重复性:保证添加的元素照equals()判断时,不能返回true.即:相同的元素只能添加一个。

底层实现:

首先进行hashcode算法计算后,得到在Entry数组中的存放位置. 如果此位置上的数据为空,key-value添加成功

如果此位置上的数据不为空(此位置上存在一个或多个数据(以链表形式存在)),比较哈希值:

​ 如果key的哈希值与已存在的数据的哈希值都不同,此时key-value数据添加成功

​ 如果key的哈希值和与已存在的某个数据的哈希值相同,需要进行equals比较:调用key所在类的方法

​ 如果equlas返回folse:此时key数据添加成功

​ 如果equals返回是true:使用key-value中的value替换相同key的value值

在JDK8中的改动:

  1. jdk8中的数组底层没有创建一个长度为16的数组

  2. 底层的数组是Node[] ,而非Entry数组[]

  3. 首次调用put()方法时,底层创建长度为16的数组

  4. jdk8中的底层结构为数组+链表+红黑树

  5. 当数组的某一个索引位置上以链表形式存在数据个数>8 且当前数组的长度>64时,此时索引位置上的所有数据改为使用红黑树存储

    HashMap的常用方法

t()方法时,底层创建长度为16的数组

  1. jdk8中的底层结构为数组+链表+红黑树

  2. 当数组的某一个索引位置上以链表形式存在数据个数>8 且当前数组的长度>64时,此时索引位置上的所有数据改为使用红黑树存储

    HashMap的常用方法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值