一:集合的介绍
Java集合(Java Collections)是Java编程语言中一个重要的部分,用于存储和操作一组对象。Java集合框架提供了一套预定义的类和接口,使得程序员能够轻松地处理数据集合,如数组、列表、队列、栈、集合、映射等。
集合与数组的区别
数组和集合类同是容器,数组虽然也可以存储对象,但其长度是
固定的,而集合的长度是可变的。
数组只能存储同种数据类型的数据,包含基本数据类型和对象引
用类型,而集合只能存储对象,并且可以存储不同类型的对象。
数组和集合类同是容器,数组虽然也可以存储对象,但其长度是
固定的,而集合的长度是可变的。
数组只能存储同种数据类型的数据,包含基本数据类型和对象引
用类型,而集合只能存储对象,并且可以存储不同类型的对象。
二:Java集合框架主要包括:
- 接口:这些是抽象数据类型,表示不同类型的集合,如 Set、List、Queue、Deque 和 Map。每种类型的集合都有其特定的使用场景。
- 实现类:这些是实现上述接口的具体类。例如,ArrayList 和 LinkedList 是 List 接口的实现类;HashSet 和 TreeSet 是 Set 接口的实现类;HashMap 和 TreeMap 是 Map 接口的实现类。
- 算法:Java 集合框架提供了一系列高效的算法来操作这些集合,如排序和搜索。
- 迭代器:迭代器(Iterator)是一种设计模式,用于遍历容器(特别是列表和集合)。
三:ArrayList类和HashMap集合
1:ArrayList类
ArrayList是List接口的直接实现类,实现了可变的数组功能。
优点:允许包含所有元素,包括NULL,使用ArrayList可以根据索引位
置对集合进行快速地随机访问。
缺点:向指定的索引位置插入对象或删除对象的速度较慢,因为向索引
位置插入对象时会将指定索引位置及之后的所有对象相应向后移
动一位。
2:ArrayList构造方法
3:ArrayList类常用方法
增加元素到列表中 | 1:boolean add(Element e)--增加指定元素到列表尾部。 2:void add(int index, Element e)--增加指定元素到列表指定位置。 |
检查列表是否为空 | boolean isEmpty()--返回true表示列表中没有任何元素。 |
获取列表大小 | int size()--返回列表长度(列表包含元素的个数)。 |
搜索元素 | 1:boolean contains(Object o)--如果列表包含指定元素,返回true。 2:int indexOf(Object o)--返回元素在列表中第一次出现的位置, 如果返回-1,表示列表中没有这个元素。 3:int lastIndexOf(Object o)--返回元素在列表中最后一次出现的位 置,如果返回-1,表示列表中没有这个元素。 |
获取列表中的元素 | E get(int index)--获取列表中指定位置处的元素,E为对应的元 素类型。 |
修改某个元素 | E set(int index, E element)--将列表中指定位置上的元素替换 成新元素,E为对应的元素类型。 |
从列表中删除元素 | 1:E remove(int index)--删除列表中指定位置的元素,E为对应的元 素类型。 2:boolean remove(Object o)--删除列表中首次出现的指定元素 (如果存在)。
|
4:程序举例
1.产生10个50-100之间的随机数,并放到一个数组中,把数组中大于或等于
80的数放到一个list集合中,并打印到控制台。
运行结果
2:HashMap集合
HashMap是基于哈希表的 Map 接口的实现。
1:在HashMap中,key-value总是会当做一个整体来处理,系统会
根据hash算法来计算key-value的存储位置,可以通过key快速
地存取value,因此HashMap在添加和删除映射关系时的效率更
高。
2:HashMap允许使用null值和null键,但必须保证键的唯一性。
3:HashMap通过哈希表对其内部的映射关系进行快速查找,但
HashMap不能保证映射的顺序。
4:常用方法
添加元素功能 | V put(K key,V value)--添加元素,如果键是第一次存储,就直接 存储元素,返回null;如果键不是第一次存储,之前已经存在,就 用值把以前的值替换掉并返回以前的值。 |
检查集合是否为空 | boolean isEmpty()--返回true表示列表中没有任何元素。 |
获取集合大小 | int size()--返回集合中的键值对的个数。 |
查询功能 | 1:boolean containsKey(Object key)--判断集合是否包含指定的键:2:boolean containsValue(Object value)--判断集合是否包含指定 的值。 |
获取元素功能 | 1:V get(Object key)--根据键获取值。 2:Set<K> keySet()--获取集合中所有键的集合。 3:Collection<V> values()--获取集合中所有值的集合。 |
删除元素功能 | 1:V remove(Object key)--根据键删除键值对元素,并把值返回 :2:void clear()--移除所有的键值对元素。 |
HashMap构造方法 | HashMap():构造一个空的 HashMap ,默认初始容量(16) |
5:程序举例
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
// 创建一个HashMap对象
Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("Alice", 25);
map.put("Bob", 30);
map.put("Charlie", 35);
// 获取键对应的值
int aliceAge = map.get("Alice");
System.out.println("Alice's age: " + aliceAge);
// 遍历键值对
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String name = entry.getKey();
int age = entry.getValue();
System.out.println(name + " is " + age + " years old.");
}
// 判断键是否存在
if (map.containsKey("Bob")) {
System.out.println("Bob exists in the map.");
} else {
System.out.println("Bob does not exist in the map.");
}
// 删除键值对
map.remove("Charlie");
System.out.println("Charlie has been removed from the map.");
}
}
我们创建了一个HashMap对象,并向其中添加了三个键值对。然后,我们通过键获取对应的值,并遍历整个HashMap,输出每个键值对的内容。最后,我们判断一个键是否存在,并删除一个键值对。
3:遍历
1:ArrayList集合列表元素的遍历
public static void main(String[] args){
List<String> list=new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
//遍历列表中的所有元素
System.out.println("方法1:使用元素的索引和列表的大小");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
System.out.println("方法2:使用foreach循环");
for(String s :list){
System.out.println(s);
}
System.out.println("方法3:使用迭代器");
Interator<String> it=list.iterator();
while(it.hashNext()){
System.out.println(it.next());
}
}
-
2:Map集合的遍历
在foreach循环中遍历keys或values | 如果只需要map中的键或者值,可以通过keySet或values来实 现遍历。 |
在foreach循环中使用entries遍历(推荐使用) | 1:Set<Map.Entry<K,V>> entrySet() --返回此map中包含的映 射关系的Set视图。 2:Map.Entry:描述在一个Map中的一个元素(键/值对),是一 个 Map 的内部接口。 |
使用Iterator遍历 | 1:从性能方面看,该方法类同于foreach遍历的性能。 2:在老版本java中这是遍历map的唯一方式。 |
通过键找值遍历 | 该方法代码简洁但实际上效率较低,因为从键取值是耗时的操作, 所以尽量避免使用 |
4: 泛型
1:泛型的介绍:
1:泛型是一种参数化类型的机制,它可以使得代码适用于各种类
型,从而编写更加通用的代码。
2:在泛型使用过程中,操作的数据类型被指定为一个参数,这种参
数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接
口、泛型方法。
2:泛型的作用
类型安全集合默认的存储类型为Object类型,向list对象加入了一个字符
串类型的值和一个Integer类型的值,这样是合法的操作。
2:在之后的循环中进行取值强转时,由于忘记了之前在list中加入
了Integer类型的值或其他原因,运行时会出现
java.lang.ClassCastException异常。
3: 为了解决这个问题,泛型应运而生。Java泛型编程是JDK1.5版本后
引入的,泛型让编程人员能够使用类型抽象,通常用于集合里面。
4:通过使用List<String>直接限定了List集合中只能存储String类型的
元素。那么就会在编译list.add(100)时报错,从而避免了在运行时发
生错误。由于集合记住元素的类型信息,因此无须再进行强制类型
转换。
5:类型安全,消除强制类型转换
6:
4:总结
Java集合框架的接口与具体实现分离,各种类型的集合接口与具体实现可以方便地相互转换,使开发者能够灵活地使用不同的集合类型,从而提高程序的效率和可维护性。总之而言,Java集合框架为开发者提供了丰富、高效、可复用的数据结构和算法,有助于提高程序的质量和效率。