Java自学小白——Collection、数据结构、List、泛型深入
Java自学小白——Collection、数据结构、List、泛型深入
一、集合
1.集合的概述
集合和数组都是容器
- 数组的特点
- 数组定义完成并启后,类型确定,长度固定。
- 适合元素的个数和类型确定的业务场景,不适合做需要增删数据操作。
- 数组可以存储基本类型和引用类型的数据
- 集合的特点
- 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
- 集合非常适合做元素的增删操作。
- 集合只能存储引用数据类型的数据
2.集合的体系特点
- Collection单列集合,每个元素(数据)只包含一个值。
- Map双列集合,每个元素包含两个值(键值对)。
- Collection集合体系
- Collection集合特点
- List系列集合:添加的元素是有序、可重复、有索引。
- ArrayList、LinekdList:有序、可重复、有索引
- Set系列集合:添加的元素是无序、不重复、无索引。
- HashSet:无序、不重复、无索引;LinkedHashSet:有序、不重复、无索引。
- TreeSet:按照大小默认升序排序、不重复、无索引。
- List系列集合:添加的元素是有序、可重复、有索引。
- 集合对于泛型的支持
集合都是支持泛型的,可在编译阶段约束集合只能操作某种数据类型
注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象
Collection接口是集合的代表
3.Collection集合常用API
- Collection是单列集合的祖宗接口,他的功能是全部单列集合都可以继承使用的。
Collection API如下
使用案例:
1 Collection<String> list = new ArrayList<>(); 2 //1.添加元素,添加成功返回ture。add 3 list.add("java"); 4 list.add("MySQL"); 5 list.add("HTML"); 6 System.out.println(list); 7 System.out.println(list.isEmpty());//判断集合是否为空 8 //2.清空集合的元素。clear 9 list.clear(); 10 System.out.println(list); 11 //3.判断集合是否为空,是空返回ture,反之亦然。isEmpty 12 System.out.println(list.isEmpty()); 13 //4.获取集合的大小。size 14 System.out.println(list.size()); 15 //5.判断集合中是否包含某个元素。contains 16 System.out.println(list.contains("java")); 17 //6.删除某个元素,如果有重复元素默认删除前面的一个。remove 18 System.out.println(list.remove("HTML")); 19 System.out.println(list); 20 //7.把集合转换为数组。toArray 21 Object[] arr = list.toArray(); 22 System.out.println(Arrays.toString(arr)); 23 24 25 System.out.println("------------------拓展------------------"); 26 //addAll把一个集合的元素全部添加到另一个集合 27 Collection<String> c1 = new ArrayList<>(); 28 Collection<String> c2 = new ArrayList<>(); 29 c1.add("Lady"); 30 c1.add("GAGA"); 31 c2.add("CAR"); 32 c2.add("迪B"); 33 c1.addAll(c2); 34 System.out.println(c1);
4.Collection集合的遍历方式
方式一:迭代器
- 遍历就是一个一个把容器中的元素访问一遍。
- 迭代器在Java中的代表是Iterator,迭代器是集合的专用遍历方式
Collection集合获取迭代器
Iterator中的常用方法
使用案例:
(注意这里while循环退出之后迭代器指向最后一个对象,此时再执行next会出现NoSuchElementException异常,如果需要再次遍历则需要重置迭代器,即再次给it赋值, eg:it = arr.iterator)
迭代器总结:
1.Iterator<E> iterator() :得到迭代器对象,默认指向当前集合的索引0(应该是错误的,经过测试应该是运行next后才指向索引0)
2.迭代器如果取元素越界会出现NoSuchElementException异常。
方式二:foreach/增强for循环 (底层仍使用迭代器,算是迭代器的简化版本)
增强for循环既可以遍历结合也可以遍历数组
使用案例:
方式三:lambda表达式
- Collection结合Lambda遍历的API
使用lambda表达式简化后的过程
方式四:利用Stream流来进行遍历
5.Collection集合存储自定义类型的对象
案例:
实现代码:
定义的Movie类:
Test类
运行结果:
内存原理:
在这个案例中,集合中存储的是元素对象的地址。
二、常见数据结构
数据结构概述
- 数据结构是计算机底层存储,组织数据的方式。是指数据相互之间是以什么方式排列在一起的。
- 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率
常见的数据结构
栈、队列、数组、链表、二叉树、二叉查找树、平衡二叉树、红黑树……等等
1.栈数据结构的执行特点:后进先出,先进后出
数据进入栈模型的过程称为:压/进栈
数据离开栈模型的过程称为:弹/出栈
2.队列数据结构的执行特点:先进先出,后进后出
数据从后端进入队列模型的过程称为:入队列
数据从前端离开队列模型的过程称为:出队列
3.常见数据结构之数组
- 数组是一种查询快,增删慢的模型
- 查询效率快:查询数据通过地址值和索引定位,查询任意数据耗时相同。(元素在内存中是连续存储的)。
- 删除效率低:要将元素数据删除,同时后面的每个数据前移。
- 添加效率极低:添加位置后的每个数据后移,再添加元素。
4.常见数据结构之链表
- 链表中的元素是在内存中不连续存储的,每个元素节点包含数据值和下一个元素的地址。
- 链表中的元素是游离存储的,每个元素节点包含数据值和下一个元素的地址。
- 链表查询慢。无论查询哪个数据都要从头开始找
- 链表增删相对快
链表的种类
单向链表:
双向链表:
5.常见数据结构之二叉树
特点:
- 只能有一个根节点,每个节点最多支持2个直接子节点。
- 节点的度:节点拥有的子树的个数,二叉树的度不大于2。
- 叶子节点:度为0的节点,也称为终端节点。
- 高度:叶子结点的高度为1,叶子节点的父节点高度为2,以此类推,根节点的高度最高
- 层:根节点在第一层,以此类推
- 兄弟节点:拥有共同父节点的节点互称为兄弟节点
- 二叉查找树:提高检索数据的性能
二叉查找树又称二叉排序树或者二叉搜索树。
特点:
- 每一个节点上最多有两个子节点
- 左子树上所有节点的值都小于根节点的值
- 右子树上所有结点的值都大于根节点的值
二叉查找树添加节点
规则:小的存左边,大的存右边,一样的不存
平衡二叉树
- 平衡二叉树实在满足查找二叉树的大小规则下,让树尽可能矮小,以此提高查数据的性能。
要求:任意节点的左右两个子树的高度差不超过1,任意节点的左右两个字数都是一颗平衡二叉树
6.常见数据结构之红黑树
- 红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。
- 1972年出现,当时被称之为平衡二叉B树。1978年被修改为如今的“红黑树”。
- 每一个节点可以是红或者黑;红黑树不是通过高度平衡的,它的平衡时通过“红黑规则”进行实现的。
三、List系列集合
subList是前闭后开的范围
1.ArrayList底层原理
- ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作
- 第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组
2.Vector底层原理
2.LinkedList底层原理
四、泛型深入
1.泛型概述
- 泛型:是JDK5中引入的特性,可以再编译阶段约束操作的数据类型,并进行检查
- 泛型的格式:<数据类型>;注意:泛型只能支持引用数据类型
- 集合体系的全部接口和实现类都是支持泛型的使用的
2.泛型的好处:
- 统一数据类型
- 把运行时的问题提前到了编译期间,避免强制类型转换可能出现的异常,因为编译阶段类型就能确定下来
3.
4.自定义泛型类
泛型类的核心思想:把出现泛型变量的地方全部替换成传输的真实数据类型
泛型类的作用:编译阶段约定操作数据的类型,类似于集合的作用。
5.自定义泛型方法
泛型方法的核心思想:把出现泛型变量的地方全部替换成传输的真实数据类型
泛型方法的作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性
6.自定义泛型接口
泛型接口的作用:泛型接口可以约束实现类,实现类可以再实现接口的时候传入自己操作的数据类型这样重写的方法都将是针对于该类型的操作
7.泛型通配符、上下限