Java集合——基础
1. 数组和集合的区别数组是固定长度的数据结构一旦创建长度就无法改变而集合是动态长度的数据结构可以根据需要动态增加或减少元素。集合的底层本质是数组数组可以包含基本数据类型和对象而集合只能包含对象。数组只能存储同一数据类型集合可以存储不同数据类型数组可以直接访问元素而集合需要通过迭代器或其他方法访问元素。2. Java中的集合Java集合框架主要包括两种类型的容器一种是集合Collection存储一个元素集合另一种是图Map存储键/值对映射java集合可分为Set、List、Queue和Map四种体系。集合的实质是类Collection是一个接口set、list、queue是其实现类Java集合就像一种容器可以把多个对象实际上是对象的引用但习惯上都称对象“丢进”该容器中。从Java 5 增加了泛型以后Java集合可以记住容器中对象的数据类型使得编码更加简洁、健壮。1ListList是有序输入和输出的顺序一致可重复的Collection使用此接口能够精确的控制每个元素的插入位置用户能根据索引访问List中元素。常用的实现List的类有LinkedListArrayListVectorStack。ArrayList是容量可变的非线程安全列表其底层使用数组实现。当几何扩容时会创建更大的数组并把原数组复制到新数组。ArrayList支持对元素的快速随机访问但插入与删除速度很慢。LinkedList本质是一个双向链表与ArrayList相比其插入和删除速度更快但随机访问速度更慢。2Setset不允许存在重复的元素与List不同set中的元素是无序输入和输出的顺序不一致set内部自动排序改变了输出顺序的。常用的实现有HashSetLinkedHashSet和TreeSetHashSet通过HashMap实现HashMap的Key即HashSet存储的元素所有Key都是用相同的Value一个名为PRESENT的Object类型常量。使用Key保证元素唯一性但不保证有序性。由于HashSet是HashMap实现的因此线程不安全。LinkedHashSet继承自HashSet通过LinkedHashMap实现使用双向链表维护元素插入/顺序。TreeSet通过TreeMap实现的添加元素到集合时按照比较规则将其插入合适的位置保证插入后的集合仍然有序。3MapMap是一个键值对集合存储键、值和之间的映射。Key无序唯一value不要求有序允许重复。Map没有继承于Collection接口从Map集合中检索元素时只要给出键key对象就会返回对应的值对象。主要实现有TreeMap、HashMap、HashTable、LinkedHashMap、ConcurrentHashMapHashMapJDK1.8之前HashMap由数组链表组成的数组是HashMap的主体链表则是主要为了解决哈希冲突而存在的“拉链法”解决冲突JDK1.8以后在解决哈希冲突时有了较大的变化当链表长度大于阀值默认为8且数组长度大于等于64时将链表转化为红黑树以减少搜索时间LinkedHashMapLinkedHashMap继承自HashMap所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外LinkedHashMap在上面结构的基础上增加了一条双向链表使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作实现了访问顺序相关逻辑。HashTable数组链表组成的数组是HashTable的主体链表则是主要为了解决哈希冲突而存在的TreeMap红黑树自平衡的排序二叉树ConcurrentHashMapNode数组链表红黑树实现线程安全的jdk1.8以前Segment锁1.8以后volatile CAS或者synchronized)3. Collection和Collections的区别Collection是Java集合框架中的一个接口它是所有集合类的基础接口。它定义了一组通用的操作和方法如添加、删除、遍历等用于操作和管理一组对象。Collection接口有许多实现类如List、Set和Queue等。Collections注意有一个s是Java提供的一个工具类位于java.util包中。它提供了一系列静态方法用于对集合进行操作和算法。Collections类中的方法包括排序、查找、替换、反转、随机化等等。这些方法可以对实现了Collection接口的集合进行操作如List和Set。4. 集合的遍历有哪些普通for循环可以使用带有索引的普通for循环来遍历 List。ListString list new ArrayList(); list.add(A); list.add(B); list.add(C); for (int i0; i list.size(); i){ String element list.get(i); System.out.println(element); }增强for循环for-each循环用于循环访问数组或集合中的元素。ListStringlistnew ArrayList(); list.add(A); list.add(B); list.add(c); for (String element : list){ System.out.println(element); }Iterator迭代器可以使用迭代器来遍历集合特别适用于需要删除元素的情况。ListString list new ArrayList(); list.add(A); list.add(B); list.add(c); IteratorString iterator list.iterator(); while(iterator.hasNext()){ String element iterator.next(); System.out.println(element); }Listlterator列表迭代器Listlterator是迭代器的子类可以双向访问列表并在迭代过程中修改元素。ListString list new ArrayList(); list.add(A); list.add(B); list.add(c); ListIteratorString listIterator list.listIterator(); while(listIterator.hasNext()){ String element listIterator.next(); System.out.println(element); }使用forEach方法Java8引入了forEach方法可以对集合进行快速遍历。ListString list new ArrayList(); list.add(A); list.add(B); list.add(c); list.forEach(element-System.out.println(element));StreamAPlJava8的StreamAPI提供了丰富的功能可以对集合进行函数式操作如过滤、映射等。ListString list new ArrayList(); list.add(A); list.add(B); list.add(C); list.stream().forEach(element-System.out.println(element));
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2425931.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!