本文主要是介绍Java 进阶学习笔记 —— 数据结构、List集合、List的子类、Set接口、Collections,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
第一章 数据结构
数据存储的常用结构:栈、队列、数组、链表、红黑树。
栈:入口和出口在同一侧,先进后出; 队列:入口和出口在集合的两侧,先进先出; 数组: 查询快:数组地址连续,通过数组首地址找到数组,通过数组索引快速查找元素; 增删慢:数组的长度是固定的,要增删元素,必须创建一个新数组,把原数组的数据复制过来并销毁原数组(在堆内存中,频繁地创建数组、销毁数组,效率低下); 链表:每一个元素包含了自己的数据、地址、下一个元素的地址; 查询慢:链表中地址不是连续的,每次查询元素,都必须从头开始查询; 增删快:链表结构,增删一个元素对链表整体结构没有影响,所以增删快; 单向链表:链表中只有一条链,不能保证元素顺序(存储和取出元素顺序有可能不一样); 双向链表:链表中有两条链,一条专门记录元素的顺序,是一个有序集合; 红黑树: 二叉树:分支不能超过两个; 排序树/查找树:二叉树的基础上,左子树小,右子树大; 平衡树:左右孩子数量相等; 红黑树: 趋近于平衡树,查询速度非常快,查询叶子节点的最大次数和最小次数不超过2倍; 红黑树约束(了解即可): 5.1 节点可以是红色或黑色; 5.2 根节点和叶子节点(空节点)是黑色; 5.3 红色节点的子节点是黑色; 5.4 每一个节点到每一个叶子节点的所有路径上黑色节点数量相同;
第二章 List集合
java.util.List接口 extends Collection接口 List接口的特点:
有序的集合,存储和取出元素的顺序是一致的; 有索引,包含了一些带索引的方法; 允许存储重复的元素;
List接口带索引的方法(特有):
public void add(int index, E element); public E get(int index); public E remove(int index); 返回值为移除的元素; public E set(int index, E element); 返回值为被替换的元素; 注意:操作索引时,要防止索引越界异常; IndexOutOfBoundsException: 索引越界异常,集合会报; ArrayIndexOutOfBoundsException: 数组索引越界异常; StringIndexOutOfBoundsException: 字符串索引越界异常;
第三章 List的子类
ArrayList集合
底层其实是一个数组结构,查询快,增删慢;
LinkedList集合
java.util.LinkedList LinkedList集合的特点:
底层是一个链表结构,查询慢,增删快; 里面包含了大量操作首尾元素的方法;
注意:使用LinkedList特有的方法不能使用多态;
public void addFirst(E e); 将指定元素插入此列表的开头 public void addLast(E e); 将指定元素插入此列表的结尾,等效于add方法 public void push(E e); 将指定元素推入此列表所表示的堆栈 public void getFirst(); 返回此列表的第一个元素 public void getLast(); 返回此列表的最后一个元素 public void removeFirst(); 移除并返回此列表的第一个元素 public void removeLast(); 移除并返回此列表的最后一个元素 public void pop(); 从此列表所表示的堆栈弹出一个元素 public boolean isEmpty(); 如果列表不包含元素,则返回true public void clean(); 清空集合中的元素;
Vector集合
已经被ArrayList代替,了解即可;
第四章 Set接口
java.util.Set接口 extends Collection接口 Set接口的特点:
不允许存储重复的元素 没有索引,没有索引的方法,也不能使用普通的for循环遍历;
HashSet集合
java.util.HashSet特点:
不允许存储重复元素 没有索引,没有索引的方法,也不能使用普通的for循环遍历,可以用迭代器iterator或增强for遍历; 是一个无序集合,存储元素和取出元素的顺序有可能不一致; 底层是一个哈希表结构(查询的速度很快);
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个模拟出的逻辑地址,不是数据实际存储的物理地址); Object类有一个方法可以获取对象的哈希值:int hashCode(); native: 代表该方法调用的是本地操作系统的方法;
HashSet集合存储数据的结构(哈希表): JDK1.8前:哈希表 = 数组 + 链表; JDK1.8后:哈希表 = 数组 + 链表;哈希表 = 数组 + 红黑树(提高查询速度);
哈希表的特点:速度快; 哈希冲突:两个元素不同,但哈希值相同; 哈希表的数组结构:相同元素一个分组,链表/红黑结构把相同的哈希值元素连接在一起; 如果链表的结构超过了8位,那么就会把链表转换为红黑树,提高查询速度; Set集合在调用add方法时,会调用元素的hashCode方法和equals方法判断元素是否重复;
HashSet存储自定义类型元素
HashSet存储自定义类型元素,必须重写该类型的hashCode和equals方法,保证同属性值的元素只存储一次;
LinkedHashSet
java.util.LinkedHashSet集合 extends HashSet集合 LinkedHashSet集合特点: 不允许重复,底层是一个哈希表(数组+链表/红黑树)+链表,多了一条链表记录元素存储顺序,保证元素有序;
可变参数
JDK1.5之后出现的新特性; 使用前提:当方法的参数列表数据类型确定,但参数个数不确定; 使用格式: 定义方法时用:修饰符 返回值类型 方法名(数据类型…变量名){} 原理:可变参数底层就是一个数组,根据传递参数个数的不同创建不同长度的数组,传递的参数可以是0(不传递)、1、2…多个; 注意事项:
一个方法的参数列表,只能有一个可变参数; 如果方法的参数有多个,那么可变参数必须写在参数列表的末尾; 如果有多个可变参数,可以用其终极写法:修饰符 返回值类型 方法名(Object…obj){};
第五章 Collections
java.utils.Collections是集合工具类,用来对集合进行操作;
public static boolean addAll(Collections c, T…elements); 往集合c中添加一些元素; public static void shuffle(List<?> list); 打乱集合顺序; public static void sort(List list); 将集合中元素按照默认规则排序; 注意: sort(List list)使用前提:该排序的集合里存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则; public static void sort(List list, Comparator<? Super T>);
Comparable和Comparator的区别: Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法; Comparable接口的排序规则, (自己)this - 参数:升序; Comparator:相当于第三方裁判,比较另外两个,重写compare方法; Comparator比较规则:o1-o2升序;
这篇关于Java 进阶学习笔记 —— 数据结构、List集合、List的子类、Set接口、Collections的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!