Java小白必备之集合详解(Collection、Map、Set、List)

1、集合概述

什么是集合?有什么用?

集合实际上就是一个容器。可以用来容纳其他类型的数据

为什么说集合在开发中使用较多?

集合是一个容器,是一个载体,可以一次容纳多个对象。在实际开发中,假设连接数据库,数据库当中有10条记录,那么假设把这10条记录查询出来,在java程序中会将10条数据封装成10个java对象,然后将10个java对象放到某一个集合当中,将集合传到前端,将一个数据一个一个展现出来。

集合存储的是什么?

集合不能直接存储基本数据类型,另外集合也不能直接存储java对象,集合当中存储的都是java对象的内存地址。(或者说集合中存储的时引用)。

集合在java JDK中哪个包下?

java.util.*包下,所有的集合类和集合接口都在java.util包下

集合框架图:

在这里插入图片描述
在这里插入图片描述


2、Collection接口常用方法

Collection中能存放什么元素?

没有使用"泛型"之前,Collection中可以存放Object的所有子类型。

使用了"泛型"之后,Collection中只能存储某个具体的类型。


2.1、add()和remove()方法

在这里插入图片描述

Collection collection = new ArrayList();

collection.add(100);
collection.add(3.14);
collection.add(new Object());
collection.add(true);
System.out.println(collection);

在这里插入图片描述

自动装箱原理(java5新特性)实际上放进去了一个对象的内存地址

在这里插入图片描述

Collection collection = new ArrayList();

collection.add(100);
collection.add(3.14);
collection.add(new Object());
collection.add(true);

//移除
collection.remove(100); 
collection.remove(true);

System.out.println(collection);

在这里插入图片描述


2.2、size()方法

在这里插入图片描述

Collection collection = new ArrayList();

collection.add(100);
collection.add(3.14);
collection.add(new Object());
collection.add(true);

System.out.println(collection.size());

在这里插入图片描述


2.3、clear()方法

在这里插入图片描述

Collection collection = new ArrayList();

collection.add(100);
collection.add(3.14);
collection.add(new Object());
collection.add(true);

collection.clear(); //清空
System.out.println(collection.size());

在这里插入图片描述


2.4、contains()方法

在这里插入图片描述

Collection collection = new ArrayList();

collection.add(100);
collection.add(3.14);
collection.add(new Object());
collection.add(true);


System.out.println(collection.contains(100));
System.out.println(collection.contains(3));

在这里插入图片描述


2.5、isEmpty()方法

在这里插入图片描述

判断集合中元素的个数是否为0

Collection collection = new ArrayList();

collection.add(100);
collection.add(3.14);
collection.add(new Object());
collection.add(true);


System.out.println(collection.isEmpty());
//清空集合
collection.clear();
System.out.println(collection.isEmpty());

在这里插入图片描述


3、Collection集合迭代(重点)

Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口

在这里插入图片描述

在这里插入图片描述

Iterator遍历方式一

 Collection collection = new ArrayList();

collection.add(100);
collection.add(3.14);
collection.add(true);

//获取迭代器对象
Iterator it = collection.iterator();

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

在这里插入图片描述

如果超出范围就会报错
在这里插入图片描述

Iterator遍历方式二(不推荐)

Collection collection = new ArrayList();

collection.add(100);
collection.add(3.14);
collection.add(true);
//获取迭代器对象
Iterator it = collection.iterator();

for (int i = 0; i < collection.size(); i++) {
	System.out.println(it.next());
}

在这里插入图片描述

Iterator遍历方式三(推荐)

Collection collection = new ArrayList();

collection.add(100);
collection.add(3.14);
collection.add(true);
//获取迭代器对象
Iterator it = collection.iterator();

//hasNext()有下一个就继续,没有就退出
while (it.hasNext()) {
	System.out.println(it.next());
}

在这里插入图片描述


3.1、Iterator迭代原理

在这里插入图片描述

通过iterator()方法拿到迭代器,然后进行while循环,使用hasNext()方法判断,如果有就继续循环,没有就退出


4、List接口常用方法

4.1、add()和remove()方法

在这里插入图片描述

List list = new ArrayList();

list.add("a");
list.add("b");
list.add("c");
list.add("d");

list.add(1,"皮皮虾");

Iterator iterator = list.iterator();

while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

在这里插入图片描述

add(int index, E element)方法使用不多,因为效率较低。

在这里插入图片描述

List list = new ArrayList();

list.add("a");
list.add("b");
list.add("c");
list.add("a");

System.out.println(list.size());
list.remove(1);
System.out.println(list.size());

在这里插入图片描述


4.2、get()方法

在这里插入图片描述

List list = new ArrayList();

list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add(1,"皮皮虾");

System.out.println(list.get(1));

在这里插入图片描述


4.3、indexOf()lastIndexOf()和方法

在这里插入图片描述
在这里插入图片描述

List list = new ArrayList();

list.add("a");
list.add("b");
list.add("c");
list.add("a");

System.out.println(list.indexOf("A"));

//获取a最后一次出现位置的索引
System.out.println(list.lastIndexOf("a"));

在这里插入图片描述


4.4、set()方法

在这里插入图片描述

List list = new ArrayList();

list.add("a");
list.add("b");
list.add("c");
list.add("a");

list.set(0,"A");

for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}

在这里插入图片描述


5、Set

Set接口时Collection的子接口,seti接口没有提供额外的方法

Set集合不允许包含相同的元素,如果把两个或多个相同的元素加入同一个Set集合中,则添加操作失败。

Set判断两个对象是否相同不是使用==运算符,而是根据equals()方法


5.1、HashSet

作为Set的主要实现类:线程不安全,可以存储null值

Set<Object> objects = new HashSet<>();

objects.add(true);
objects.add("hello3");
objects.add("hello1");
objects.add("hello4");
objects.add("hello2");
objects.add("hello1");
objects.add(18);

System.out.println(objects);

在这里插入图片描述

1. 无序性:不等于随机性,存储的数据在底层数组中并非按照索引的顺序添加,而是根据数据的哈希值决定

2.不可重复性:保证添加的元素按照equals()判断时,不能返回true,即相同的元素只能添加一个


5.2、LinkedSet

HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历

Set<Object> list = new LinkedHashSet<>();

list.add(true);
list.add("hello3");
list.add("hello1");
list.add("hello4");
list.add("hello2");
list.add("hello1");
list.add(18);

System.out.println(list);

在这里插入图片描述

LinkedHashSet作为HashSet的子类,再添加数据的同时,每个数据还维护了两个引用来记录此数据的前一个数据和后一个数据


6、Map常用方法

1、Map和Collection没有继承关系。
2、Map集合以KeyValue的方式存储数据:键值对
          key和value都是引用数据类型
          key和value都是存储对象的内存地址
          key起主导的地位,value是key的一个附属品


6.1、put()方法

在这里插入图片描述

Map<Integer,Object> map = new HashMap<>();

map.put(1,"张三");
map.put(2,"李四");
map.put(3,"王五");

System.out.println(map);

在这里插入图片描述


6.2、containsKey()和containsValue()方法

在这里插入图片描述

Map<Integer,Object> map = new HashMap<>();

map.put(1,"张三");
map.put(2,"李四");
map.put(3,"王五");
map.put(4,"王五");


System.out.println(map.containsKey(3));
System.out.println(map.containsKey(5));
System.out.println(map.containsValue("王五"));
System.out.println(map.containsValue("皮皮虾"));

在这里插入图片描述


6.3、remove()与get()方法

在这里插入图片描述

在这里插入图片描述

Map<Integer,Object> map = new HashMap<>();

map.put(1,"张三");
map.put(2,"李四");
map.put(3,"王五");

map.remove(2);
System.out.println(map);

在这里插入图片描述

通过key删除键值对


6.4、Map遍历(重要)

方式一:在for循环中使用entries实现Map的遍历

Map<Integer,Object> map = new HashMap<>();

map.put(1,"张三");
map.put(2,"李四");
map.put(3,"王五");

for (Map.Entry<Integer,Object> entry: map.entrySet()) {
	System.out.println(entry);
}

在这里插入图片描述

这种方式效率高,因获取key和value都是直接从node对象中获取的属性值

方式二:在for循环中遍历key或者values,一般适用于只需要map中的key或者value时使用,在性能上比使用entrySet较好;

Map<Integer,Object> map = new HashMap<>();

map.put(1,"张三");
map.put(2,"李四");
map.put(3,"王五");

for (Integer key : map.keySet()) {
	System.out.println(key);
}


for (Object value : map.values()) {
	System.out.println(value);
}

在这里插入图片描述

方式三:通过迭代器遍历

Map<Integer,Object> map = new HashMap<>();

map.put(1,"张三");
map.put(2,"李四");
map.put(3,"王五");

Iterator<Map.Entry<Integer, Object>> iterator = map.entrySet().iterator();

while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

在这里插入图片描述


觉得博主写的不错的读者大大们,可以点赞关注和收藏哦,谢谢各位!

博主更多博文

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值