本文已参与[新人创作礼]活动, 一起开启掘金创作之路。
前言
学一个东西,我们首先得知道她具体可以用来干嘛
那么 集合是什么,可以用来做什么?
集合的基本概念
集合类主要负责保存、盛放其他数据,因此,集合类也被称之为容器类
Java所有的集合类都位于java.util 包下。
作用
我们知道,Java处处皆对象,所以通常Java程序可以在任何时候、任意位置创建任意数量的对象,
当这些对象的数量多了起来的时候,我们又该如何组织处理她们呢?
因此,Java为我们提供了集合类,可以保存并管理这些数量不确定的对象数据。
集合在Java编程中使用非常广泛,她就像一个万能的容器,可以盛装万物,而且条件允许的话,这个容器似乎还可以无限大。
最经典的使用场景就是 JavaBean结合集合的使用。
与数组的区别
我们前面讲到,集合是用来存放数据的,那你可能一下子就想到了
诶,我们的数组不是也可以用来存放数据
虽然都可以存放数据,但是他们还真就不大一样:
- 数组的长度是固定的,而集合的长度是可变的
- 数组只能存储同一类型的数据,而集合可以存储不同类型的数据
- 集合还可以使用泛型来约束存入的数据
- 当然,集合不可以存入基本类型的数据
集合上手
集合的分类
直接上一张图,一目了然
ArrayList 有序链表类
介绍:
ArrayList是Java中的有序链表类,实现了动态数组,即长度可变。
她允许所有元素,包括null。
每个ArrayList实例的容量可随着不断添加新元素而自动增加。
直接上代码演示:
package stu332;
import java.util.*;
public class DemoArrayList {
public static void main (String[] args){
ArrayList<String> list = new ArrayList<String>();
// 追加元素或增加元素到list对象指定的位置中
list.add("冰镇生鲜");
list.add("侘寂");
list.add("冰可乐");
list.add("热咖啡");
list.add("西湖龙井");
// 显示数组链表中的内容
System.out.println("此ArrayList中的内容为:"+list);
// 检查元素的位置
int position = list.indexOf("热咖啡");
System.out.println("热咖啡的索引位置为:"+position);
// 检查数组链表是否为空
boolean check = list.isEmpty();
System.out.println("判断此ArrayList是否为空:"+check);
// 获取链表的大小
int size = list.size();
System.out.println("此ArrayList的长度为:"+size);
// 检查数组链表中是否包含某元素
boolean element = list.contains("冰可乐");
System.out.println("此ArrayList包含冰可乐的结果为:"+element);
// 获取数组链表指定位置上的元素
String item = list.get(0);
System.out.println("0位置的元素是:"+item);
// 遍历 使用for each循环
System.out.println("用foreach循环遍历集合");
for (String str : list) {
System.out.println("元素是:"+str);
}
// 替换元素
list.set(1, "幽玄");
System.out.println("替换元素后的ArrayList内容为:"+list);
// 移除第0个位置上的元素
list.remove(0);
// 移除第一次找到的西湖龙井
list.remove("西湖龙井");
// 转换ArrayList为数组元素
String[] simpleArray = list.toArray(new String[list.size()]);
System.out.println("该集合列表转成素组元素后:"+Arrays.toString(simpleArray));
}
}
运行结果:
HashSet 哈希集合
介绍:
HashSet是一个无序、没有重复元素且允许null元素但最多只能有一个null元素的集合。
由于HashSet是无序的,所以每组数据都没用索引,凡是需要通过索引来进行操作的方法HashSet都没有
也不能使用普通for循环来进行遍历,只有foreach和迭代器两种遍历方法
直接上代码演示:
package stu332;
import java.util.*;
public class DemoHashSet {
public static void main (String[] args){
HashSet<String> setString = new HashSet<String>();
setString.add("星期一");
setString.add("星期二");
setString.add("星期三");
setString.add("星期四");
setString.add("星期五");
setString.add("星期六");
setString.add("星期日");
// 使用for each循环
for (String item:setString) {
System.out.println(item);
}
}
}
运行结果:
HashMap 哈希映射
介绍:
HashMap是一个用于存储Key-Value的键值对的集合,她允许用一个key去存储数据。
当想获得数据的时候,是通过key去得到数据,所以通常把HashMap的取值比喻成查字典的操作。
直接上代码演示:
package stu332;
import java.util.*;
public class DemoHashMap {
public static void main (String[] args){
HashMap<String,String> hm = new HashMap<String,String>();
hm.put("星期一","吃饭");
hm.put("星期二","睡觉");
hm.put("星期三","打豆豆");
hm.put("星期四","逛街");
hm.put("星期五","喝奶茶");
hm.put("星期六","看电影");
hm.put("星期日","唱跳rap篮球");
System.out.println("-------------foreach----------------");
// 使用for-each循环遍历,对于hash-map并不推荐
for (String item:hm.keySet()) {
System.out.println(item);
}
System.out.println("-------------迭代器----------------");
// 使用迭代器遍历hash-map是效率最高的
Iterator<Map.Entry<String, String>> iterator = hm.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String, String> next = iterator.next();
System.out.println("key="+next.getKey()+"value="+next.getValue());
}
// 因为hashMap内部的存储结构就是基于Entry的数组,在用这种方式进行遍历时,只需要遍历一次即可。
// 而使用其他方式的时间复杂度可以会提高,
// 例如:keySet方式,每次都需要通过key值去计算对应的hash,然后再通过hash获取对应的结果值,因此效率较低。
}
}
运行结果: