13、集合

1、集合与数组

集合:集合是java中提供的一种容器,可以用来存储多个数据。

集合和数组既然都是容器,它们有啥区别呢?

1.数组的长度是固定的。集合的长度是可变的。

2.数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以.

不一致。在开发中一般当对象多的时候,使用集合进行存储。

2、介绍

为了可以满足用户数据更多种的逻辑关系,而设计的一系列的不同 于数组的可变的聚合的抽象数据类型。

这些接口和类在java.uti包中,因为类型很丰富,因此我们通常称为集合框架集。

集合主要分为两大系列: Collection和Map, Collection 表示一组对象,Map表示一组映射关系或键值对。

3、Collection

存储元素集合,Collection 接口又有3种子类型,List. Set 和Queue,再下面是一些抽象类,最后是具

体实现类;

Collection的实现类只能存储引用类型,所以对于基本数据类型, Collection的实 现类只能存储他们的包装

类。

任何对象加入集合类后,如果集合没有使用泛型,会自动转变为Object类型,在取出的时候,需要进行强

制类型转换;使用泛型之后不用强制转换。

3.1 Set

Set接口的实现类存储的数据是无序的,元素不重复的

//创建一个Set集合

Set<String> set = new HashSet<>();

//判断集合是否为空null

System. out. printIn(set. isEmpty());

//集合增加元素

set. add("a");

set. add("b");s

//判断集合中是否存在指定元素

boolean tar = set. contains("c");

System. out. println(tar);

//迭代器遍历集合中的元素

Iterator<String> iterator = set.iterator();

while (iterator.hasNext()) {//判断是否有下一行数据

System. out. println( iterator.next());

}

//删除集合中的元素

set. remove("a");

//查看集合中的所有元素

for (String str : set) {

System. out. println(str);

}

//集合的大小:集合中的元素个数

int size = set.size();

System. out. println(size);

//清空集合

set. clear();

System. out. println(set . toString());

3.2 List

List接口的实现类存储的数据是有序的,元素可重复的;

List接口主要有两个实现类: ArrayList和LinkedList;

LinkedList与ArrayList的区别:

1) ArrayList是实现了基于动态数组的数据结构,在未声明长度的情况下,默认长度是10,数据溢出自动扩充。

2) LinkedList基于链表的数据结构。

3)对于随机访问get和set (即查找元素),ArrayList觉得优于LinkedList, 因为LinkedList要移动指针。

4)对于新增和删除操作add和remove, LinedList比较占优势,因为ArrayList要移动数据。

4.Map

Map中存储键值对(Key-Value)

HashMap是Map接口的实现类,该类根据键的hashcode值存储数据

Map的特点:

1) key和value只能是引用类型的数据

2) Map的key不允许重复

3)多次给同一个键名赋值,后面的会把前面的赋值覆盖

4)key可以为null,值可以多个为空

Map<String,Student> map = new HashMap<>();

map. put("A01", new Student());

map. put("A02",new Student());

Student stu = new Student();

stu.name = "张三" ;

map. put("A01", stu);//覆盖前面的数据

System. out. println(map. size());//2

Student S =map. get("A02");//获得value

//通过keySet方法获取到所有key值的set集合

for (String k1 : map. keySet()) {

System. out. println(map.get(k1));

}

//遍历map所有的值

for (Integer key : set) {

System. out . println(key); //打印键名

Sys' tem. out . print ln(map. get(key)); //根据键名获取值

}

Map<String, Integer> m2 = new HashMap<String, Integer>();

m2.put("张三",90);

m2. put ("李四",20);

//取值

System. out. println(m2. get("李四"));

//根据键key删除键值对

m2. remove("张三");

//判断key键是否存在

boolean tar = m2. containsKey("张三");

//判断value值是否存在

boolean tar2 = m2. containsValue(20);

//获取map集合的元素个数

int ten = m2.size();

System. out. println(len);

//打E印map中的元素

System. out . println(m2. toString());

//获取所有的值的集合

Collection<Integer> list3 = m2. values();

for (Integer integer : list3) {

System. out. println( integer);

}

// values方法,把所有的值拿出来

for (Student st : map.values()) {

System. out. println(st);

}

// entry 代表的是键值对,最推荐使用

for (Map. Entry<String, Student> entry : map. entrySet()) {

String key = entry. getKey();

Student stu2 = entry. getValue();

}

map. remove("A02");

boolean b = map. containsKey("A01");

//map. containsValue(new Student());

System. out. println(map) ;

5、HashMap

HashMap的底层存储结构为:数组加链表,jdk1.8之后 又加入了红黑树。

1) HashMap底层就是一个数组结构,数组中的每一个元素又是一 个链表。当新建一个HashMap的时候,就

会初始化-个数组。

2)允许null值和null键

3) Entry就是数组中的元素(k-v,每个Map.Entry 其实就是一个key- -value键值对,它持有一个指向下一 个

元素的引用,这就构成了链表

4)当添加一个元素(key- -value) 时,首先计算元素的key的hash值,以此来确定插入数组中的位置;

5)如果hash值相同,这时就添加到同-个hash值(hashCode) 的元素的后面,他们在数组的同一位置,

于是形成了链表

6)当链表长度大于8且元素(k-v) 个数超过64时,链表就转换为红黑树,这样就提高了查找的效率;

7)当红黑树中的节点个数小于6时,红黑树又重新转换为链表;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值