java集合浅析
来源:互联网 发布:淘宝商品拍照技巧 编辑:程序博客网 时间:2024/06/06 03:41
数据需要集中存放时,要是事先已经知道要保存的数据的数量,可以选择使用数组。需要保存一个动态增长的数据,java集合类就是一个比较好的设计方案。
集合可主要负责盛装数据,所以也称为容器类。所有的集合类都存放在java.util包下。为了处理多线程环境下并发安全问题,在java.util.concurrent包下提供了一些多线程支持的集合类。
java集合类主要由Collection和Map接口派生而出,这两个接口包含了一些接口和实现类。
从上图的思维导图大概可以看出基本的关系。List和Set是Collection派生出来的两个子接口,Query是java提供的队列实现,类似于List。Map用于保存具有映射关系的数据。List、Set、Map可以看做集合的三大类。对于这三种集合,最常用的实现类分别是ArrayList、HashSet、HashMap。
从上图中可以看出,集合类主要分为两大类:Collection和Map。
Collection是List、Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主要又分为两大部分:List和Set。
List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。
Set接口通常表示一个集合,其中的元素不允许重复(通过hashcode和equals函数保证),常用实现类有HashSet和TreeSet,HashSet是通过Map中的HashMap实现的,而TreeSet是通过Map中的TreeMap实现的。另外,TreeSet还实现了SortedSet接口,因此是有序的集合(集合中的元素要实现Comparable接口,并覆写Compartor函数才行)。
我们看到,抽象类AbstractCollection、AbstractList和AbstractSet分别实现了Collection、List和Set接口,这就是在Java集合框架中用的很多的适配器设计模式,用这些抽象类去实现接口,在抽象类中实现接口中的若干或全部方法,这样下面的一些类只需直接继承该抽象类,并实现自己需要的方法即可,而不用实现接口中的全部抽象方法。
Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。
Iterator是遍历集合的迭代器(不能遍历Map,只用来遍历Collection),Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。而Enumeration则是JDK1.0时引入的,作用与Iterator相同,但它的功能比Iterator要少,它只能再Hashtable、Vector和Stack中使用。
Arrays和Collections是用来操作数组、集合的两个工具类,例如在ArrayList和Vector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本,当然了,如果要用线程安全的结合类,首选Concurrent并发包下的对应的集合类。
原文请参考(感谢原文作者):http://www.importnew.com/19853.html
下面列举一些常用的集合的操作
1. 遍历删除List集合中的元素
常犯的错误:
List<String> list1 = new ArrayList<>();list1.add("java");list1.add("go");list1.add("js");list1.add(null);for (int i = 0; i < list1.size(); i++) { list1.remove(list1.get(i));}System.out.println(list1.toString()); // [go, null]
看到上面最后打印的并不是一个空集合。
当我们使用这种方法删除元素时,他底层删除元素的方法是使用数组删除元素的方式,将要删除的元素截取掉放在新的数组中,最后返回的是一个新的集合,但是我们循环遍历时,i是增加的,所以不是从下标是0的位置开始循环遍历的,所以总是有部分元素会被漏掉。下面有2种方法可以正确的删除集合中的元素。
方法一:
使用迭代器Iterator。
List<String> list2 = new ArrayList<>();list2.add("java");list2.add("go");list2.add("js");list2.add(null);Iterator<String> it = list2.iterator();while (it.hasNext()) { // 判断集合中是否还存在元素 it.next(); // 将游标指向找到的这个元素,并返回这个元素 it.remove(); // 删除游标指向的元素}System.out.println(list2.toString()); // []
使用上面这种方法就可以很好的删除集合中的元素。迭代器可以记住游标的位置。
方法一:
直接看代码
List<String> list3 = new ArrayList<>();list3.add("java");list3.add("go");list3.add("js");list3.add("java");list3.add(null);for (int i = 0; i < list3.size(); i++) { if (list3.get(i) != "java") { list3.remove(i); i--; }}System.out.println(list3.toString());
上面说了,这种删除是对数组的操作,所以只要知道它实现的方法,就不难找出解决办法。但是在删除数组中元素时并不建议使用这种方法。还是使用java提供的Iterator迭代器比较好,即就是使用第一种方法。
- java集合框架浅析
- 浅析java集合
- java集合框架浅析
- Java集合浅析
- 浅析java集合框架
- 浅析java集合框架
- 浅析java集合框架
- java集合框架浅析
- java集合浅析
- JAVA集合浅析
- Java 集合框架浅析
- JAVA集合类Collection浅析
- Thinking in Java之集合框架浅析
- java集合中LinkedList源码浅析
- 牛刀小试 - 浅析Java集合框架的使用
- java学习之集合---浅析HashMap
- 第一章 JAVA集合之HashMap源码浅析
- Java 集合框架 源码浅析 与理解
- HTML初学
- Java如何从HttpServletRequest中读取HTTP请求的body
- Weblogic Jms简单使用
- Kotlin开发工具IntelliJ的下载和创建项目
- ajax请求到后台数据,前台不用拼接字符串append追加HTML标签,一样显示到页面 (使用空模板)
- java集合浅析
- Activity生命周期
- Windows-caffe+vs2013+MATLAB2016b接口配置+调试
- Android Kotlin遇到的坑
- Vue-cli开发SPA应用(适用初学者)
- ntp配置时间同步服务器
- DataGrid中出现在AddNew或EditItem事务过程不允许Deferrefresh报错
- 系统移植相关网址
- 用两个栈实现队列(C++模板)