集合 (一) ----- 集合的基本概念与Collection集合详解
相关文章:
- 《集合 (一) ----- 集合的基本概念与Collection集合详解》
- 《集合 (二) ----- Map集合详解》
文章目录
- 集合的基本概念
- 一、集合的分类
- 二、常用集合的继承结构图
- Collection集合详解
- 一、常用方法
- 二、Collection集合及其子类通用的遍历方式——使用迭代器
- 范型机制
- Collection集合子接口之一 ----- List集合详解
- 一、List集合基本概念
- 二、List集合特有的方法
- 三、ArrayList
- 四、LinkedList
- Collection集合子接口之一 ----- Set集合详解
- 一、Set集合基本概念
- 二、构造方法
集合的基本概念
一、集合的分类
在java中,集合分为两大类
- 单个方式存储元素,这一类集合的超级父接口为:java.util.Collection
- 以键值对的方式存储元素,这一类集合的超级父接口为:java.util.Map
二、常用集合的继承结构图
Collection集合
Map集合
Collection集合详解
一、常用方法
返回值 | 方法名 | 说明 |
---|---|---|
boolean | add(E e) | 增 |
boolean | remove(Object o) | 删 |
boolean | contains(Object o) | 判断是否包含某个元素 |
int | size() | 返回集合中的元素个数 |
boolean | isEmpty() | 判空 |
void | clear() | 清空集合 |
Object[] | toArray() | 集合转为数组 |
Iterator | iterator() | 获取集合的迭代器 |
注意:
关于Collection集合中的
contains(Object o)
方法使用该方法时,其底层在比较元素时,会调用
equals()
方法,意味着比较的是集合中元素的内容而不是内存地址(前提是该元素的类重写了equals()
方法),所以只要存储在集合中的元素的内容和要查找的元素的内容一致,则会判定为同一个元素,元素属于该集合。关于Collection集合中的
remove(Object o)
方法使用该方法时,其底层在比较元素时,也会调用
equals()
方法,原理同上,只要传入的元素的内容和集合中元素的内容相等,那么就会判定为同一个元素,相应的元素就会被删除。
二、Collection集合及其子类通用的遍历方式——使用迭代器
前言
由于Collection集合实现了Iterable接口,因此其所有子类集合都可使用迭代器来遍历。迭代器Iterator类中的方法
返回值 方法名及形参 说明 boolean hasNext() 判断迭代器指针的前方是否有元素 E next() 让迭代器指针前移一位,然后返回其指向的元素 void remove() 移除迭代器指针指向的元素 测试
Collection<String> c = new HashSet<>(); c.add("123"); c.add("456"); c.add("789");Iterator<String> iterator = c.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());iterator.remove(); }System.out.println(c.isEmpty());// true
注意:当集合结构改变(增、删元素)后,需要重新获取集合的迭代器对象,否则遍历时会报异常,但是使用迭代器的remove方法来删除元素时可以不用重新获取迭代器对象。
Collection<String> c = new HashSet<>();c.add("123"); c.add("456"); c.add("789");Iterator<String> iterator = c.iterator();while (iterator.hasNext()) { iterator.next();iterator.remove(); }/* /* 下列循环删除元素的方式会报错 while (iterator.hasNext()) {c.remove(iterator.next()); } */
范型机制
范型的优缺点
(1) 以下代码不使用范型机制List list = new ArrayList();Cat c = new Cat();list.add(c);Iterator iterator = list.iterator();while(iterator.hasNext()) {Object o = iterator.next();if( o instanceof Cat) {((Cat) o).eat();}}static class Cat {public void eat() {System.out.println("猫吃鱼");}}
(2) 以下代码使用范型机制
List<Cat> list = new ArrayList<>();Cat c = new Cat();list.add(c);Iterator<Cat> iterator = list.iterator();while(iterator.hasNext()) {Cat cat = iterator.next();cat.eat() }static class Cat {public void eat() {System.out.println("猫吃鱼");}}
优点:集合中的元素变得统一,迭代器取出的元素不用再强制类型转换。
缺点:集合中存储的元素缺乏多样性。自定义范型
Integer[] arr1 = {2,3,1,2,5,2}; Double[] arr2 = {7.2,9.2,0.1,6.7}; String[] arr3 = {"D","A","C"};new PrintArr<Integer>().print(arr1); new PrintArr<Double>().print(arr2); new PrintArr<String>().print(arr3);static class PrintArr<E> {public void print(E[] e) {System.out.println(Arrays.toString(e));} }
foreach
(1) 语法格式:
for(元素类型 变量名 : 数组或集合的引用)
(2) 说明:每次循环都会从数组或集合中取出一个元素,这个元素由冒号":"前的变量表示
(3) 测试
int[] arr = {3, 1, 7, 2, 10};LinkedList list = new LinkedList();list.add("ABC");list.add(123);list.add(321);// [3][1][7][2][10]for (int i : arr) {System.out.print("[" + i + "]");}// [ABC][123][321]for (Object o : list) {System.out.print("[" + o + "]");}
(4) 注意:
- 我们不能在foreach中对集合进行元素的增删
- 若需要循环移除元素请使用Iterator中的remove()方法
Collection集合子接口之一 ----- List集合详解
一、List集合基本概念
List集合的继承结构图
List集合的特点
(1) 元素按照什么顺序放进去,取出来也是这种顺序
(2) 相同的元素可以重复存储
(3) List集合中的元素有下标List集合的常用实现类
(1) ArrayList:底层是数组,非线程安全。
(2) LinkedList:底层是双向链表。
(3) Vector:底层是数组,线性安全。
二、List集合特有的方法
返回值 | 函数名和形参 | 说明 |
---|---|---|
void | add(int index, E element) | 指定下标添加元素,后面的元素往后移 |
E | reomve(int index) | 删除指定下标的元素,后面的元素往前移 |
E | get(int index) | 获取指定下标位置处的元素 |
E | set(int index, E element) | 修改指定下标的元素 |
int | indexOf(Object o) | 获取元素在列表中第一次出现的下标 |
int | lastIndexOf(Object o) | 获取元素在列表中最后一次出现下标 |
List | subList(int from, int to) | 截取子列表 |
因为List集合有下标,所以除了使用迭代器遍历,还可以使用下面方式遍历
List<String> list = new LinkedList<>();list.add("A");
list.add("B");
list.add("C");
list.add("D");for(int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
}
三、ArrayList
构造方法
构造方法 说明 ArrayList() 默认初始化一个容量为10的列表 ArrayList(int initialCapacity) 指定容量初始化列表 ArrayList(Collection<? extends E> c) 用Collection集合初始化列表 优点:检索效率较高,向数组末尾添加元素效率很高
缺点:随机增删元素效率较低,无法存储大量数据
优化:因为ArrayList底层是数组,扩容时效率较低,所以建议在创建ArrayList对象时预估一个容量,也可以使用
void trimToSize()
:修整当前列表的容量为size大小
四、LinkedList
构造方法
构造方法 说明 LinkedList() 初始化一个空列表 LinkedList(Collection<? extends E> c) 用Collection集合初始化列表 实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
常用方法:
返回值 函数名和形参 说明 void addFirst(E e) 将指定元素插入此列表的开头 void addLast(E e) 将指定元素添加到此列表的结尾 E getFirst() 返回此列表的第一个元素(链表为空,抛出NoSuchElementException) E getLast() 返回此列表的最后一个元素 E removeFirst() 移除并返回此列表的第一个元素 E removeLast() 移除并返回此列表的最后一个元素 E peekFirst() 获取但不移除此列表的第一个元素(链表为空,返回null) E pollFirst() 获取但不移除此列表的第一个元素(列表为空,返回 null) 优点:随机增删元素效率较高(链表增删元素不涉及到大量元素的位移)
缺点:查找效率较低(内存空间不是连续的)
Collection集合子接口之一 ----- Set集合详解
一、Set集合基本概念
Set集合继承结构图
Set集合特点
(1) 元素按一定顺序放入集合,不一定会按原顺序取出
(2) Set集合中的元素没有下标Set集合的子接口SortedSet集合的特点
(1) 元素按一定顺序放入集合,不一定会按原顺序取出
(2) Set集合中的元素没有下标
(3) 存放到该集合中的元素会按照大小自动排序实现类
Set接口的实现类 ----- HashSet:
创建HashSet集合对象时,底层实际上new了一个HashMap对象,其key值用来存放HashSet的元素。SortedSet接口的实现类 ----- TreeSet:
创建TreeSet集合时,底层实际上new了一个TreeMap对象,其key值用来存放TreeSet的元素。测试
HashSet<Integer> set1 = new HashSet<>(); // 存放元素:10 10 10 12 3 set1.add(10); set1.add(10); set1.add(10); set1.add(12); set1.add(3);// 输出:3 10 12(无序) for (int i : set1) {System.out.print(i); }TreeSet<Integer> set2 = new TreeSet<>(); // 存放元素:3 3 2 10 8 set2.add(3); set2.add(3); set2.add(2); set2.add(10); set2.add(8);// 输出:2 3 8 10 for (int i : set2) {System.out.print(i); }
二、构造方法
HashSet:
构造方法 | 说明 |
---|---|
HashSet() | 创建一个默认容量为16,加载因子为0.75的集合对象 |
HashSet(Collection<? extends E> c) | 用Collection集合初始化 |
HashSet(int initialCapacity) | 设置指定容量初始化 |
HashSet(int initialCapacity, float loadFactor) | 设置指定容量和加载因子初始化 |
TreeSet:
构造方法 | 说明 |
---|---|
TreeSet() | 创建一个空集合 |
TreeSet(Collection<? extends E> c) | 用Collection集合初始化 |
TreeSet(SortedSet<? extends E> c) | 用SortedSet集合初始化 |
TreeSet(Comparator<? super E> comparator) | 设置一个比较器来初始化集合 |
集合 (一) ----- 集合的基本概念与Collection集合详解相关推荐
- Laravel学习笔记汇总——Collection方法详解
## Laravel学习笔记汇总--Collection方法详解 本文参考:https:// laravel.com/docs/8.x/collections // 返回整个底层的数组 collect ...
- 2接口详解_java集合【2】——— Collection接口详解
一.Collection接口简介 二.Collection源码分析 三.Collection的子类以及子类的实现 3.1 List extend Collection 3.2 Set extend C ...
- java中集合什么时候有索引,JavaSE中Collection集合框架學習筆記(1)——具有索引的List...
前言:因為最近要重新找工作,Collection(集合)是面試中出現頻率非常高的基礎考察點,所以好好惡補了一番. 復習過程中深感之前的學習不系統,而且不能再像剛畢業那樣死背面試題,例如:String是 ...
- java集合框架的接口_Java集合框架之Collection接口详解
Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...
- java集合Collection常用方法详解
前言 出去面试的时候,对java的集合框架考察的知识点还是蛮多的.除了基础的集合常见API使用,对集合底层的实现原理以及数据结构等也有很多考察方面.而自己对这方面知之甚少,特地抽空进行研究和学习一下. ...
- Collection接口详解
文章目录 前言 一.Collection接口是什么? 二.Collection接口提供的方法 1.boolean addAll(Collection<? super T> c, T... ...
- Java Collection接口详解
Collection 接口是 List.Set 和 Queue 接口的父接口,通常情况下不被直接使用.Collection 接口定义了一些通用的方法,通过这些方法可以实现对集合的基本操作.定义的方法既 ...
- 矩概念与图像矩详解及其hu矩的运用
一.矩概念详解 矩这个东西,能组成的名词太多了,矩形,就是长方形,矩阵,就是m行n列的二维数组,所以想了解矩,就要从其具体的场景中去理解. 今天我们要讲的图像矩,就是一个新的概念,图像矩就是图像的矩, ...
- JAVA集合框架之List HashSet去重及TreeSet排序详解
无图言屌!先上图 说到List去重,很多人都知道用contains()方法,其实contains()方法依据的equals()方法,比较两个对象的引用是否相同,如果要List比较两个自定义定义对象是否 ...
最新文章
- Vista下硬盘管理
- Diango博客--14.使用 Django 项目中的 ORM 编写伪造测试数据脚本
- [OI学习笔记]最小生成树之Prim算法
- python new init_python的new与init
- 计算机信息管理是学什么课程设计,毕业论文计算机专业学生信息管理系统(数据库课程设计)...
- Windows操作系统的缘由
- 简单数据查询——单表无条件和有条件查询
- 指纹匹配算法matlab,指纹识别算法matlab程序
- 鼠标右键中新建选项消失
- win10右键没有新建选项,无法新建文件夹
- Bootstrap系列之面包屑导航(Breadcrumb)
- 2020年下半期第一次实训
- pyqt 事件更新图片显示_暗黑战神3D网游ARPG实战案例(Unity 2017.3)更新
- 开源文档协作套件CryptPad
- 我的理想作文400字计算机,我的理想作文400字5篇
- HDU - 1873
- 存储基础:LUN、ThickLUN与Thin LUN的联系和区别
- 【年度榜单】2020大数据产业创新服务产品丨数据猿·金猿榜
- 计算机没有音频驱动程序,电脑有驱动却没有高清晰音频管理器华硕主板应该装什么声卡驱动...
- Hi-End音箱真伪(3)-巴汉著文
热门文章
- 机智云产品、功能、服务一览表
- VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks kernel application (一)
- CoreData之增删改查
- java 过滤器(参数传递中文乱码)
- JBoss3.0 下配置和部署EJB简介
- 几个 XmlTextReader 的例子, 帮了我大忙.
- 【重识 HTML + CSS】定位
- 【JavaScript 笔记】— 函数高级(变量作用域、解构赋值、方法、高阶函数、闭包、箭头函数、generator)
- notepad++行首行尾添加字符
- o3命令 linux,linux文本处理命令 一