相信大家初学Java时对集合的概念也有一定的了解,那么java里面的集合又是什么呢?

一、集合是什么?

它和数组不同,数组既可以存储基本数据类型,也可以存储引用数据类型。而集合只能存储引用数据类型,比如你存入一个int型数据18放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型,如果存储基本数据类型,会被自动装箱。

它就像一个容器,专门用来存储java对象(实际上是对象名,即指向地址的指针),这些对象可以是任意数据类型,并且长度可变。其中,这些集合类都位于java.util包中,在使用时一定要注意导包的问题,否则会出现异常。

关系图如下,该图用到了UML(统一建模语言):

根据上图,发现一个特点,上述所有的集合,除了map系列的集合,即左边的集合都实现了Iterator接口。

Iterator(迭代器)是一个用来遍历集合中元素的接口,主要有hashNext(),next(),remove()三种方法。

它的子接口ListIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。


二、集合的分类

集合按照其存储结构可以分为两大类:

1.单列集合Collection

如上图可见,Collection接口是单列集合的根接口,分别由List和Set两个子接口继承,且Java里所有的集合都是由Collection触发的。

 1.1:List和Set集合的特点

  • List集合的特点是元素有序可重复,只要是带集合、数组的都叫有序,因若无序就不会存在有下标;因此List中的每个元素都有索引(下标),使用此接口能够准确的控制每个元素插入的位置,用户也能够使用索引来访问List中的元素,List类似于Java的数组,list集合为Object类型,
  • Set集合的特点是元素无序并且不可重复,Set最多有一个null元素。

1.2:List分为三类

  • ArrayList:内部以连续的数组结构存储数据实现,适合查询(下标),增删改慢,安全性没Vector高,但效率比它快;

ArrayList好比一个箱子,每一行空格为一个值,每个值都有对应的下标(下标从0开始),当我们往里面存入值时首先是往第一个空格里面依次往下存值,若要删除掉下标为1的值(第二个空格),即下标也会跟着长度而改变,但删除值前面的下标不变;增加也是同样的道理,此时我们会发现ArrayList里面要新增或删除动的是后面的,前面没有影响。

  • LinkList:内部由链表实现(链式存储),适合增删改(快),查询慢。

LinkList环环相扣,第一环和第二还相扣就会有重叠的区域,那么该区域就保存了这两环的信息,但是并没有保存第三环的信息,只会保存相邻两环的信息;若想查询第4个环的信息,我们就必须从第一环往后以此类推的往后查询,直到查到我们想要的信息为止,因此查询会慢;但是增删改就不会了,我们只需要把相邻两个环拆开,加一个环进去然后相互交换信息即可,至于其他的环我们根本不需要动便可以实现,因此速度快。

  • Vector:Vector实现了异步线程,因此安全性能最高且Vector每一个方法都有锁旗标,但速度效率慢,增删改查都慢,几乎用不到。(注:只要做线程安全就速度慢)

1.3:Set分为两类

  • TreeSet:是二叉树,有序的
  • HashSet:采用散列存储,是无序的。

2.双列集合Map

Map是双列集合的根接口,用于存储具有键(Key)、值(Value)映射关系的元素,一个Map中不能包含相同的键,每个键只能映射一个值。

Map集合中每个元素都包含一对键值,并且Key是唯一的,在使用Map集合时可以通过指定的Key找到对应的Value。例如,根据一个学生的学号就可以找到对应的学生。Map接口的主要实现类有HashMap和TreeMap。


三、泛型简介

数组与集合定义的区别?

  • 相信大家学过数组,在我们定义数组时想的肯定是我要定义什么类型的数组,且也必须知道什么数据类型。
  • 在我们定义集合的时候,相信很多人也跟我一样第一时间就会想到List,不知大家是否发现我们在编写快捷键回车导入List集合的时候旁边会自带一对尖括号,如:List<E>,没错这就是泛型,但是我们有时候会出现这对尖括号可写可不写的现象,这是为什么嘞?原来是因为不写尖括号,只是单单写一个List可以存放任何数据类型,写了反而受到了限制,但是如果需要给到限制应该是什么类型,我们就可以给list集合添加泛型,例:List<String>,那么现在这个里面就只能放String类型的。

总结:list可以直接定义,不用知道要定义什么数据类型,但是数组必须知道数据类型才能定义;


四、打印List集合的三种方法

public static void main(String[] args) {List list=new ArrayList<>();list.add("a");list.add(false);list.add(1);list.add(3.18);list.add('c');list.add("a");list.add("b");System.out.println("长度:"+list.size());//获取集合长度System.out.println(list.get(2));//打印下标为2的值//2.三种输出集合里面内容的方式//方式一:通过forEach循环取值(JDK1.5之后才有的)for (Object o : list) {System.out.println(o);}//方式二:通过for循环取值for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}//方式三:通过迭代器取值(官方推荐),若在list集合循环取值推荐该方式,更安全Iterator i = list.iterator();while(i.hasNext()) {//判断有没有下一个值,没有则返回falseObject next = i.next();//获取值System.out.println(next);}
}

迭代器取值的执行原理:


五、List优化

通过查看ArrayList类我们可以可以得知,只要我们new了一个ArrayList就可以默认有一个对象数组(任何数据类型都可放),具体放什么就看List传过来的是什么,传过来是什么Object就会变成什么,例传过来是String,Object就会变为String。但是我们又会发现这个数组刚new出来时时没有长度的,按道理来说我们定义一个对象数组时只要new一个数组就会有长度,例:String [ ] s=new String [10];若没有长度便会报错,但长度若写死了就不多不少只能放这么多,但是List就不一样,想放多少就放多少,这又是什么原理呢?接下来便来深度了解一下到底是什么原因:

private static final Object[] EMPTY_ELEMENTDATA = {};

我们可以通过反射来输出list的长度:

package demo;import java.lang.reflect.Field;public class Demo {// 反射static void print(List arrayList) throws Exception {Class c = arrayList.getClass();//通过arrayList拿到EMPTY_ELEMENTDATA类 的若干属性Field elementDataField = c.getDeclaredField("elementData");//elementData即是属性之一,相当于拿到了该数组elementDataField.setAccessible(true);Object[] arr = (Object[]) elementDataField.get(arrayList);System.out.println("elementData.length=" + arr.length);//输出数组的长度}public static void main(String[] args) {List list=new ArrayList<>();list.add("a");list.add(false);list.add(1);list.add(3.18);list.add('c');list.add("a");list.add("b");//在main方法里调用该方法,把list传进去try {print(list);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

输出长度为:elementData.length=10

这里我们可以看到输出的长度为10,但是实际长度为7;这是为什么嘞?其实它有一个规则,我们可以发现其实ArrayList本质上是一个数组,刚刚创建的集合是没有长度的,只要不放东西默认数组长度为0,但是只要往里面插入一个值,那么这个集合的长度就会变成10(默认),动态改变该数组的长度,如果后续长度超过10,再插入第11个值的时候,集合长度需要再次该变按照负载因子来改变(0.5)10*0.5+10==22.5==22,超过22按照此方法以此类推即可。

总结:初识容量10,负载因子10*1.5


六、装箱插箱

简单来说就是类之间的相互自动转换,jdk1.5之后引入了自动装箱及自动拆箱功能

注:JDK1.5之前是报错的,不允许,必须强制转换(因Integer是一个对象类型,int是基本数据类型,该两者之间不可相互转换)

//装箱(值类型->引用类型==小>大)int a=10;Integer b=a;//拆箱( 引用类型->值类型==大>小)Integer c=20;int d=c;

以上就说到这里啦,这里我是着重简述了一下list集合,至于其他的内容这里我并没有着重的去跟大家讲解,但是我会在接下来的文章里去讲,若有写的不好的地方望大家谅解呢...

集合框架·List集合简介相关推荐

  1. (Java集合框架)集合框架概述和Collection常用功能及遍历

    文章目录 集合概述 集合框架 Collection 常用功能 代码演示 集合遍历 Iterator接口 迭代器的实现原理 增强for 代码演示 集合概述 集合:集合是java中提供的一种容器,可以用来 ...

  2. 小白学习java集合框架(集合Collection)

    希望各位能够留下你们美丽的赞和评论谢谢,或者有好的资源帮帮小编提升实力一起努力,奥里给!! 拒绝垃圾视频:超级好的视频,建议从头开始看:https://www.bilibili.com/video/B ...

  3. 学习Java第二十五天--集合框架之集合嵌套案例

    Map集合和其它集合嵌套的案例.以及Map集合和Map集合嵌套的案例 案例1:Map和ArrayList的嵌套 案例2:Map和Map的嵌套 案例1:Map和ArrayList的嵌套 import j ...

  4. 20170825 - Q - 集合框架 、 集合操作 —— 线性表

    1 什么时候需要泛型? 2 泛型实际上真的泛型了吗? 3 哪些集合可以排序? 4 下方代码是否会报错 public class Collections_sort { public static voi ...

  5. java list的作用_集合框架(List集合的特有功能概述和测试)

    package cn.itcast_03; import java.util.ArrayList; import java.util.List; /* * List集合的特有功能: * A:添加功能 ...

  6. java dvd集合框架_JAVA 集合框架

    1.总览图 总览:(虚线箭头为依赖.虚线空心三角为实现.实线空心三角为继承)关于 UML 图表示可看此链接 Collection: Map: 2.Iterator .Iterable.ListIter ...

  7. 集合框架——Set集合的使用与数据结构详解

    Set集合 特点:无序,无下标,元素不可重复 方法:全部继承自Collection中的方法 不包含重复元素的集合. 更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多 ...

  8. 集合框架|Java集合框架基本使用

    大家好,我是程序猿小马,沪漂一族! 写文章就是对于平时的总结以及大家共同学习进步,早日码出各自的梦想

  9. 【职坐标】java集合框架简介

    Java集合之集合框架 一.   什么是集合框架 a)   "集合框架"由一组用来操作对象的接口组成.不同接口描述不同类型的组 二.   集合的优缺点及用途 a)   创建接口特定 ...

最新文章

  1. [JZOJ4786]小a的强迫症
  2. C# 安装部署,关于自定义操作,不能被执行。
  3. 谷歌查看html地址_跑谷歌购物广告前,你需要了解这些
  4. 02.centos6.4找不到ifcfg-eth0(静态ip配置)
  5. Spring Boot整合Spring Data Redis-存取Java对象
  6. leetcode初级算法5.加一
  7. 剑指offer面试题[20]-顺时针打印矩阵
  8. MySQL--当事务遇到DDL命令
  9. 解决办法:Cannot find the class file for org.apache.http.client.ClientProtocolException
  10. java jni 傻瓜教程
  11. 智头条」十四五数字经济发展规划发布,工信部推动充电标准统一
  12. cad多段线画圆弧方向_cad画带角度的圆弧怎么画(cad多段线用角度画圆弧问题)...
  13. 如何取消html中页眉的下划线,Word文档页眉的横线怎么去掉?页脚的横线怎么去掉?...
  14. 面向初学者的 40 多个 Python 项目——开始编写 Python 代码的简单想法
  15. 安装linux系统提示acpi,ACPI引起linux系统无故重启
  16. 2.5 Web前端:JavaScript5:常用DOM操作
  17. 《C语言点滴》参考文献
  18. [深度学习] 自然语言处理 --- NLP入门指南
  19. 约定由于配置(Convention over Configuration)
  20. 怎样用ocr软件识别图片中的文字

热门文章

  1. c++ bitset类用法
  2. layui复选框,设置部分可选
  3. Linux升级内核以及删除Linux多余的内核
  4. uva 10115(字符串)
  5. [机器学习算法]GBDT梯度提升决策树
  6. JavaScript_ES5和ES6
  7. A. Sonya and Queries
  8. Java 空格“ ”、空字符串“”和null区别
  9. jdk1.8的下载与安装教程
  10. 最新版 Let’s Encrypt免费证书申请步骤,保姆级教程