挑灯夜读——Java SE:集合

Java容器collection

  • 容器,顾名思义。也就是我们用来装载我们的数据,这些数据包括:字符串,数字,对象或者其它数据。
衍生类:set、list、map
  • 我们的容器作为一个接口,衍生了如上所示的接口,这些接口又实现了我们经常使用的各种实现类,下面我们就来一一分析:

List接口:

  • 我们的实现类有很多,诸如ArrayListLinkedListstackvector

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来承接它,因为我们已经给它做出来规范。

结束语
  • 以上是我对本次知识点的简单介绍,下面会继续更新其它内容,还望多多学习。
  • 一起共进!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米店不卖你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值