集合(list、set 和 map)与数组
一、集合和数组的区别
- 数组声明了它容纳的元素的类型,而集合不声明。
- 数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。
- 数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是 Object)。
- 数组是 java 语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。
二、集合
Java 集合框架提供了一套性能优良、使用方便的接口和类,它们位于 java.util 包中
Java 集合框架(常用接口)
- List 接口存储一组“不唯一,有序(插入顺序)的对象”
- Set 接口存储一组“唯一,无序的对象”
- Map 接口存储一组“键值对象,提供 key 到 value 的映射”
1 List 接口集合(list、set 和 map)与数组
List 是一个继承于 Collection 的接口,即 List 是集合中的一种。List 是有序的队列,List 中的每一个元素都有一个索引;第一个元素的索引值是 0,往后的元素的索引值依次 +1。和 Set 不同,List 中允许有重复的元素。实现 List 接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
- 可以允许重复的对象。
- 可以插入多个 null 元素。
- 是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
- 常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
2 Set 接口
Set 是一个继承于 Collection 的接口,Set 是一种不包括重复元素的 Collection。它维持它自己的内部排序,所以随机访问没有任何意义。与 List 一样,它同样运行 null 的存在但是仅有一个。由于 Set 接口的特殊性,所有传入 Set 集合中的元素都必须不同,关于 API 方面。Set 的 API 和 Collection 完全一样。实现了 Set 接口的集合有:HashSet、TreeSet、LinkedHashSet、EnumSet。
- 不允许重复的对象,重复元素会被覆盖掉。
- 无序容器,你无法保证每个元素的存储顺序,TreeSet 通过 Comparator 或者 Comparable 维护了一个排序顺序。
- 只允许一个 null 元素
- Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
3 Map 接口
Map 与 List、Set 接口不同,它是由一系列键值对组成的集合,提供了 key 到 Value 的映射。在 Map 中它保证了 key 与 value 之间的一一对应关系。也就是说一个 key 对应一个 value,所以它不能存在相同的 key 值,当然 value 值可以相同。实现 map 的集合有:HashMap、HashTable、TreeMap、WeakHashMap。
- Map 不是 collection 的子接口或者实现类。Map 是一个接口。
- Map 的每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
- TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
- Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
- Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
三、常用方法
1 数组
- 数组转换为集合:
Arrays.asList(T...a)
String[] stringArray = { "a", "b", "c", "d", "e" };
//转换为 ArrayList<String>
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
System.out.println(arrayList);//输出 [a, b, c, d, e]
//转换为 HashSet<String>
Set<String> set = new HashSet<String>(Arrays.asList(stringArray));
System.out.println(set);//输出 [d, e, b, c, a]
- 合并两个数组:
addAll()
int[] intArray = { 1, 2, 3, 4, 5 };
int[] intArray2 = { 6, 7, 8, 9, 10 };
// Apache Commons Lang 库
int[] combinedIntArray = ArrayUtils.addAll(intArray, intArray2);
- 数组转置:
reverse()
int[] intArray = { 1, 2, 3, 4, 5 };
ArrayUtils.reverse(intArray);
//[5, 4, 3, 2, 1]
System.out.println(Arrays.toString(intArray));
- 数组包含值:
Arrays.asList(stringArray).contains()
String[] stringArray = { "a", "b", "c", "d", "e" };
boolean b = Arrays.asList(stringArray).contains("a");
//链式编程,先载入 list 中再使用 contains 判断
System.out.println(b);
// true
- 复制数组:
copyOfRange(T[ ] original,int from,int to)
int a[]={2,5,8,4};
int b[]=Arrays.copyOfRange(a, 0, 4);
//Arrays.copyOfRange(T[ ] original,int from,int to) 将一个原始的数组 original,从下标 from 开始复制,复制到上标 to,生成一个新的数组。注意这里包括下标 from,不包括上标 to。
- 数组排序:
sort()
int a[]={2,5,8,4};
Arrays.sort(a); //升序排序
- 数组长度:
a.length
- 增加元素:
add()
- 删除元素:
remove()
2 ArrayList
与 HashSet 类似
- ArrayList 转换为数组:
Collection.toArray()
String[] stringArray = { "a", "b", "c", "d", "e" };
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
String[] stringArr = new String[arrayList.size()];
arrayList.toArray(stringArr);
for (String s : stringArr)
System.out.println(s);
- 添加一个元素:
add()
- 添加一个集合:
addAll()
- 在指定位置加入一个元素:
add(index, element)
- 删除一个元素:
remove()
- 删除一个集合:
removeAll()
- 替换元素:
set(index, element)
- 集合长度:
size()
- 查找某个元素:
indexOf()
- 看是否包含:
contains()
- 截取子集合:
subList(int fromIndex, int toIndex)
- 遍历
// for 循环遍历
for(int i = 0; i < arrayList.size(); i++) {
System.out.println(arrayList.get(i));
}
// for-each 方法
for(Object o:arrayList) {
System.out.println(o);
}
// 用迭代器
Iterator iterator = arrayList.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
3 HashMap
- 存一个值:
map.put("1", 1)
; //向 map 中添加值(返回这个 key 以前的值,如果没有返回 null) - 存集合:
map.putAll(map1)
- 取值:
map.get()
- 判空:
map.isEmpty()
- 判断是否含有 key:
map.containsKey("DEMO")
- 判断是否含有 value:
map.containsValue(1)
- 删除这个 key 值下的 value:
map.remove("1")
- 删除这个 key 和 value:
map.remove("DEMO2", 2)
- 显示所有的 value 值:
System.out.println(map.values())
- 显示所有的 key 和 value:
System.out.println(map.entrySet())
- 元素个数:
map.size()
- 替换这个 key 的 value:
map.replace("DEMO2", 1)
- 清空 hashmap:
map.clear()
- Hashmap 的克隆:
Object clone = map.clone()
- 遍历 value
import java.util.*;
public class Main {
public static void main(String[] args) {
HashMap< String, String> hMap =
new HashMap< String, String>();
hMap.put("1", "1st");
hMap.put("2", "2nd");
hMap.put("3", "3rd");
Collection cl = hMap.values();
Iterator itr = cl.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}