集合(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());
     }
   }
}
posted @ 2022-02-07 16:16  琪有此理  阅读(463)  评论(0编辑  收藏  举报