Java容器collection
- 容器,顾名思义。也就是我们用来装载我们的数据,这些数据包括:字符串,数字,对象或者其它数据。
衍生类:set、list、map
- 我们的容器作为一个接口,衍生了如上所示的接口,这些接口又实现了我们经常使用的各种实现类,下面我们就来一一分析:
List接口:
- 我们的实现类有很多,诸如ArrayList、LinkedList、stack、vector等
ArrayList:
1、大小会自动改变
2、存储空间是顺序结构
3、允许任何数据存储,包括null
LinkedList:
1、双重链表实现
2、存储空间非顺序结构
3、顺序读取速度较于ArrayList慢,但是插入或者删除非头尾节点快于前者。
- 为何这样的几点就能解释我们的List实现的两个比较常用的类,因为他们的实现逻辑就是这样的简单。
ArrayList实现:
//创建一个ArrayList对象
List list = new ArrayList();
//向对象中添加数据
list.add(1);
list.add("a");
list.add(new int[]{1,2,3});
//我们可以向数组中添加数字,字符串、数组和对象等等
- 以上是我们的list添加过程,下面我们介绍删除功能
//移除下标为1的数组,也就是顺序上的第二个数组值
list.remove(1);
//此时该数组还剩1和新创建的数组
list.remove("a");
//这时候会发现字符a这个值被移除掉了
- 得出结论如下:
- 1、移除操作填写数字时,该数字为数组下标
- 2、移除操作填写数组中的值时(非数字),移除该值
- 后面还有clear、size、contains、get和indexOf等
list.size();
//得出该数组的长度
list.contains("a");
//查看数组中是否存在字符a,显然不存在,因为已经删除
list.get(1);
//得到下标为1的值,也就是第二个数组值
list.indexOf("a");
//返回字符a在数组中的下标
list.clear();
//清除数组的所有值
LinkedList实现
- 其实LinkedList和ArrayList在操作上基本相似
- 添加数据也是add,移除数据也是remove,移除所有也是clear,还有获得下标的数据也是get,所以使用起来没有什么不一样,只是在存储数据时,只要不涉及大量的插入和删除数据,使用ArrayList性能高于后者,而频繁的读取数据和头尾部添加或者删除数据,使用LinkedList性能高于前者。
Set接口
- set是一个不包好重复数据的集合,也就意味着我们存储的重复数据会被覆盖掉。
- 下面我就这个接口实现的两个常用的类进行分析如下:
HashSet类
- HashSet看出来这个实现类是基于hash散列存储的方法,这样的方法存储一定是向着更高效的方向。
Set set = new HashSet();
set.add(1);
set.add(1);
set.add(2);
//会发现这里只存了两个数,1和2,因为有两个1,所以会被覆盖掉。
- 同样的道理,我们还能使用clear、remove和contains,其实相较于前面的List,我们最主要的特点就是其不重复,且无顺序的存储
TreeSet实现类
- 这个实现类和上面的hashset实现类相似,但是它的存储是排序结果。
- 如下所示:
Set set = new TreeSet();
set.add(13);
set.add(89);
set.add(34);
System.out.println(set);
//输出如下
[13.34.89]
- 可见我们的set集合中的数被排过序,这就是相较于HashSet的主要区别,当然其内部实现就是一个树型的存储结构,我们会在数据结构中一一介绍。
Map接口
- Map接口,想必是我们在面试或者经常听说的一种接口,它的实现类较为著名的莫过于hashmap了,而它的实现又是在JDK1.8后使用了数组+链表+红黑树的一个结构。还有其它诸如TreeMap。
- map是一种基于key-value的键值对结构存储,所以我们给它添加值的时候,必须要同时添加key和value两个值。当然他也不能存在key值相同的键值对,否则后者覆盖前者。
HashMap hash = new HashMap();
hash.put(1,2);
hash.put(2,3);
//当然我们的key或者value都不一定是数字,有可能是字符串或者字符
- 我们将键值对存储该hash结构中后,就可以对其进行操作
hash.get(1);
//得到key为1的value值
hash.containsKey(1);
//查看是否存在key==1的键值对,有则返回true无则相反
hash.keySet();
//该set中的单独的key集合
- 等等,还有很多的操作,类型相似不作过多介绍
TreeSet实现类
- 该实现类唯一不同于上述的就是它的排序,也就是我们的key值会自动的排序(升序),这是区别于hashSet的主要区别之一,其他的操作类似不作过多介绍
Iterator迭代器
- 它是实现对我们集合一个迭代操作的一个类,它的实现让我们在对各种诸如map或者set等无法使用下标来顺序读取的集合,给了一个实现单独读取的工具
- 其实现如下:
Set set = new HashSet();
set.put(1);
set.put(2);
set.put(3);
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(it.next);
}
//这样的一波操作后,就能读取出我们的所有值
泛型
- 这是一个我们在定义集合时,在尖括号<>中添加的数据类型,也就是说我们在该集合中添加的类型可以被先前定义,这样就能确保我们后期的操作能够确定数据类型,避免出现迷糊的情况。
ArrayList<String> arr = new ArrayList<String>();
//当然后面的泛型可以不写,也就是第二个String可以不写。
arr.add("adag");
//成功添加
arr.add(1);
//报错误,无法正确添加。
- 上面就是我们在集合中经常使用的一种泛型,它的好处简单说就是我们在后期用来承接它的容器能够确定,比如:
上面的arr我们需要用集合来承接它,如果没有泛型,我们可能只能用Object来承接它,老祖宗,但是现在,我们直接使用String来承接它,因为我们已经给它做出来规范。
结束语
- 以上是我对本次知识点的简单介绍,下面会继续更新其它内容,还望多多学习。
- 一起共进!