Java 集合概览
Java 集合,由两大接口派生而来:一个是 Collection
接口,主要用于存放单一元素;另一个是 Map
接口,主要用于存放键值对。对于Collection
接口,下面又有三个主要的子接口:List
、Set
、 Queue
。
List, Set, Queue, Map 四者的区别?
List
: 存储的元素是有序的、可重复的。Set
: 存储的元素不可重复的。Queue
: 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。Map
: 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),“x” 代表 key,“y” 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值
为什么要使用集合?
因为在实际开发中,存储的数据类型多种多样且数量不确定。Java 集合可以提高数据的存储和处理灵活性
为什么要使用集合?
与数组相比,Java 集合框架中的各种集合类和接口可以存储不同类型和数量的对象,同时还具有多样化的操作方式。相较于数组,Java 集合的优势在于它们的大小可变、支持泛型、具有内建算法等。
总之,Java 集合提高了数据的存储和处理的灵活性,可以更好地适应现代软件开发中多样化的数据需求
哪些集合类是线程安全的?哪些不安全?
线性安全的集合类:
Vector(比ArrayList多了同步机制)
Hashtable
ConcurrentHashMap:是一种高效并且线程安全的集合。
Stack:栈,继承于Vector。
线性不安全的集合类:
Hashmap
Arraylist
LinkedList
HashSet
TreeSet
TreeMap
集合遍历
- 使用增强for循环,size()和get(int index)结合
List<String> list = Arrays.asList("hangge","google","baidu");
for(String s : list) {
System.out.println(s);
}
如何遍历map键值对集合?使用map的keySet方法
for(String key : map.keySet()) {
System.out.println(key +map.get(key))
}
- 与 for-each 循环相比,使用 Iterator 的方式更加灵活,因为它允许手动控制迭代过程。例如在迭代过程中修改集合、跳过元素或在多个集合之间进行迭代
List<String> list = Arrays.asList("hangge", "google", "baidu");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s.equals("google")) {
iterator.remove();
}
}
- 可以使用 forEach() 方法来迭代列表的元素,这个方法在 Iterable 接口中定义。
List<String> list = Arrays.asList("hangge", "google", "baidu");
list.forEach(element -> {
System.out.println(element);
});
数组转集合可能出现的坑
Arrays.asList()
方法,我们可以使用它将一个数组转换为一个 List
集合。
1、Arrays.asList()
是泛型方法,传递的必须是对象,而不是基本类型。当传入一个存储基本类型数据的数组时,Arrays.asList()
的真正得到的参数不是数组中的元素,而是数组对象本身!此时 List
的唯一元素就是这个数组
举例:
int[] myArray = {1, 2, 3};
List myList = Arrays.asList(myArray);
System.out.println(myList.size());//1(只有myArray这个对象)
System.out.println(myList.get(0));//数组地址值
System.out.println(myList.get(1));//报错:ArrayIndexOutOfBoundsException
解决方法:
Integer[] myArray = {1, 2, 3};//int化为Integer
2、使用集合的修改方法: add()
、remove()
、clear()
会抛出异常。
List myList = Arrays.asList(1, 2, 3);
myList.add(4);//运行时报错:UnsupportedOperationException
myList.remove(1);//运行时报错:UnsupportedOperationException
myList.clear();//运行时报错:UnsupportedOperationException
原因:
Arrays.asList()
方法返回是 java.util.Arrays
的一个内部类这个内部类并没有重写这些方法。
如何正确的将数组转换为 ArrayList
?
1.
List list = new ArrayList<>(Arrays.asList("a", "b", "c"))
2、使用 Stream
(推荐)
Integer [] myArray = { 1, 2, 3 };
List myList = Arrays.stream(myArray).collect(Collectors.toList());
//基本类型也可以实现转换(依赖boxed的装箱操作)
int [] myArray2 = { 1, 2, 3 };
List myList = Arrays.stream(myArray2).boxed().collect(Collectors.toList());