概念

Java中的集合是工具类,可以存储任意数量的具有共同属性的对象。
**

集合和数组的区别

用数组存储固定长度的数据,数组是内存中一块连续的空间;
用集合存储动态变化的数据;

集合的应用场景

  • 无法预测存储数据的数量(集合解决动态问题,数组解决静态问题);
  • 同时存储具有一对一关系的数据;
  • 需要进行数据的增删改查;
  • 解决数据重复问题;

集合的框架体系

Java集合 - 图1

  • Collection:存储类的对象Collection有三个子接口,List(序列)、Queue(队列)、Set(集)
    • List:(序列) 有序的、允许重复的 主要实现类:ArrayList:长度动态增长的数组
    • Queue:(队列) 有序的、允许重复的 主要实现类:LinkedList:链表的内容
    • Set:(集)无序的、不允许重复的 主要实现类:HashSet:哈希集
  • Map:键值对内容什么是键值对:比如学生都有对应的学号,通过学号就可以指向某个具体的学生。
    • Map实现类HashMap(哈希表的意思,存储以键值对表示的形式)

List集合

  • List是元素有序并且可以重复的集合,称为序列。
  • List 是一个接口,它继承于Collection的接口。
  • List可以精确地控制每个元素的插入位置,或删除某个位置的元素。
  • List的两个主要实现类:ArrayList和LinkedList。

ArrayList

ArrayList底层是由数组实现的,长度动态增长。ArrayList中的元素可以为null且可以有多个。在列表尾部插入或删除数据非常有效,但是在中间则需要进行大量的数组复制,耗费较多资源。所以更适合查找和更新元素

Collection接口和List接口中方法:
image.png
实现类ArrayList中构造器及方法:
image.png
举例:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class ListDemo1 {
  4. public static void main(String[] args) {
  5. List list = new ArrayList();
  6. list.add("Java");
  7. list.add("C");
  8. list.add("C++");
  9. list.add("Go");
  10. list.add("Swift");
  11. //输出列表中元素的个数
  12. System.out.println("列表中元素的个数为:" + list.size());
  13. //遍历输出所有的集合元素
  14. System.out.println("*****************************");
  15. for(int i = 0; i < list.size(); i++) {
  16. System.out.print(list.get(i) + ",");
  17. }
  18. //移除列表中的C++
  19. System.out.println("\n*****************************");
  20. //list.remove(2);
  21. list.remove("C++");
  22. System.out.println("移除列表中的C++元素后,集合元素为:");
  23. for(int i = 0; i < list.size(); i++) {
  24. System.out.print(list.get(i) + ",");
  25. }
  26. }
  27. }

补充:
add方法的引用
image.png
可以添加String类型的数据,也可以根据指定索引位置进行添加,也可以添加另外一个list集合。
在创建ArrayList对象时,可以规定元素的类型,如

  1. List<String> list = new ArrayList<String>();

查找方法:
contains(o);查找某个元素,返回值为布尔值;
indexOf(); 查找某个元素,返回值为元素的索引,若没有返回-1;

删除方法:
clear(); 清空;
remove(index); 根据指定索引删除;
remove(Object obj); 删除某个指定元素;

修改方法:
set(int index,E element); 根据指定索引替换元素

遍历方法:

  1. for(String str : list) {
  2. System.out.println(str);
  3. }

可以使用增强型for循环;

Set集合

Set中元素无序且不可以重复,称为集。
HashSet是Set的一个重要实现类,称为哈希集。HashSet中的元素无序且不可以重复,HashSet中只允许一个null元素。HashSet底层是HashMap实现。HashSet具有良好的存取和查找性能,所以适合存取和查找的情况。
HashSet 类是按照哈希算法来存储集合中的元素,使用哈希算法可以提高集合元素的存储速度,当向 Set 集合中添加一个元素时,HashSet 会调用该元素的 hashCode() 方法,获取其哈希码,然后根据这个哈希码计算出该元素在集合中的存储位置。

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

新增方法:
add(); 添加元素;

查找方法:
contains(obj);查找是否有某个元素,返回值为布尔值;

删除方法:
remove(); 删除某个元素;
不要通过for循环遍历去删除,因为长度会变。

  1. 删除某个元素
  2. Iterator<String> it = set.iterator();
  3. while(it.hasNext()) {
  4. String next = it.next();
  5. if("b".equals(next)) {//"b"写在前面,防止空指针
  6. it.remove();
  7. }
  8. }

修改方法:
可以先删除后添加,因为是无序的;

遍历方法:
利用迭代器(Iterator),Iterator接口可以以统一的方式对各种集合元素进行遍历;
hasNext()方法检测集合中是否还有下一关元素,它的返回值是boolean类型;
next()方法返回集合中的下一个元素,返回Object类型的对象。

  1. // 在Set集合中没有取元素的方法
  2. // 获取迭代器接口
  3. Iterator it = set.iterator();
  4. // 遍历迭代器并输出元素
  5. while (it.hasNext()) {
  6. System.out.print(it.next() + " ");
  7. }

说明:元素存贮在迭代器中,再通过遍历迭代器来遍历存贮在迭代器中的元素,然后通过hasNext()判断迭代器中是否还有下一个元素,返回ture时再通过next()方法打印出集合中所有元素

Map集合

Map

  • Map中的数据是以键值对(key-value)的形式存储的;
  • key-value以Entry类型的对象实例存在;
  • 可以通过key值快速地查找value;
  • 一个映射不能包含重复的键;
  • 每个键最多只能映射到一个值。

HashMap实现类

  • 基于哈希表的Map接口的实现;
  • 允许使用null值和null键;
  • key值不允许重复;
  • HashMap中的Entry对象是无序排列的。
  1. Map<String, String> map = new HashMap<String, String>();

新增方法:
image.png

  1. map.put("html", "超文本标记语言");

查找方法:
image.png
image.png根据key获取到value
删除方法:
image.png
修改方法:
image.png
遍历方法:
image.png获取到map所有key的集合

  1. Set<String> keys = map.keySet();
  2. for(String str : keys) {
  3. System.out.println(map.get(str));
  4. }