详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法

集合的概念

      当我们需要保存一组一样(类型相同)的元素的时候,我们应该使用一个容器来存储,数组就是这样一个容器。

数组的特点:     

      数组是一组数据类型相同的元素集合;

      创建数组时,必须给定长度,而且一旦创建长度不能改变;

      一旦数组装满元素,就需要创建一个新的数组,将元素复制过去;

数组的局限:

        如果装满了,就需要数组复制;

        当我们需要从数组中删除或添加一个元素,需要移动后面的元素;

集合的作用:

       在开发实践中,我们需要一些能够动态增长长度的容器来保存我们的数据,java中为了解决数据存储单一的情况,java中就提供了不同结构的集合类,可以让我们根据不同的场景进行数据存储的选择,如Java中提供了 数组实现的集合,链表实现的集合,哈希结构,树结构等。

分类

单列集合:一次放进去一个值 ( 对象 )

Collection接口:定义了单列集合共有的方法,其子接口Set和List分别定义了存储方式

List:可以有重复元素

Set:不可以有重复元素

双列集合: 键    值

集合API

集合体系概述: Java的集合框架是由很多接口、抽象类、具体类组成的,都位于java.util包中。

List 接口及实现类

概念:List继承了Collection接口,有三个实现的类,分别是:

ArrayList       数组列表

LinkedList     链表列表

Vector            数组列表 (是线程安全的)

1.  ArrayList

         ● 底层有一个数组,可以动态扩展数组长度,并提供了一系列方法操作。

特点: 查询快,在中间增加 / 删除慢

注意:集合容器类中默认可以添加Object类型,但是一般建议一个集合对象只保存同一种类型,若保存多个类型后期处理时涉及类型转换问题;所以我们可以通过泛型来加以控制。

  
         ● 泛型:声明类型时可以自定义参数类型
                      ArraysList  <E>
ArrayList的常用方法:

ArrayList<String> arrayList = new ArrayList();arrayList.add("a");arrayList.add("b");arrayList.add("c");arrayList.add(3,"a");arrayList.remove("a");  //根据内容删除匹配的第一个元素,返回值为booleanarrayList.remove(1);    //删除并返回指定位置的元素arrayList.get(1);         //获取指定位置的元素arrayList.set(1,"X");     //替换并返回指定位置的元素arrayList.clear();        //清空集合中的元素arrayList.isEmpty();      //判断集合元素是否为空arrayList.contains("c");  //判断是否包含指定元素arrayList.size();         //返回集合中元素个数

2.  LinkedList

● 底层是一个链表结构,查询效率低,但增加 / 删除元素快

LinkedList中方法及功能和ArrayList中的方法大致相同,只不过LinkedList中多了关于队列相关的操作方法。

3.  Vector

和ArrayList一样,底层也是数组实现,不同的是Vector的方法默认加了锁,线程是安全的。

List接口集合迭代

List集合遍历方式有四种:

●  1.  for循环遍历          ● 2.  增强for循环遍历   

        //List集合遍历方式1:for循环for (int i = 0; i < arrayList.size(); i++) {if ("a".equals(arrayList.get(i))){arrayList.remove("a");//允许修改集合元素i--;            // 要注意索引的变化与元素位置的移动}}System.out.println(arrayList);System.out.println("----------------");//List集合遍历方式2:增强for循环for (String s:arrayList) {System.out.println(s);   //不能修改集合元素}

 3.  迭代器遍历 (Iterator)

        //List集合遍历方式3:使用迭代器遍历//获得集合对象的迭代器对象Iterator<String> it = arrayList.iterator();while(it.hasNext()){String s = it.next();//获取下一个院系if (s.equals("a")) {it.remove();  //使用迭代器对象删除元素}}System.out.println(arrayList);

4.  ListIterator迭代器:

public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList();arrayList.add("a");arrayList.add("b");arrayList.add("c");arrayList.add("d");/*ListIterator迭代器只能对List接口下的实现遍历ListIterator(index)可以从指定位置开始向前向后遍历*/ListIterator<String> listIterator= arrayList.listIterator(arrayList.size());while(listIterator.hasPrevious()){System.out.println(listIterator.previous());//逆序遍历}}

Set接口

● Set接口也继承了Collection接口,Set中所储存的元素是不重复的,但是是无序的,Set中的元素没有索引。

Set接口的实现类

● HashSet 

● 1. HashSet类中的元素不能重复

 public static void main(String[] args) {HashSet set =new HashSet<>();set.add("a");set.add("a");set.add("b");set.add("c");    //元素是不重复的System.out.println(set);}

● 2. HashSet类中的元素是无序的 

public static void main(String[] args) {HashSet set =new HashSet<>();set.add("c");set.add("s");set.add("x");set.add("d");    //元素是无序的System.out.println(set);set.remove("s");//没有索引,只能根据内容遍历set.iterator();//没有索引,要用迭代器遍历}

 HashSet在添加元素时,是如何判断元素重复的?          *  重点  * 

在底层会先调用hashCode(),注意,Object中的hashCode()返回的是对象的地址,此时并不会调用;此时调用的是类中重写的hashCode(),返回的是根据内容计算的哈希值,遍历时,会用哈希值先比较是否相等,会提高比较的效率;但哈希值会存在问题:内容不同,哈希值相同;这种情况下再调equals比较内容,这样既保证效率又确保安全。

例:

这是错误写法,此时默认调用的是Object类中hashCode( ),返回对象地址

import java.util.HashSet;
import java.util.Objects;public class Student {private String name ;private String num;public Student(String name, String num) {this.name = name;this.num = num;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", num='" + num + '\'' +'}';}public static void main(String[] args) {HashSet<Student> set = new HashSet<>();Student s1 = new Student("小王1","10001");Student s2 = new Student("小王2","10002");Student s3 = new Student("小王3","10003");Student s4 = new Student("小王1","10001");set.add(s1);set.add(s2);set.add(s3);set.add(s4);System.out.println(set);}}

 正确写法应该是,在Student类中重写hashCode()和equals()

package Demo;import java.util.HashSet;
import java.util.Objects;public class Student {private String name ;private String num;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return num.equals(student.num);}@Overridepublic int hashCode() {return Objects.hash(num);}public Student(String name, String num) {this.name = name;this.num = num;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", num='" + num + '\'' +'}';}public static void main(String[] args) {HashSet<Student> set = new HashSet<>();Student s1 = new Student("小王1","10001");Student s2 = new Student("小王2","10002");Student s3 = new Student("小王3","10003");Student s4 = new Student("小王1","10001");set.add(s1);set.add(s2);set.add(s3);set.add(s4);System.out.println(set);}}

这样就能避免重复了(此图是s1,s4重复,但只输出s1)

补充:如何快速生成hashCode()和equals()的重写方法?

右键选择Generate,选择equals()and hashCode(),选择重写的属性。

● TreeSet

......敬请期待^_^

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

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

相关文章

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图&#xff1a;Discuz X3.5的系统信息&#xff0c;上传许可为1024MB(1GB) 论坛为局域网论坛&#xff0c;仅供内部同事交流使用&#xff01; 使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图&#xff1a;选择上传附件&#xff08;提示可以最大上传100M&#xff09;…

【Python】新手入门(2):避免将关键字作为标识符

Python新手入门&#xff08;2&#xff09;&#xff1a;避免将关键字作为标识符 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1…

保护模式笔记九 中断门和IDT(中断描述符表)

段选择子&#xff1a; 先直观认识一下GDT和段选择子在逻辑地址转换为线性地址中的作用&#xff0c;例如&#xff1a; 给出逻辑地址&#xff1a;21h:12345678h&#xff0c;需要将其转换为线性地址 a. 选择子SEL21h0000000000100 0 01b&#xff0c;他代表的意思是&#xff1a…

Ruoyi框架上传文件

axios资料&#xff1a;axios中文文档|axios中文网 | axios axiosjson 默认情况下&#xff0c;axios将JavaScript对象序列化为JSON。 submit(data) {if (data && this.definitionId) {// 启动流程并将表单数据加入流程变量startProcess(this.definitionId, JSON.string…

数据可视化原理-腾讯-3D热力图

在做数据分析类的产品功能设计时&#xff0c;经常用到可视化方式&#xff0c;挖掘数据价值&#xff0c;表达数据的内在规律与特征展示给客户。 可是作为一个产品经理&#xff0c;&#xff08;1&#xff09;如果不能够掌握各类可视化图形的含义&#xff0c;就不知道哪类数据该用…

代码随想录刷题笔记-Day29

1. N皇后 51. N 皇后https://leetcode.cn/problems/n-queens/ 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数…

【Sql Server】C#通过拼接代码的方式组合添加sql语句,会出现那些情况,参数化的作用

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

JavaWeb JSP

JSP&#xff08;Java Server Page&#xff09;是J2EE的功能模块&#xff0c;是Java服务器页面&#xff0c;由Web服务器执行&#xff0c;作用就是降低动态网页开发难度&#xff0c;将Java代码与HTML分离&#xff0c;降低开发难度&#xff0c;本质就是Servlet。 Servlet的缺点&a…

pandas数据分析42——读取和写入stata和spss的数据格式

python就是胶水语言&#xff0c;啥文件基本都能读取&#xff0c;而且pandas作为数据分析最好用的包&#xff0c;其功能自然也很多&#xff0c;可以读取各种数据文件。 本次就来演示一下怎么读取stata文件&#xff0c;和spss文件&#xff0c;他们不仅储存了数据和变量&#xff…

C++--机器人的运动范围

目录 1. 题目 2. 思路 3. C代码测试 4. 测试结果 1. 题目 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#xff0c;下四个方向移动一格&#xff0c;但是不能进入行坐标和列坐标的数位之和大于k的格…

如何应对IT服务交付中的问题?

如何应对IT服务交付中的问题&#xff1f; 按需交付服务的挑战IT服务体系的复杂性恶性循环的形成学会洞察的重要性书籍简介参与方式 按需交付服务的挑战 一致性、可靠性、安全性、隐私性和成本效益的平衡&#xff1a;成功的按需交付服务需要满足这些要求&#xff0c;这需要服务…

html样式排版

<template><div class"box"><div class"header">头部</div><div class"main"><div class"left">菜单</div><div class"right"><div class"right-contentr"&g…

【C++】list模拟实现+反向迭代器

list模拟实现 list定义list用法list iterator的使用begin() end()rbegin()rend() reverse()sort()merge()unique()remove()splice() list模拟实现struct和class的区别list三个类模板默认成员函数构造函数拷贝构造函数赋值运算符重载析构函数 数据修改操作push_back()push_fron…

正信法律:借了钱找不到人怎么办

当一个人借出钱财之后&#xff0c;发现借款人像蒸发了一般无影无踪&#xff0c;这无疑是一件让人头疼的事情。面对这种情况&#xff0c;我们需要采取明智的措施来保护自己的权益。 尽量联络借款人。可以通过电话、短信、电子邮件或社交媒体尝试联系&#xff0c;同时也可以询问共…

界面控件DevExpress WinForms 2024产品路线图预览(一)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

excel数值无法左对齐

右键&#xff0c;单元格格式 修改为常规 解决

【力扣精选算法100道】——判定是否互为字符重排(哈希专题)

目录 &#x1f6a9;了解题意 &#x1f6a9;算法原理 第一种&#xff1a;排序 第二种方法&#xff1a;哈希 &#x1f6a9;实现代码 面试题 01.02. 判定是否互为字符重排 - 力扣&#xff08;LeetCode&#xff09; &#x1f6a9;了解题意 我们输入俩个字符串&#xff0c;当俩…

张雨霏同款食谱火了,冠军的健康饮食秘密被发现了

2024新一届奥运年到来之际&#xff0c;厨电集成灶领军品牌的森歌突然爆出要“让全民吃到‘冠军’餐”&#xff0c;一时让业界震惊&#xff0c;也让有集成灶消费欲求的消费者感到惊喜。 森歌集成灶的这个“豪言壮语”是来源于森歌联合国家体育总局训练局共同启动的“2024森歌冠…

jquery 后台返回的单选框按照两列展示

jquery代码 <!DOCTYPE html> <html><head><!-- <meta charset"GBK"> --><meta charset"UTF-8"><title></title></head><form><body><table id"myTable"> <tbody …

代码随想录算法训练营Day37 | LeetCode738.单调递增的数字、LeetCode968.监控二叉树、贪心算法总结

LeetCode738.单调递增的数字 思路&#xff1a;与分糖果的题目同理&#xff0c;因为需要与前一位数比较&#xff0c;并且修改这两个数&#xff0c;因此需要从后往前遍历&#xff0c;当前一位数比当前数大时&#xff0c;则前一个数-1&#xff0c;后一个数变为9。 代码细节&…