欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java集合基础——详解篇

程序员文章站 2022-10-03 17:39:32
集合类是Java数据结构的实现。Java的集合类是java.util包中的重要内容,它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。简单点说,集合就是用来装载“元素”的容器,它看上去就像数组,但集合有着数组没有的功能和优点。Java集合可以分为两大类:一类是实现Collection接口;另一类是实现Map接口。Collection是一个基本的集合接口,Collection中可以容纳一组集合元素。Collection接口下,有两个重要的子接口,List和Set。Map接口和Colle...

集合类是Java数据结构的实现。Java的集合类是java.util包中的重要内容,它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。
简单点说,集合就是用来装载“元素”的容器,它看上去就像数组,但集合有着数组没有的功能和优点。
Java集合可以分为两大类:一类是实现Collection接口;另一类是实现Map接口。
Collection是一个基本的集合接口,Collection中可以容纳一组集合元素。Collection接口下,有两个重要的子接口,List和Set。Map接口和Collection是并列关系。Map提供键(key)到值(value)的映射。一个Map中不能包含相同的键,每个键只能映射一个值。这里的键和值也是元素。此外,Iterator也是java.util包中重要接口,它是对Collection进行迭代的迭代器。
List接口,有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的揑入位置迕行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。List接口是使用频率最高的集合API。
java.util.ArrayList 是List接口下常用的实现类。结合应用示例,了解一下List有哪些实用功能:

public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("A");
		list.add("B");
		list.add("C");
		System.out.println(list.get(0));

我们来分析上面的一段代码,首先javascriptList<String> list=new ArrayList<String>();这行代码是在声明一个list的集合对象,List接口是ArratList接口的父类,所以在创建对象的过程中使用了接口回调(子类的实例赋给父类的引用),<String>是泛型,因为我们要将"A"、“B”、"C"这些字符添加进list集合,所以选择String做泛型。list.add("A");list.add("B");list.add("C");System.out.println(list.get(0));这几段代码使用了List集合提供的方法add()和get(),分别用于向list集合中添加元素和访问集合中的元素。
List接口相比数组的优点:
1、数组的长度需要提前定义,而List不需要。
2、List可随意添加新元素,数组受定义的长度限制,添加起来特别麻烦。
3、List可随意移除指定元素,List长度可变。数组无法做到。

Set接口,一个不包含重复元素的 collection。更确切地讲,set 不包含满足e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。HashSet是Set接口下最常用的实现类。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。特别注意,HashSet不是同步的。

		set.add("Hello");
		set.add("World");
		set.add("Every");
		set.add("One");
		for(String i:set) {
			System.out.println(i);
		}
//Lambda表达式遍历法		set.forEach(System.out::println);

运行结果:
Java集合基础——详解篇
从上面的运行结果可以看出Set集合是不保证元素在其中的顺序的。
Map<K,V>接口,将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如HashMap 类。在学习Map接口前,我们先来学习一些它的方法。
我们先来创建一个Map接口的实现类HashMap的实例:
Map<String,String> map=new HashMap<String,String>();
1.添加键值对的方法——put方法:V put(K key, V value)将指定的值与此映射中的指定键关联(可选操作)。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值(当且仅当 m.containsKey(k) 返回 true 时,才能说映射 m 包含键 k 的映射关系)。
黄色字体为我在实际中应用过的一段代码:
public Map<String, Integer> getCensusInfo() {
Map<String, Integer> map = new HashMap<String, Integer>();
// 添加键值对遍历居民信息
for (Map.Entry<String, ResidentList> s : residentList.entrySet()) {
// 存放社区编号
String address1 = s.getValue().getAddress();
// 判断指定居民地址是否存在,如存在统计个数
if (map.containsKey(address1)) {
int count = map.get(address1);
count++;
map.put(address1, count);
}
}
return map;
}

2.获取指定键的值,get方法。返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
3、判断指定键是否存在,containsKey
4、判断指定值是否存在,containsValue
*5、获取键的集合,方法keySet() ,返回的是一个Set集合。
因此,遍历Map集合:
// 传统for写法:
for (String key : map.keySet()) {
//获取键和键所对应的值
System.out.println(“Key:” + key + " Value:" + map.get(key));
}
// lambda表达式遍历方式:
map.forEach((k, v) -> System.out.println(“Key:” + k + " Value:" + v));

6、获取所有值的集合。方法values()
7、移除指定键,remove方法
Map接口的实现类常用的有两个:HashMap和Hashtable
HashMap<K,V>基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。注意,此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。Hashtable<K,V>此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null对象都可以用作键或值。Hashtable 是同步的。
在非多线程应用环境下,HashMap的性能优于Hashtable。

经过上面的学习我们应该对集合有了更深的了解,下面我们来学习一下关于集合的遍历,这里就涉及到迭代器:
Iterator接口,对 collection 进行迭代的迭代器。Iterator只有3个方法。由于Collection接口定义了iterator()方法,因此List和Set都可以进行迭代。结合例子,演示 Iterator如何完成迭代操作:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class A1 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("所到之处,");
		list.add("温暖为向。");
		Iterator<String> ite = list.iterator();
		while (ite.hasNext()) {
			System.out.println(ite.next());
		}
	}
}

运行结果:
Java集合基础——详解篇
对于集合的遍历,迭代的性能高于普通遍历。注意,对Set集合进行迭代时,迭代顺序是无法保证的。迭代过程是单向的。

本文地址:https://blog.csdn.net/wjwForDream/article/details/107654106

相关标签: java 编程语言