集合,顾名思义,是一组对象的集合。Java集合框架由一些接口和类组成,它们有助于处理不同的集合类型,如列表、集合、地图、堆栈和队列等。
这些随时可用的集合类解决了很多常见问题,我们需要处理同质和异质的对象组。涉及的常见操作有添加、删除、更新、排序、搜索和更复杂的算法。这些集合类使用集合API为所有这些操作提供了非常透明的支持。
目录
1.Java集合的层次结构
在核心接口的帮助下,可以更好地理解集合框架。集合类实现这些接口并提供具体的功能。

Java集合层次结构
1.1.集合
集合接口位于层次结构的根部。集合接口提供了所有集合类必须支持的所有通用方法(或者抛出UnsupportedOperationException )。它扩展了Iterable接口,增加了对使用""语句对集合元素进行迭代的支持。for-each循环"语句对集合元素进行迭代。
所有其他的集合接口和类(除了Map)要么扩展要么实现这个接口。例如,List (索引的,有序的)和Set *(排序的)*接口实现了这个集合。
1.2.列表
列表表示元素的有序集合。使用列表,我们可以通过其整数索引(在列表中的位置)来访问元素,并在列表中搜索元素。索引以0 开始,就像一个数组一样。
一些实现List 接口的有用的类是--ArrayList、CopyOnWriteArrayList、LinkedList、Stack和Vector。
1.3.集合
集合表示一个独特元素的集合。集合不允许有重复的元素。Set接口并不保证以任何可预测的顺序返回元素;尽管有些Set的实现是以元素的自然顺序存储的,并保证这个顺序。
一些实现Set 接口的有用的类有:ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet,LinkedHashSet和TreeSet。
1.4.地图
Map接口使我们能够以键值对的形式存储数据(键应该是不可改变的)。一个Map不能包含重复的键;每个键最多可以映射到一个值。
Map接口提供了三种集合视图,它允许将Map的内容看作是一组键、值的集合或键值映射的集合。一些地图的实现,如TreeMap类,对其顺序做出了具体的保证;其他的,如HashMap类,则没有。
实现Map 接口的一些有用的类有:ConcurrentHashMap,ConcurrentSkipListMap,EnumMap,HashMap,Hashtable,IdentityHashMap,LinkedHashMap,Properties,TreeMap和WeakHashMap。
1.5.堆栈
JavaStack接口表示一个 经典的堆栈数据结构,元素可以被推送到**后进先出(LIFO)**的对象堆栈中。在Stack中,我们把一个元素推到堆栈的顶部,以后再从堆栈的顶部弹出。
1.6.队列
一个队列数据结构的目的是在消费者线程处理之前保存元素(由生产者线程放置)。除了基本的收集操作外,队列还提供额外的插入、提取和检查操作。
队列通常(但不一定)以FIFO(先进先出)的方式排列元素。一个例外是优先级队列,它根据提供的比较器或元素的自然排序来排序元素。
一般来说,队列不支持阻塞式插入或检索操作。阻塞队列的实现类实现了BlockingQueue接口。
一些实现Map 接口的有用的类是--ArrayBlockingQueue、ArrayDeque、ConcurrentLinkedDeque、ConcurrentLinkedQueue、DelayQueue、LinkedBlockingDeque、LinkedBlockingQueue、LinkedList、LinkedTransferQueue、PriorityBlockingQueue、PriorityQueue 和 SynchronousQueue。
1.7.Deque
一个双端队列(发音为"甲板"),支持两端的元素插入和移除。当deque被用作队列时,会产生FIFO(先入先出)行为。当deque被用作堆栈时,会产生LIFO(Last-In-First-Out)行为。
这个接口应该优先于传统的Stack类来使用。当deque被用作堆栈时,元素从deque的开头被推送和弹出。
一些常见的实现这个接口的类是ArrayDeque、ConcurrentLinkedDeque、LinkedBlockingDeque和LinkedList。
2.Java集合和泛型
根据目的,泛型提供类型安全。它可以检测到不兼容的类型(在方法参数中)并防止 ClassCastException在运行时。在Java集合中,我们也可以定义一个集合类来只存储某种类型的对象。所有其他类型都应该被禁止。这是通过泛型来实现的。
在给定的例子中,前两个add()方法是允许的。第三种方法不能编译,并且会出现错误--"类型HashMap<Integer,String> 中的*put(Integer, String)*方法不适用于参数(String, String)"。它有助于及早发现不兼容的类型,以防止在运行时出现不可预测的行为。
Generic HashMap
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "A"); //allowed
map.put(2, "B"); //allowed
map.put("3", "C"); //NOT allowed - Key is string
3.*equals()和hashCode()*方法
许多集合类提供了特定的功能,如排序的元素,没有重复的元素等。为了实现这种行为,添加的元素(对象)必须正确地实现equals() 和 hashCode() 方法。
所有的Java封装类和String类都用它们的具体实现来覆盖这些函数,因此它们在这类集合中的行为是正确的。我们还需要确保这些函数在我们的用户定义的自定义类中被正确重载。
SortedSet<Integer> sortedSet = new TreeSet<>();
sortedSet.add(2);
sortedSet.add(1);
sortedSet.add(1);
sortedSet.add(3);
System.out.println(sortedSet); //[1,2,3]
4.Java 8的变化
Java 8是一个重要的版本,在Java中引入了lambda风格的编程。集合类也因此得到了改进。例如,我们可以在一行中对集合进行迭代,并使用forEach语句对集合中的所有元素执行一个动作。
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.forEach(System.out::print);
5.Java集合的好处
5.1.一致性和可重用的API
这就是框架的作用。它提供了一套一致的类方法,可以用来反复解决一组类似的问题,而不会得到不可预知的结果。Java集合框架也有助于解决与一组对象相关的常见问题--一致的问题。
所有的集合类都有一致的实现,并提供一些常见的方法,如添加、获取、放置、删除等。无论你处理的是哪种数据结构,这些方法都是根据底层实现来工作的,并透明地执行操作。
5.2.更少的开发时间
一个通用的、可预测的框架总是能减少开发时间,并有助于快速地编写应用程序。Java集合也有助于用对象和集合执行一些最重复的普通任务,从而提高时间因素。
5.3.性能
Java集合API是由业内一些最聪明的人编写的,其性能在大多数情况下是一流的。Oracle正在进行的开发工作和一个非常热情的Java开发者社区有助于使它变得更好。
5.4.清晰的代码
这些API的编写采用了所有良好的编码实践,并且记录得非常好。它们在整个Java集合框架中遵循一定的标准。这使得程序员的代码看起来很好很干净。
由于类和方法名称的一致性,代码也更容易阅读。
6.进一步阅读
学习愉快!!
这个帖子对你有帮助吗?
如果你喜欢这个帖子,请告诉我们。这是我们改进的唯一方法。
是的
没有