Bootstrap

【Java】集合框架-简介【主线学习笔记】


前言

Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。


一. 数组存储

优点:

  1. 固定长度:数组一旦初始化,长度即确定,不可更改。例如:

  2. 元素有序、紧密排列:数组中的元素按顺序存储,且元素在内存中是连续的。元素是有序的、按索引访问,且可以重复。

  3. 类型确定:数组一旦初始化,其元素类型即确定,且数组只能存储相同类型的元素。若尝试存储不同类型的数据,编译时会报错。例如:

  4. 元素类型多样性:数组可以存储基本数据类型(如 intdouble 等)或引用数据类型(如对象、字符串等)。例如:

弊端:

  1. 固定长度:一旦数组初始化,长度不可变,无法动态调整,可能导致空间浪费或容量不足的情况。

  2. 单一数据特点:数组中的元素必须是相同类型的,无法适应一些无序、不可重复的数据场景。例如,无法处理具有不同属性的数据集合。

  3. 方法和属性有限:数组本身只提供了一些基本操作(如访问元素、修改元素等),没有像集合类(如 ArrayList)那样丰富的方法和属性。在需求复杂的情况下,开发者需要自己编写额外的代码逻辑来满足特定功能。

  4. 针对数组中元素的删除、插入操作,性能较差。

二. Java集合框架体系(java.util包下)

  1. java.util.Collection 接口:存储一个或多个元素的数据结构集合的根接口。
    List 接口存储有序且可重复的数据。元素按插入顺序排列,可以包含重复元素。实现类有: ArrayList:基于动态数组实现,支持快速随机访问,但在中间插入和删除性能较差。 LinkedList:基于双向链表实现,支持高效的插入和删除操作,但随机访问性能较差。 Vector:与 ArrayList类似,但 Vector是线程安全的,通常不推荐使用,因为性能较低。
    Set 接口存储无序且不可重复的数据。集合中没有重复元素。实现类有: HashSet:基于哈希表实现,元素无序且不重复,查找速度快。LinkedHashSet:基于哈希表和链表实现,保持插入顺序,但元素仍不可重复。TreeSet:基于红黑树实现,存储元素时会进行排序,因此元素是有序的。

  2. java.util.Map 接口存储一对一对(键值对)数据的集合,键和值是不同的数据类型。 实现类有:HashMap:基于哈希表实现,存储键值对,键是唯一的,无序存储;LinkedHashMap:继承自 HashMap,保持插入顺序或访问顺序;TreeMap:基于红黑树实现,按键的自然顺序或指定的比较器顺序进行排序;Hashtable:与 HashMap 类似,但 Hashtable是线程安全的,通常不推荐使用;Properties:继承自 Hashtable,用于存储键值对,常用于读取配置文件等场景,键和值都是字符串类型。

1. 集合与数组的相互转换

  1. 集合 → 数组:使用 toArray() 方法。
  2. 数组 → 集合:使用 Arrays.asList() 方法。

2. Collection 接口

常见方法:

  1. add(E e):向集合中添加元素。
  2. remove(Object o):从集合中移除指定元素。
  3. contains(Object o):检查集合是否包含某个元素。
  4. size():返回集合中元素的个数。
  5. isEmpty():检查集合是否为空。
  6. clear():清空集合中的所有元素。
  7. toArray():将集合转换为数组。

向 Collection 中添加元素的要求

要求:元素类必须重写 equals() 方法。
原因:Collection 的方法(如 contains() 和 remove())依赖 equals() 判断元素是否相同。当判断是否含有某元素的到时候,要调用该元素所属类的equals方法。

class Person {
    String name;
    int age;

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name);
    }
}

三. 迭代器(iterator)

作用:用来遍历集合元素。

1. 使用方法

获取迭代器对象:

Iterator iterator = coll.iterator();

实现遍历的方法:

Collection coll = new ArrayList();
coll.add("AA");
coll.add("AA");
Person p1 = new Person("zhangsan");
coll.add(p1);
coll.add(123);
coll.add(new String(("zhangsan")));
Iterator iterator = coll.iterator();
for (int i = 0; i < coll.size(); i++) {
            System.out.println(iterator.next());
        }

或者

while (iterator.hasNext()){
    //next()作用:指针下移;将下移以后集合位置上的元素返回 
    System.out.println(iterator.next());
}

2. 增强for循环(foreach循环)

作用:遍历数组、集合
注意:增强for循环的执行过程中,是将集合或数组中的元素依次赋值给临时变量,注意,循环体中对临时变量的修改,可能不会导致原有集合或数组中元素的修改。

格式:
遍历集合,针对集合来讲,增强for循环底层仍然是使用的迭代器

for (Object obj : coll){
    System.out.println(obj);
}

遍历数组

public void test2(){
    int[] arr = new int[]{1,2,3,4,5};
    for(int i:arr){
        System.out.println(i);
    }
}
;