java list set 特性
List的常用实现类
-
ArrayList (常用)
-
JDK1.2 底层数组实现 查询快,增删慢 线程不安全,效率高
-
-
LinkedList
-
JDK1.2 底层链表实现 查询慢,增删快 线程不安全,效率高
-
-
Vector
-
JDK1.0 底层数组实现 都慢 线程安全,效率低
-
List 集合名=new 实现类();
常用方法
-
集合名.方法名(实参列表)
-
boolean add(元素): 往集合末尾添加一个元素
-
void add(下标, 元素): 将元素添加至指定下标位置
-
boolean addAll(集合名):将指定集合元素添加至当前集合末尾
-
boolean addAll(下标,集合名):将指定集合元素添加至当前集合指定下标位置
-
int size():获取集合长度
-
元素 get(下标):获取指定下标位置的元素
-
下标不可超出使用范围,否则报出下标越界异常
-
-
boolean contains(元素):判断是否包含指定元素
-
boolean containsAll(集合名):判断当前集合中是否包含指定集合的所有元素
-
下标 indexOf(元素):获取指定元素第一次出现的下标
-
下标 lastIndexOf(元素):获取指定元素最后一次出现的下标
-
boolean isEmpty():判断集合元素是否为空,不可判比null值
-
被删除的元素 remove(下标):删除指定下标位置的元素
-
boolean remove(元素):删除指定元素
-
如果集合元素为整数值,则会优先认定值为下标。所以删除整数值元素时只能通过下标删除
-
-
旧元素 set(下标,新元素):将指定下标位置的值替换为新元素值
-
Object[] toArray():将集合转换为数组
遍历
-
下标遍历
for(int i=0;i<集合名.size();i++){//通过集合名.get(i)的方式获取当前元素 }
List list = new ArrayList();list.add(10);list.add(20);list.add(30);list.add(40);list.add(50); //下标遍历for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i)+" ");}System.out.println();
-
迭代器遍历
-
获取集合的迭代器:集合名.iterator()
-
操作迭代器:
-
boolean hasNext():判断是否存在下一元素
-
元素 next():使指针后移一位,获取下一元素
-
-
使用:
-
迭代过程中不可增删元素
-
一次迭代只能调用一次next方法,否则迭代与操作元素数量不一致
-
//获取迭代器Iterator it = list.iterator();//利用循环操作迭代器while(it.hasNext()){Object o = it.next();if (o != null) {System.out.print(o+" ");}}System.out.println();
-
-
外遍历forEach
for(数据类型 元素名:集合名){//元素名就代表正在被遍历的元素 }
for (Object o : list) {System.out.print(o+" ");}System.out.println();
-
遍历过程中无法增删元素
-
JDK5.0
-
Set集合
Collection
-
是List和Set的父接口
-
所有集合都是由Collection或者Map派生
特点
-
内部存放List和Set的共性方法
-
没有直接实现类
Set的存储特点
无序,无下标,元素不可重复
Set的常用实现类
-
HashSet
-
JDK1.2 底层哈希表(数组+链表)实现 线程不安全,效率高
-
-
LinkedHashSet
-
JDK1.2 使HashSet的子类,底层哈希表实现 线程不安全,效率高
-
-
TreeSet
-
JDK1.2 底层红黑树实现,是SortedSet的实现类 线程不安全,效率高
红黑树:树状结构存放数据,使用的是二分查找法,特点为查询效率快
-
创建
-
建议使用多态
Set<泛型> 集合名=new 实现类名<>();
常用方法
-
所有方法都继承自Collection,无独有方法
遍历
-
迭代器遍历
-
外遍历forEach
-
自遍历forEach
哈希表的去重原理
-
先调用元素的hashCode方法获取哈希码值
-
通过哈希码值%数组长度(16)得到存放下标
-
如果下标位置未存有元素,则直接存放
-
如果下标位置存有元素, 则调用当前元素的equals方法与下标位置元素进行值的比较
-
都不相同, 在下标位置上继续链表存放
-
有相同,则舍弃添加当前元素
使用
-
HashSet和LinkedHashSet如果存放的是自定义类型,则必须重写hashCode和equals方法才能实现去重
-
LinkedHashSet可以保证元素存入与取出的顺序一致
-
TreeSet可以实现对元素进行默认的升序排序
-
如果TreeSet中存放的是自定义类型,则必须自定义排序规则
-
排序方式:
-
实现Comparable接口,重写CompareTo方法
-
思路:让当前对象this和参数对象o进行比较
-
实现:对谁排序,就让谁实现
-
规则:
-
从小到大:
this的值>o的值,返回正数
this的值<o的值,返回负数
-
从大到小:
this的值>o的值,返回负数
this的值<o的值,返回正数
相等返回0
-
package com.by.entity; public class Student implements Comparable<Student>{private String name;private int age;private double score; //省略getter、setter、构造 @Overridepublic int compareTo(Student o) {//根据学生成绩从高到底排序if (this.score > o.score) {return -1;} else if (this.score < o.score) {return 1;}return 0;} }
-
-
实现Comparator接口,重写compare方法
-
思路: 让参数o1和o2进行比较
-
实现:在集合创建处的小括号内传入实现类对象
Set<Student> set = new TreeSet<>((o1,o2)->{//根据学生成绩从低到高if (o1.getScore() > o2.getScore()) {return 1;} else if (o1.getScore() < o2.getScore()) {return -1;}return 0;});
-
-
默认识别Comparable,但是Comparator优先级更高
-
Comparator更能保护类的单一职责,有利于后期代码的维护, 集合排序扩展性更高,更推荐该方式
-
-
-
TreeSet去重规则:当compareTo或compare方 法返回值为0时去重
java list set 特性
List的常用实现类
-
ArrayList (常用)
-
JDK1.2 底层数组实现 查询快,增删慢 线程不安全,效率高
-
-
LinkedList
-
JDK1.2 底层链表实现 查询慢,增删快 线程不安全,效率高
-
-
Vector
-
JDK1.0 底层数组实现 都慢 线程安全,效率低
-
List 集合名=new 实现类();
常用方法
-
集合名.方法名(实参列表)
-
boolean add(元素): 往集合末尾添加一个元素
-
void add(下标, 元素): 将元素添加至指定下标位置
-
boolean addAll(集合名):将指定集合元素添加至当前集合末尾
-
boolean addAll(下标,集合名):将指定集合元素添加至当前集合指定下标位置
-
int size():获取集合长度
-
元素 get(下标):获取指定下标位置的元素
-
下标不可超出使用范围,否则报出下标越界异常
-
-
boolean contains(元素):判断是否包含指定元素
-
boolean containsAll(集合名):判断当前集合中是否包含指定集合的所有元素
-
下标 indexOf(元素):获取指定元素第一次出现的下标
-
下标 lastIndexOf(元素):获取指定元素最后一次出现的下标
-
boolean isEmpty():判断集合元素是否为空,不可判比null值
-
被删除的元素 remove(下标):删除指定下标位置的元素
-
boolean remove(元素):删除指定元素
-
如果集合元素为整数值,则会优先认定值为下标。所以删除整数值元素时只能通过下标删除
-
-
旧元素 set(下标,新元素):将指定下标位置的值替换为新元素值
-
Object[] toArray():将集合转换为数组
遍历
-
下标遍历
for(int i=0;i<集合名.size();i++){//通过集合名.get(i)的方式获取当前元素 }
List list = new ArrayList();list.add(10);list.add(20);list.add(30);list.add(40);list.add(50); //下标遍历for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i)+" ");}System.out.println();
-
迭代器遍历
-
获取集合的迭代器:集合名.iterator()
-
操作迭代器:
-
boolean hasNext():判断是否存在下一元素
-
元素 next():使指针后移一位,获取下一元素
-
-
使用:
-
迭代过程中不可增删元素
-
一次迭代只能调用一次next方法,否则迭代与操作元素数量不一致
-
//获取迭代器Iterator it = list.iterator();//利用循环操作迭代器while(it.hasNext()){Object o = it.next();if (o != null) {System.out.print(o+" ");}}System.out.println();
-
-
外遍历forEach
for(数据类型 元素名:集合名){//元素名就代表正在被遍历的元素 }
for (Object o : list) {System.out.print(o+" ");}System.out.println();
-
遍历过程中无法增删元素
-
JDK5.0
-
Set集合
Collection
-
是List和Set的父接口
-
所有集合都是由Collection或者Map派生
特点
-
内部存放List和Set的共性方法
-
没有直接实现类
Set的存储特点
无序,无下标,元素不可重复
Set的常用实现类
-
HashSet
-
JDK1.2 底层哈希表(数组+链表)实现 线程不安全,效率高
-
-
LinkedHashSet
-
JDK1.2 使HashSet的子类,底层哈希表实现 线程不安全,效率高
-
-
TreeSet
-
JDK1.2 底层红黑树实现,是SortedSet的实现类 线程不安全,效率高
红黑树:树状结构存放数据,使用的是二分查找法,特点为查询效率快
-
创建
-
建议使用多态
Set<泛型> 集合名=new 实现类名<>();
常用方法
-
所有方法都继承自Collection,无独有方法
遍历
-
迭代器遍历
-
外遍历forEach
-
自遍历forEach
哈希表的去重原理
-
先调用元素的hashCode方法获取哈希码值
-
通过哈希码值%数组长度(16)得到存放下标
-
如果下标位置未存有元素,则直接存放
-
如果下标位置存有元素, 则调用当前元素的equals方法与下标位置元素进行值的比较
-
都不相同, 在下标位置上继续链表存放
-
有相同,则舍弃添加当前元素
使用
-
HashSet和LinkedHashSet如果存放的是自定义类型,则必须重写hashCode和equals方法才能实现去重
-
LinkedHashSet可以保证元素存入与取出的顺序一致
-
TreeSet可以实现对元素进行默认的升序排序
-
如果TreeSet中存放的是自定义类型,则必须自定义排序规则
-
排序方式:
-
实现Comparable接口,重写CompareTo方法
-
思路:让当前对象this和参数对象o进行比较
-
实现:对谁排序,就让谁实现
-
规则:
-
从小到大:
this的值>o的值,返回正数
this的值<o的值,返回负数
-
从大到小:
this的值>o的值,返回负数
this的值<o的值,返回正数
相等返回0
-
package com.by.entity; public class Student implements Comparable<Student>{private String name;private int age;private double score; //省略getter、setter、构造 @Overridepublic int compareTo(Student o) {//根据学生成绩从高到底排序if (this.score > o.score) {return -1;} else if (this.score < o.score) {return 1;}return 0;} }
-
-
实现Comparator接口,重写compare方法
-
思路: 让参数o1和o2进行比较
-
实现:在集合创建处的小括号内传入实现类对象
Set<Student> set = new TreeSet<>((o1,o2)->{//根据学生成绩从低到高if (o1.getScore() > o2.getScore()) {return 1;} else if (o1.getScore() < o2.getScore()) {return -1;}return 0;});
-
-
默认识别Comparable,但是Comparator优先级更高
-
Comparator更能保护类的单一职责,有利于后期代码的维护, 集合排序扩展性更高,更推荐该方式
-
-
-
TreeSet去重规则:当compareTo或compare方 法返回值为0时去重