文章目录
- 前言
- 一. 数组存储
- 优点:
- 弊端:
- 二. Java集合框架体系(java.util包下)
- 1. 集合与数组的相互转换
- 2. Collection 接口
- 常见方法:
- 向 Collection 中添加元素的要求
- 三. 迭代器(iterator)
- 1. 使用方法
- 2. 增强for循环(foreach循环)
前言
Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。
一. 数组存储
优点:
-
固定长度:数组一旦初始化,长度即确定,不可更改。例如:
-
元素有序、紧密排列:数组中的元素按顺序存储,且元素在内存中是连续的。元素是有序的、按索引访问,且可以重复。
-
类型确定:数组一旦初始化,其元素类型即确定,且数组只能存储相同类型的元素。若尝试存储不同类型的数据,编译时会报错。例如:
-
元素类型多样性:数组可以存储基本数据类型(如
int
、double
等)或引用数据类型(如对象、字符串等)。例如:
弊端:
-
固定长度:一旦数组初始化,长度不可变,无法动态调整,可能导致空间浪费或容量不足的情况。
-
单一数据特点:数组中的元素必须是相同类型的,无法适应一些无序、不可重复的数据场景。例如,无法处理具有不同属性的数据集合。
-
方法和属性有限:数组本身只提供了一些基本操作(如访问元素、修改元素等),没有像集合类(如
ArrayList
)那样丰富的方法和属性。在需求复杂的情况下,开发者需要自己编写额外的代码逻辑来满足特定功能。 -
针对数组中元素的删除、插入操作,性能较差。
二. Java集合框架体系(java.util包下)
-
java.util.Collection 接口:存储一个或多个元素的数据结构集合的根接口。
List 接口:存储有序且可重复的数据。元素按插入顺序排列,可以包含重复元素。实现类有:ArrayList
:基于动态数组实现,支持快速随机访问,但在中间插入和删除性能较差。LinkedList
:基于双向链表实现,支持高效的插入和删除操作,但随机访问性能较差。Vector
:与 ArrayList类似,但 Vector是线程安全的,通常不推荐使用,因为性能较低。
Set 接口:存储无序且不可重复的数据。集合中没有重复元素。实现类有:HashSet
:基于哈希表实现,元素无序且不重复,查找速度快。LinkedHashSet
:基于哈希表和链表实现,保持插入顺序,但元素仍不可重复。TreeSet
:基于红黑树实现,存储元素时会进行排序,因此元素是有序的。 -
java.util.Map 接口:存储一对一对(键值对)数据的集合,键和值是不同的数据类型。 实现类有:
HashMap
:基于哈希表实现,存储键值对,键是唯一的,无序存储;LinkedHashMap
:继承自 HashMap,保持插入顺序或访问顺序;TreeMap
:基于红黑树实现,按键的自然顺序或指定的比较器顺序进行排序;Hashtable
:与 HashMap 类似,但 Hashtable是线程安全的,通常不推荐使用;Properties
:继承自 Hashtable,用于存储键值对,常用于读取配置文件等场景,键和值都是字符串类型。
1. 集合与数组的相互转换
- 集合 → 数组:使用 toArray() 方法。
- 数组 → 集合:使用 Arrays.asList() 方法。
2. Collection 接口
常见方法:
- add(E e):向集合中添加元素。
- remove(Object o):从集合中移除指定元素。
- contains(Object o):检查集合是否包含某个元素。
- size():返回集合中元素的个数。
- isEmpty():检查集合是否为空。
- clear():清空集合中的所有元素。
- 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);
}
}