Java集合基础——详解篇
集合类是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);
运行结果:
从上面的运行结果可以看出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());
}
}
}
运行结果:
对于集合的遍历,迭代的性能高于普通遍历。注意,对Set集合进行迭代时,迭代顺序是无法保证的。迭代过程是单向的。
本文地址:https://blog.csdn.net/wjwForDream/article/details/107654106
上一篇: io流操作文件--读取,遍历,规整
下一篇: 香港适合情侣去的浪漫景点大全