JavaSE——类集(上)(Collection、List、Iterator、forEach)

第2节 集合(上)

因为已经有数据结构的基础,前面有关数据结构的知识就不单独整理了,直接上Java的集合类的知识。

一、类集(集合类)

1.1 集合概述

集合: 集合是java中提供的一种容器,可以用来存储多个数据。

集合和数组的区别:

  • 数组的长度固定,集合的长度可变;

  • 数组中存储的是同一个类型的元素,可以存储基本数据类型值,集合存储的都是对象,而且对象的类型可以不一致,在开发中一般当对象多的时候,使用集合来进行存储。

对象数组有哪些问题?普通的对象数组的最大问题在于数组中的元素个数是固定的,不能动态的扩充大小,所以最早的时候可以通过链表实现一个动态对象数组,但是这样毕竟太复杂了,所以在Java中为了方便用户操作各个数据结构,引入了类集的概念,有时候就可以把类集称为java对数据结构的实现

1.2 集合框架

JavaSE提供了满足各种需求的API,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活运用。

集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map

类集中最大的几个操作接口:CollectionMapIterator,这三个接口为以后要使用的最重点的接口。所有的类集操作的接口或类都在java.util包中。

Java类集的结构图:

在这里插入图片描述

二、Collection接口

2.1 Collection介绍

Collection接口是在整个Java类集中保存单值 的最大操作父接口(Map是保存双值/键值对的最大操作父接口),里面每次操作的时候都只能保存一个对象的数据,此接口定义在java.util包中。

有两个重要的子接口,分别是java.util.Listjava.util.Set。其中,List的特点是元素有序、元素可重复;Set的特点是元素无序,而且不可重复。List接口的主要实现类有 java.util.ArrayListjava.util.LinkedListSet接口的主要实现类有 java.util.HashSetjava.util.TreeSet

此接口定义如下:

public interface Collection<E> extends Iterable<E>

注意这里使用了泛型,所以后面在使用具体实现类的时候都需要传入具体类型。

常用方法:

在这里插入图片描述

其中像add、iterator、size等方法很常用,此接口的全部子类或子接口就将全部继承以上的方法。

但是,在开发中不会直接使用 Collection接口,而比较常使用它的子接口 List Set

三、List接口

3.1 List概述

习惯性地会将实现了List接口的对象称为List集合,在List集合中允许出现重复元素,所有的元素是以一种线性方式存储的,可以通过索引来访问集合中的指定元素。

List接口的特点:

  1. 它是一个元素存取有序 的集合,例如:存元素的顺序是11、22、33,那么集合中元素的存储就是按照11、22、33的顺序完成的。(与Set相对)

  2. 它是一个带有索引 的集合,通过索引可以精确地操作集合中的元素(与数组的索引是一个道理)。

  3. 集合中可以有重复 的元素,通过元素的equals方法,来比较是否为重复的元素。

3.2 常用方法

   除了继承了Collection接口的方法外,还有如下常用的扩充方法:

在这里插入图片描述

了解了List接口之后,需要找到此接口的实现类,常用的实现类由如下三个:

ArrayList(95%) 、 Vector(4%) 、 LinkedList(1%)

3.3 ArrayList类

ArrayListList接口的子类, 此类的定义如下:

public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

ArrayList集合数据存储的结构是数组结构,元素增删慢,查找快,由于日常开发中使用的最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。

3.3.1 构造方法

在这里插入图片描述

这里涉及到一个容易被问的地方,初始容量是一开始就给了容量为10的空间吗?

这要从源码来解释:

ArrayList<String> all = new ArrayList<String>();

从创建ArrayList开始,进入空参数构造方法:

public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

来查看DEFAULTCAPACITY_EMPTY_ELEMENTDATA的值:

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

是一个空的对象数组,所以使用无参构造方法新创建的ArrayList对象,初始容量是0。

但是一旦add一个数据进入,会发生什么,进入add看一下:

在这里插入图片描述

在这里插入图片描述

不论是哪种方式的add,当元素存满了的时候,总要调用grow方法,下面来看grow方法:

private Object[] grow(int minCapacity) {return elementData = Arrays.copyOf(elementData,                                       newCapacity(minCapacity));
}private Object[] grow() {return grow(size + 1);
}

无参grow方法会调用有参grow,并且传入当前容量+1作为扩容的最小容量,有参grow内部是调用了Arrays.copyOf函数,将扩容后的数组给了elementData,再看newCapacity(minCapacity)

在这里插入图片描述

新扩容的容量为原来的1.5倍,如果比给定的最小容量小或相等,判断elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA,而DEFAULTCAPACITY_EMPTY_ELEMENTDATA就是空数组,所以一个新创建的ArrayList必然会进入到这里,返回了DEFAULT_CAPACITY, minCapacity两个中的较大值,而新创建的minCapacity为1,这时来看一下DEFAULT_CAPACITY

在这里插入图片描述

这才是初始容量为10的地方。

综上,使用无参构造方法新创建的ArrayList对象起始的elementData为空数组,只有在加入一个元素的时候才会初始化为10.

3.3.2 具体使用

使用格式:

ArrayList<Integer> data = new ArrayList<>();

例子:

package org.listdemo.arraylistdemo;
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo01 {public static void main(String[] args) {List<String> all = new ArrayList<String>(); // 实例化List对象, 并指定泛型类型all.add("hello "); // 增加内容, 此方法从Collection接口继承而来all.add(0, "LAMP ");// 增加内容, 此方法是List接口单独定义的all.add("world"); // 增加内容, 此方法从Collection接口继承而来System.out.println(all); // 打印all对象调用toString()方法}
}结果如下:
[LAMP , hello , world]
package org.listdemo.arraylistdemo;
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo02 {public static void main(String[] args) {List<String> all = new ArrayList<String>(); // 实例化List对象, 并指定泛型类型all.add("hello "); // 增加内容, 此方法从Collection接口继承而来all.add(0, "LAMP ");// 增加内容, 此方法是List接口单独定义的all.add("world"); // 增加内容, 此方法从Collection接口继承而来all.remove(1); // 根据索引删除内容, 此方法是List接口单独定义的all.remove("world");// 删除指定的对象System.out.print("集合中的内容是: ");for (int x = 0; x < all.size(); x++) { // size()方法从Collection接口继承而来System.out.print(all.get(x) + "、 "); // 此方法是List接口单独定义的}}
}结果如下:
集合中的内容是: LAMP 、 

3.4 Vector类

3.4.1 概述与使用

ArrayList 一样, Vector 本身也属于 List 接口的子类, 此类的定义如下:

public class Vector<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

它的使用及操作与使用ArrayList本身基本没有什么区别:

package org.listdemo.vectordemo;
import java.util.List;
import java.util.Vector;
public class VectorDemo01 {public static void main(String[] args) {List<String> all = new Vector<String>(); // 实例化List对象, 并指定泛型类型all.add("hello "); // 增加内容, 此方法从Collection接口继承而来all.add(0, "LAMP ");// 增加内容, 此方法是List接口单独定义的all.add("world"); // 增加内容, 此方法从Collection接口继承而来all.remove(1); // 根据索引删除内容, 此方法是List接口单独定义的all.remove("world");// 删除指定的对象System.out.print("集合中的内容是: ");for (int x = 0; x < all.size(); x++) { // size()方法从Collection接口继承而来System.out.print(all.get(x) + "、 "); // 此方法是List接口单独定义的}}
}结果为:
集合中的内容是: LAMP 、 

Vector 属于 Java 元老级的操作类, 是最早的提供了动态对象数组的操作类, 在 JDK 1.0 的时候就已经推出了此类的使用,只是后来在 JDK 1.2 之后引入了 Java 类集合框架。但是为了照顾很多已经习惯于使用 Vector 的用户,所以在JDK 1.2 之后将 Vector 类进行了升级了, 让其多实现了一个 List 接口, 这样才将这个类继续保留了下来。

3.4.2 Vector与ArrayList类的区别(重点)

在这里插入图片描述

3.5 LinkedList类

3.5.1 概述

LinkedList集合数据存储的结构是链表结构,方便元素添加、删除的集合。

LinkedList是一个双向链表。

3.5.2 使用

除了继承的List中的方法外,还有一些关于队列或栈操作的方法,以及涉及到首尾操作:

在这里插入图片描述

在这里插入图片描述

例子:

import java.util.LinkedList;
import java.util.Queue;
public class TestDemo {public static void main(String[] args) {Queue<String> queue = new LinkedList<String>();queue.add("A");queue.add("B");queue.add("C");int len=queue.size();//把queue的大小先取出来, 否则每循环一次, 移除一个元素, 就少一个元素, 那么queue.size()在变小, 就不能循环queue.size()次了。for (int x = 0; x <len; x++) {System.out.println(queue.poll());}System.out.println(queue);}
}结果如下:
A
B
C
[]

四、Iterator迭代器(接口)

4.1 Iterator概述

在程序开发中,经常需要遍历集合中的所有元素,针对这种需求,JDK专门提供了一个接口java.util.Iterator。也是Java集合中的一员,但是它与CollectionMap接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

   此接口定义如下:
public interface Iterator<E>

要想使用此接口, 则必须使用 Collection 接口, 在 Collection接口中规定了一个 iterator()方法, 可以用于为 Iterator 接口进行实例化操作,其实要到ArrayList类这一级别(因为是接口的实现类)中才对Iterator接口进行了实现。

4.2 方法

此接口定义了以下三个方法:

在这里插入图片描述

通过Collection接口为其进行实例化之后,一定要记住,Iterator中的操作指针是在第一条元素之上, 当调用next()方法的时候, 获取当前指针指向的值并向下移动, 使用 hasNext()可以检查序列中是否还有元素。

在这里插入图片描述

看个例子:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorDemo01 {public static void main(String[] args) {Collection<String> all = new ArrayList<String>();all.add("A");all.add("B");all.add("C");all.add("D");all.add("E");Iterator<String> iter = all.iterator();while (iter.hasNext()) {// 判断是否有下一个元素String str = iter.next(); // 取出当前元素System.out.print(str + "、 ");}}
}结果如下:
ABCDE

Iterator接口本身可以完成输出的功能, 但是此接口只能进行由前向后的单向输出。 如果要想进行双向输出, 则必须使用其子接口 —— ListIterator

4.3 ListIterator(理解)

ListIterator是可以进行双向输出的迭代接口,是 Iterator的子接口, 此接口中定义了以下的操作方法:

在这里插入图片描述

看一下它的输出:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorDemo01 {public static void main(String[] args) {List<String> all = new ArrayList<String>();all.add("A");all.add("B");all.add("C");all.add("D");all.add("E");ListIterator<String> iter = all.listIterator();System.out.print("从前向后输出: ");while (iter.hasNext()) {System.out.print(iter.next() + "、 ");} System.out.print("\n从后向前输出: ");while (iter.hasPrevious()) {System.out.print(iter.previous() + "、 ");}}
}结果如下:
从前向后输出: ABCDE、 
从后向前输出: EDCBA

但是, 此处有一点需要注意的是, 如果要想进行由后向前的输出, 则首先必须先进行由前向后的输出。

而且它的add方法也是在指向的位置插入,不是在末尾插入,总之,此接口一般使用较少,理解为主。

五、增强for循环

forEach:增强for循环,最早出现在C#中,用于迭代数组 或 集合(只能是Collection下的集合)

语法: for(数据类型 变量名:集合或数组的名称) {}

作用: 代替传统for循环的复杂写法,进行了简化。

看一段代码即可,注意只能用于数组或Collection下的集合

package com.kaikeba.coreclasslibrary.set;
import java.util.ArrayList;
import java.util.Collection;public class foreach {public static void main(String[] args) {int[] arr = {6,5,4,2,1};//传统for循环遍历/*for(int i=0; i<arr.length; i++) {System.out.println(arr[i]);}*///forEach循环遍历for(int a:arr) {System.out.println(a);}System.out.println("------------------------");ArrayList<String> data = new ArrayList<>();data.add("锄禾日当午");data.add("汗滴禾下土");data.add("谁知盘中餐");data.add("粒粒皆辛苦");for(String s:data) {System.out.println(s);}}
}结果如下:
6
5
4
2
1
------------------------
锄禾日当午
汗滴禾下土
谁知盘中餐
粒粒皆辛苦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二个spring冲刺总结

讨论成员&#xff1a;罗凯旋、罗林杰、吴伟锋、黎文衷 第二阶段总体是做到了四则运算的demo&#xff0c;,包括APP进入动画&#xff0c;以及界面的基本效果设计&#xff0c;还有能进行综合计算&#xff08;选择题&#xff0c;可以 自动生成简单&#xff0c;容易&#xff0c;困难…

图灵奖得主姚期智:求解人工智能的中国答案

来源&#xff1a;清华大学他是“图灵奖”创立以来首位获奖的亚裔学者&#xff0c;也是迄今为止获此殊荣的唯一华裔计算机科学家。2004年从普林斯顿辞去终身教职回到清华任教。2005年&#xff0c;他为清华本科生创立了计算机科学实验班“姚班”。如今&#xff0c;在中国乃至全球…

JavaSE——类集(下)(Set、Comparable、Collections、Comparator、Map)

第2节 集合&#xff08;下&#xff09; 一、Set接口 java.util.Set 接口和 java.util.List接口一样&#xff0c;同样继承自 Collection接口&#xff0c;它与Collection接口中的方法基本一致&#xff0c;并没有对 Collection接口进行功能上的扩充&#xff0c;只是比Collection…

美国国家科学院发布《材料研究前沿:十年调查》

来源&#xff1a;中国科学院科技战略咨询研究院2月8日&#xff0c;美国国家科学院发布了针对材料研究的第三次十年调查《材料研究前沿&#xff1a;十年调查》报告。这次的调查主要评估了过去十年中材料研究领域的进展和成就&#xff0c;确定了2020-2030年材料研究的机遇、挑战和…

JavaSE——IO(上)(File、字节流、字符流、转换流、打印流、缓存流)

第3节 IO&#xff08;上&#xff09; 一、File类与文件基本操作 在程序中经常需要用到文件的操作&#xff0c;Java有专门的类来进行文件的操作——File类。 1.1 File类概述 它是对文件和目录路径名的抽象表示。 即它本身不是一个文件&#xff0c;只是一个抽象表示&#xff…

学习新技能时,大脑在如何发生改变?

来源&#xff1a;中国生物技术网众所周知&#xff0c;无论是一项运动、一种乐器还是一门手艺&#xff0c;掌握一项新技能都是需要花费时间并进行训练的。虽然我们都知道健康的大脑能够应付的来&#xff0c;但是为了开发出新行为大脑如何发生改变科学家们对此仍知之甚少。近日&a…

JavaSE——IO(下)(Properties类、序列化与反序列化)

第3节 IO&#xff08;下&#xff09; 一、.properties文件与Properties类 1.1 .properties文件介绍 .properties文件一种属性文件&#xff0c;以键值对 的格式存储内容&#xff0c;在Java中可以使用Properties类来读取这个文件&#xff0c;一般来说它作为一些参数的存储&…

VS调试dll详细过程记录

VS调试dll详细过程记录 qianghaohao(孤狼) 前言&#xff1a;在我们写的程序中有时候调用dll&#xff0c;并且需要跟踪dll中的函数&#xff0c;此时直接调试调用dll的工程是无法跳进dll的函数的&#xff0c;此时我们可以启动dll工程 来跟踪程序的走向。注意&#xff1a;要有…

谁在真正领跑 5G:技术创新和标准

来源&#xff1a;云头条5G是包括美国总统特朗普在内的所有人都在谈论的新技术。所以&#xff0c;每家公司自然都想谈论5G以及如何领跑这个领域。然而现实情况是&#xff0c;移动5G是一项涵盖甚广的无线标准&#xff0c;它改变了我们对蜂窝通信的认识&#xff0c;并前所未有地拓…

JavaSE——XML与JSON(语法格式、解析内容)

第6节 XML与JSON 一、XML 1.1 XML简介 XML全称为可扩展标记语言&#xff08;extensible Markup Language&#xff09; 。 特性&#xff1a; xml具有平台无关性&#xff0c;是一门独立的标记语言&#xff1b; xml具有自我描述性。 用途&#xff1a; 网络数据传输 数据存…

三大阶段,四大领域,详解你不知道的AIoT!

AIoT即AIIoT&#xff0c;指的是人工智能技术与物联网在实际应用中的落地融合。目前&#xff0c;越来越多的行业及应用将AI与IoT结合到了一起&#xff0c;AIoT已经成为各大传统行业智能化升级的最佳通道&#xff0c;也是未来物联网发展的重要方向。来源&#xff1a;物联网智库AI…

人类为什么会同情机器人,是否需要禁止虐待机器人

6月14日&#xff0c;一段形似波士顿动力机器人Atlas反击人类的视频在网络热传&#xff0c;制作这款视频的团队Corridor Digital&#xff0c;是一家位于洛杉矶的美国制作工作室。自2010年以来&#xff0c;一直以制作与流行文化相关的病毒在线短片视频而闻名。Corridor Digital由…

dubbo学习总结——思维导图

Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的、轻量级的开源Java RPC框架&#xff0c;可以和Spring框架无缝集成&#xff0c;2018年阿里巴巴把这个框架捐献给了apache基金会 什么是RPC&#xff1f; RPC全称为remote procedure call&#xff0c;即远程…

python为字体添加上下标

添加上标&#xff1a;^ 添加下标&#xff1a;_ 举例&#xff1a; import numpy as np import matplotlib.pyplot as pltt np.linspace(0, 10, 1000) y np.sin(t) plt.plot(t, y) plt.xlabel(a/${m_2}$,fontdict{weight: normal, size: 15}) plt.show() 效果&#xff1a; …

微信演进的六点思考:微信生态如何演变?如何在其中掘金?

*头图来源&#xff1a;东方IC来源&#xff1a;虎嗅APP虎嗅注&#xff1a;在微信上下游诞生了无数的生态企业&#xff0c;他们关注着微信的一举一动&#xff0c;以便在其中掘金。6月15日&#xff0c;微盟集团CEO孙涛勇在华映资本WE来大会上&#xff0c;分享了对微信生态商业进化…

Day Two(Beta)

站立式会议 站立式会议内容总结 331 今天&#xff1a;指导队友学会xml布局及简单动画,解决了关于中文链接过滤器不能将iso编码改为utf8的情况(修改servletContainer默认编码) 遇到的问题&#xff1a;无 明天&#xff1a;闹钟简单实现,完善方法待解决442 今天&#xff1a;书籍评…

新技术“红”不过十年,半监督学习为什么是个例外?

来源 | 转载自知乎这一波深度学习的发展&#xff0c;以2006年Hinton发表Deep Belief Networks的论文为起点&#xff0c;到今年已经超过了10年。从过往学术界和产业界对新技术的追捧周期&#xff0c;超过10年的是极少数。从深度学习所属的机器学习领域来看&#xff0c;到底什么样…

word空格显示小点

那是因为不小心点了显示隐藏标记&#xff0c;取消即可

《细胞》重磅连发:记忆可“遗传”!

来源&#xff1a;偷鸡捕虾摸螺蛳有人说&#xff0c;记忆到最后也许是最宝贵的财富。人们总是希望能够把最珍视、最有价值的记忆保留下来。科学家们也正为此孜孜不倦的努力着。在2016年的SXSW大会上&#xff0c;南加州大学教授Theodore Berger宣布了一个轰动整个科技界的消息&am…

单词搭配用法查询网站

http://www.just-the-word.com/ 例如查询improve单词的搭配