Java学习笔记 集合的使用

在实际的项目中开发过程中,会有很多的对象,如何高效、方便的管理这些对象,是影响程序性能与可维护性的重要环节。在Java语言中为这个问题提供了一套完美的解决方案,也就是接下来要介绍的集合框架。

1.1 集合框架的结构

在这里插入图片描述
在这里插入图片描述
从Collection接口 继承而来的一般被称为聚焦(有时也被宽泛的称为集合),从Map接口继承来的一般被称为映射。

在Set和Map接口中,都有一个继承自他们的SortedXXX子接口(XXX = Set/Map)

1.2 列表

1.2.1 List(列表)接口

List接口继承自Collection接口,代表列表的功能(角色),其中的元素可以按索引的顺序访问,所以也可以称为有索引的Collection。实现该接口的类均属于Ordered
类型,具有列表的功能,其元素顺序均是按照添加(索引)的先后进行排列的

List接口的常用方法
(略)

与数组一样,列表中的索引是从0开始的,实现了List接口的类也可以被看做可变长度的数组来使用。
List接口中的方法很注重索引。如果开发人员需要对其中每个元素的插入位置进行精准的控制,并且需要根据元素的整数索引访问元素,或搜索列表中的元素,则可以使用实现了该类的接口类。

1.2.2 数组实现列表

ArrayList,是List接口最常用的实现之一。可以向其中添加包括null值在内的所有对象引用型的元素。甚至该对象引用自己也可以作为其中的元素。这样可以方便的搭建一个树状结构的集合。

该类内部类实际上是依赖数组实现的,因此对元素进行随机访问的性能很好,但如果进行大量的插入、删除操作,该类性能很差,

ArrayList中,功能方法大都实现自List接口。

package list;

import java.util.ArrayList;

//一个使用ArrayList的例子
public class Sample1 {
public static void main(String[] args) {

	//创建列表ArrayList对象
	ArrayList al = new ArrayList(); 
	
	//初始化ArrayList中的元素
	for(int i = 0;i<50;i++) {
		al.add(String.valueOf(i));
	}
	//对arrlist进行操作
	for(int i = 60;i<75;i++) {
		al.set(i-45, String.valueOf(i));
	}
	
	//打印ArrayList列表里的内容
	System.out.println("这是ArrayList操作后的结果:");
	System.out.println(al);
	//取出指定元素并进行处理
	Object o = al.get(22);
	String s = (String)o;
	System.out.println("索引为22的元素长度为:"+s.length());

}
}

在这里插入图片描述

  • 将ArrayList中从索引15开始之后长度为15区间内的元素依次设置为数字60~74的字符串,
  • 头文件:java.util.*
  • 在没有使用泛型的情况下,无论放进集合的是什么元素,取出的都是Object类型的引用,
    ArrayList中并不真正存放对象,而只是存放对象的引用,所有集合框架中的类都如此

1.3 链接实现列表

指LinkedList类,功能与ArrayList类相同,都是列表List的实现。由于其内部是依赖双链表来实现的,因此具有很好的插入、删除性能。但随机访问元素相对较差。适合用在插入、删除多,元素随机访问少的场合。

package list;

import java.util.LinkedList;

public class Sample2 {

	public static void main(String[] args) {

		//创建列表LinkedList对象
		LinkedList ll = new LinkedList();
		
		//初始化LinkedList对象
		for(int i = 0;i<50;i++) {
			ll.add(String.valueOf(i));
		}
		//对LinkedList进行插入操作
		for(int i = 15;i<30;i++) {
			ll.add(i,String.valueOf(30-i+15));
		}
		//打印LinkedList列表
		System.out.println("这是LinkedList操作后的结果");
		System.out.println(ll);
	}

}

在这里插入图片描述
在LinkedList索引为15的地方插入15个元素,其中内容为30-16的字符串。

1.3.1 依赖性倒置原理

依赖项倒置原理:依赖应尽量在抽象层进行,避免在具体层进行。
在实际开发中的含义就是应该尽量使用接口类型的引用,避免使用具体类型的引用。

package list;

import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

public class MyClass {

		//声明具体类类型的引用
		public LinkedList firstList = new LinkedList();
	
		//声明具体类类型入口参数的方法
		public void printLinkedList(LinkedList ll) {
			System.out.println(ll);
		}
		//声明接口类型的引用
		public List lastList = new Vector();
		//声明接口类型入口参数的方法
		public void printAllKindsOfList(List l) {
			System.out.println(l);
		}

}

-firstList是具体类类型的引用,在未来如果需要改变为其他类型,则会严重影响依赖他的代码。而LastList是接口类型的引用,在未来如果需要,可以指向任何实现了该接口的


在这里插入图片描述

package com.hspedu.homework;

import java.util.ArrayList;

/**
 * @author 韩顺平
 * @version 1.0
 */
@SuppressWarnings({"all"})
public class Homework01 {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add(new News("新冠确诊病例超千万,数百万印度教信徒赴恒河\"圣浴\"引民众担忧"));
        arrayList.add(new News("男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生"));

        int size = arrayList.size();
        for (int i = size - 1; i >= 0; i--) {
            //System.out.println(arrayList.get(i));
            News news = (News)arrayList.get(i);
            System.out.println(processTitle(news.getTitle()));
        }

    }
    //专门写一个方法,处理现实新闻标题 process处理
    public static String processTitle(String title) {

        if(title == null) {
            return "";
        }

        if(title.length() > 15) {
            return title.substring(0, 15) + "..."; //[0,15)
        } else {
            return title;
        }

    }
}

/**
 * 按要求实现:
 * (1) 封装一个新闻类,包含标题和内容属性,提供get、set方法,重写toString方法,打印对象时只打印标题;
 * (2) 只提供一个带参数的构造器,实例化对象时,只初始化标题;并且实例化两个对象:
 *
 * 新闻一:新冠确诊病例超千万,数百万印度教信徒赴恒河“圣浴”引民众担忧
 * 新闻二:男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生
 * (3) 将新闻对象添加到ArrayList集合中,并且进行倒序遍历;
 * (4) 在遍历集合过程中,对新闻标题进行处理,超过15字的只保留前15个,然后在后边加“…”
 * (5) 在控制台打印遍历出经过处理的新闻标题;
 */
class News {
    private String title;
    private String content;

    public News(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "News{" +
                "title='" + title + '\'' +
                '}';
    }
}

在这里插入图片描述

public class Homework02 {
    public static void main(String[] args) {

        ArrayList arrayList = new ArrayList();
        Car car = new Car("宝马", 400000);
        Car car2 = new Car("宾利",5000000);
        //1.add:添加单个元素
        arrayList.add(car);
        arrayList.add(car2);
        System.out.println(arrayList);
        //* 2.remove:删除指定元素
        arrayList.remove(car);
        System.out.println(arrayList);
        //* 3.contains:查找元素是否存在
        System.out.println(arrayList.contains(car));//F
        //* 4.size:获取元素个数
        System.out.println(arrayList.size());//1
        //* 5.isEmpty:判断是否为空
        System.out.println(arrayList.isEmpty());//F
        //* 6.clear:清空
        //System.out.println(arrayList.clear(););
        //* 7.addAll:添加多个元素
        System.out.println(arrayList);
        arrayList.addAll(arrayList);//2个宾利
        System.out.println(arrayList);
        //* 8.containsAll:查找多个元素是否都存在
        arrayList.containsAll(arrayList);//T
        //* 9.removeAll:删除多个元素
        //arrayList.removeAll(arrayList); //相当于清空
        //* 使用增强for和 迭代器来遍历所有的car , 需要重写 Car 的toString方法

        for (Object o : arrayList) {
            System.out.println(o);//
        }
        System.out.println("===迭代器===");
        Iterator iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);

        }

    }
}
/**
 * 使用ArrayList 完成对 对象 Car {name, price} 的各种操作
 * 1.add:添加单个元素
 * 2.remove:删除指定元素
 * 3.contains:查找元素是否存在
 * 4.size:获取元素个数
 * 5.isEmpty:判断是否为空
 * 6.clear:清空
 * 7.addAll:添加多个元素
 * 8.containsAll:查找多个元素是否都存在
 * 9.removeAll:删除多个元素
 * 使用增强for和 迭代器来遍历所有的car , 需要重写 Car 的toString方法
 */
class Car {
    private String name;
    private double price;

    public Car(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

在这里插入图片描述

import java.util.*;

/**
 * 按要求完成下列任务
 * 1)使用HashMap类实例化一个Map类型的对象m,键(String)和值(int)分别用于存储员工的姓名和工资,
 * 存入数据如下:	jack—650元;tom—1200元;smith——2900元;
 *
 * 2)将jack的工资更改为2600元
 *
 * 3)为所有员工工资加薪100元;
 * 4)遍历集合中所有的员工
 * 5)遍历集合中所有的工资
 */

public class HomeWork04 {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        hashMap.put("jack",650);
        hashMap.put("tom",1200);
        hashMap.put("smith",2900);
        System.out.println(hashMap);

        hashMap.put("jack",2600);
        System.out.println(hashMap);

        //--------------------------------------
        Set set = hashMap.keySet();//获得key值
        for (Object key : set) {
            hashMap.put(key,(Integer)hashMap.get(key)+100);
        }
        System.out.println(hashMap);

        //=================================
        System.out.println("==========遍历==========");
        //遍历EntrySet
        Set entrySet = hashMap.entrySet();
        //迭代器
        Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Map.Entry next =  (Map.Entry)iterator.next();

            System.out.println(next.getKey()+"--"+next.getValue());
        }
        System.out.println("=========遍历所有工资========");
        Collection values = hashMap.values();
        for (Object value : values) {
            System.out.println("工资="+value);
        }

    }
}

在这里插入图片描述
在这里插入图片描述

会。
//add 方法,因为 TreeSet() 构造器没有传入Comparator接口的匿名内部类
//        所以在底层 Comparable<? super K> k = (Comparable<? super K>) key;
//        即 把 Perosn转成 Comparable类型

        treeSet.add(new Personn());//ClassCastException.
//        treeSet.add(new Personn());//ClassCastException.
//        treeSet.add(new Personn());//ClassCastException.
//        treeSet.add(new Personn());//ClassCastException.
//        treeSet.add(new Personn());//ClassCastException.

        System.out.println(treeSet);

    }
}

只有一个person
因为返回值为0.

解决错误方法:写一个方法实现接口。
//class Personn implements Comparable{
//
//    @Override
//    public int compareTo(Object o) {
//        return 0;
//    }
//}

在这里插入图片描述

新创建了两个Person对象,并放入HashSet中。重写p1的name方法。
此时因为name发生变化,找不到P1。修改不了。输出p1、 p2.
再加入一个1001,CC,HashSet将找寻相同的元素。找不到,所以加到后面,输出,三个元素
再加入一个新的1001,AA。HashMap没有在已有的Map中找到相同的元素。所以会输出4个元素

在这里插入图片描述

在这里插入图片描述

参考

Java中Map的 entrySet() 详解以及用法(四种遍历map的方式)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【IC验证】一文速通多通道数据整型器(MCDF)

目录 01 README 02 MCDF设计结构 2.1 功能描述 2.2 设计结构 2.3 接口与时序 2.3.1 系统信号接口 2.3.2 通道从端接口 2.3.3 整形器接口 2.3.4 控制寄存器接口 2.3.4.1 接口时序图 2.3.4.2 各数据位信息 03 验证框图 3.1 reg_pkg 3.1.1 reg_trans 3.1.2 reg_driv…

[work] AI算法八股总结

一、深度学习面试宝典 amusi/Deep-Learning-Interview-Book: 深度学习面试宝典&#xff08;含数学、机器学习、深度学习、计算机视觉、自然语言处理和SLAM等方向&#xff09; (github.com)https://github.com/amusi/Deep-Learning-Interview-Book 深度学习八股https://github…

ChatTTS:开源最强文本转真人语音工具

目录 1.前言 2.详细介绍 2.1 什么是ChatTTS 2.2 项目地址: 2.3 应用特点: 3.如何安装和使用 3.1.谷歌colab 3.1.1.点击链接 3.1.2 进行保存 3.1.3 按照流程依次点击运行 3.1.4 填写自己需要转的文字 3.2 本地运行 3.2.1 下载或克隆项目源码到本地 3.2.2 …

JAVA多线程与IO流知识总结

文章目录 IO流体系字节流FileOutputStreamFileInputStreamtry-catch处理 字符流FileReaderFIleWriter原理分析 使用场景字节缓冲流BufferedInputStreamBufferedOutputStream 字符缓冲流BufferedReaderBufferedWriter 转换流InputStreamReaderOutputStreamWriter 序列化流Object…

SQL刷题笔记day8——SQL进阶——表与索引操作

目录 1 创建一张新表 2 修改表 3 删除表 4 创建索引 5 删除索引 1 创建一张新表 我的答案 create table if not exists user_info_vip (id int(11) primary key auto_increment Comment自增ID, # 有了主键就不用写not nul了 uid int(11) unique not null Comment用户ID, …

MMPose-RTMO推理详解及部署实现(下)

目录 前言一、RTMO推理(Python)1. RTMO预测2. RTMO预处理3. RTMO后处理4. RTMO推理 二、RTMO推理(C)1. ONNX导出2. RTMO预处理3. RTMO后处理4. RTMO推理 三、RTMO部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.2 配置Makefile 3. ONNX导出4. engine生成5. 源码修改6. 运行…

Git 恢复已删除的branch

六一节晚上改了点code, 做完之后commit, 然后误删了这个branch, 并且新建了branch. 那么怎样恢复已删除的branch呢&#xff1f; 网上查询一番&#xff0c;找到了答案&#xff1a; 1. git reflog 找到被删的branch中最后一笔commit, 记录它的SHA1。 怎么看SHA1是被删除的bra…

Mac修改Mysql8.0密码

转载请标明出处&#xff1a;http://blog.csdn.net/donkor_/article/details/139392605 文章目录 前言修改密码Step1:修改my.conf文件Step2:添加配置skip-grant-tablesStep3:重启mysql服务Step4:进入mysqlStep5:刷新权限Step6:修改密码Step7:再次刷新权限Step8:删除/注释 skip-…

本地安装AI大模型

使用ollmam安装llmama3等模型 1.打开ollmam下载对应系统的软件&#xff0c;安装即可 官网&#xff1a;Ollama&#xff0c; 安装直接点就就行了&#xff0c;没有其他操作 2.安装模型 在官网找到对于的模型下载命令 记录命令:ollama run llama3 打开一个cmd窗口&#xff0c;输…

opencv-python(三)

马赛克 face img[162:428,297:527] # 人脸坐标区域face face[::10,::10] # 每10个中取出一个像素&#xff0c;马赛克face np.repeat(face, 10, axis0) # 行方向重复10次face np.repeat(face, 10, axis1) # 列方向重复10次img[162:428,297:527] face[:266,:230] # 填充&a…

54. 螺旋矩阵【rust题解】

题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 示例 1 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2 输入&#xff1a;matrix [[1,2,3,4],[5,6,…

贴片和直插型IRM红外遥控接收头引脚定义和规格参数及使用注意事项

红外遥控接收头使用注意事项 引脚定义存在不同 红外遥控接收头大量使用在家用电器的遥控中&#xff0c;属于价廉物美的一种光电接收器件&#xff0c;批量价格约0.3元左右。 多数遥控接收头的引脚定义是OUT,GND,VCC&#xff0c;另有引脚定义不同为OUT,VCC,GND&#xff0c;记住…

基于STM32的水库预警系统的Proteus仿真

文章目录 一、水库预警系统1.题目要求2.思路2.1 OLED显示汉字2.2 水质传感器等等2.3 步进电机2.4 驱动水泵 3.仿真图3.1 未仿真时3.2 开始仿真&#xff0c;OLED开始显示3.3 提高水位&#xff0c;开启阀门和预警3.4 通过按键增大水位阈值&#xff0c;取消报警 4.仿真程序4.1 程序…

车联网安全入门——ICSim模拟器使用

文章目录 车联网安全入门——ISCim模拟器使用介绍主要特点&#xff1a;使用场景&#xff1a; 安装使用捕获can流量candumpcansnifferwiresharkSavvyCAN主要特点&#xff1a;使用场景&#xff1a; 重放can报文cansendSavvyCAN 总结 车联网安全入门——ISCim模拟器使用 &#x1…

前端表单校验完成之后,点击确认功能无反应FormInstance, FormRules

**产生原因&#xff1a;可能是在el-form 中添加的ref 前面加了“&#xff1a;”&#xff0c;也可能是ref中的值写错了** FormInstance, FormRules

Unity + 雷达 粒子互动(待更新)

效果预览: 花海(带移动方向) VFX 实例 脚本示例 使用TouchScript,计算玩家是否移动,且计算移动方向 using System.Collections; using System.Collections.Generic; using TouchScript; using TouchScript.Pointers; using UnityEngine; using UnityEngine.VFX;public …

装饰器,状态管理和if判断(HarmonyOS学习第六课)

Builder装饰器-自定义构建函数 前面介绍了如何创建一个自定义组件。该自定义组件内部UI结构固定&#xff0c;仅与使方法进行数据传递。ArkUI还提供了一种更轻量的UI 元素复用机制Builder&#xff0c;Builder 所装饰的函数遵循build( )函数语法规则&#xff0c;开发者可以将重…

网页安全登陆的设计思路

对于Web网站来讲,不管是企业内容信息化系统,还是公共站点(博客、音视频站等),都有需要用户注册和登录的功能。用以识别用户、信息交互、信息隔离以及商业行为等场景。用户数据已成为网站的重要资产。保护用户信息(数据)是网站安全运行的关键任务。本文以用户安全登录的场…

AI产品导航站

1、AI产品导航站 (chat2ai.cn)

自然语言处理(NLP)—— 神经网络语言处理

1. 总体原则 1.1 深度神经网络&#xff08;Deep Neural Network&#xff09;的训练过程 下图展示了自然语言处理&#xff08;NLP&#xff09;领域内使用的深度神经网络&#xff08;Deep Neural Network&#xff09;的训练过程的简化图。 在神经网络的NLP领域&#xff1a; 语料…