当前位置: 首页 > news >正文

JAVA面向对象基础-容器

一、泛型

      我们可以在类的声明处增加泛型列表,如:<T,E,V>。

      此处,字符可以是任何标识符,一般采用这3个字母。

【示例9-1】泛型类的声明

1

2

3

4

5

6

7

8

9

10

class MyCollection<E> {// E:表示泛型;

    Object[] objs = new Object[5];

    public E get(int index) {// E:表示泛型;

        return (E) objs[index];

    }

    public void set(E e, int index) {// E:表示泛型;

        objs[index] = e;

    }

}

      泛型E像一个占位符一样表示“未知的某个数据类型”,我们在真正调用的时候传入这个“数据类型”。

【示例9-2】泛型类的应用

1

2

3

4

5

6

7

8

9

10

public class TestGenerics {

    public static void main(String[] args) {

        // 这里的”String”就是实际传入的数据类型;

        MyCollection<String> mc = new MyCollection<String>();

        mc.set("aaa"0);

        mc.set("bbb"1);

        String str = mc.get(1); //加了泛型,直接返回String类型,不用强制转换;

        System.out.println(str);

    }

}

二、Collection接口

  Collection 表示一组对象,它是集中、收集的意思。Collection接口的两个子接口是List、Set接口。

表9-1 Collection接口中定义的方法

      由于List、Set是Collection的子接口,意味着所有List、Set的实现类都有上面的方法。我们下一节中,通过ArrayList实现类来测试上面的方法。

三、List特点和常用方法

List是有序、可重复的容器。

      有序:List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素。

      可重复:List允许加入重复的元素。更确切地讲,List通常允许满足 e1.equals(e2) 的元素重复加入容器。

      除了Collection接口中的方法,List多了一些跟顺序(索引)有关的方法,参见下表:

表9-2List接口中定义的方法

      List接口常用的实现类有3个:ArrayList、LinkedList和Vector。

【示例9-4】List的常用方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public class TestList {

    /**

     * 测试add/remove/size/isEmpty/contains/clear/toArrays等方法

     */

    public static void test01() {

        List<String> list = new ArrayList<String>();

        System.out.println(list.isEmpty()); // true,容器里面没有元素

        list.add("高淇");

        System.out.println(list.isEmpty()); // false,容器里面有元素

        list.add("高小七");

        list.add("高小八");

        System.out.println(list);

        System.out.println("list的大小:" + list.size());

        System.out.println("是否包含指定元素:" + list.contains("高小七"));

        list.remove("高淇");

        System.out.println(list);

        Object[] objs = list.toArray();

        System.out.println("转化成Object数组:" + Arrays.toString(objs));

        list.clear();

        System.out.println("清空所有元素:" + list);

    }

    public static void main(String[] args) {

        test01();

    }

}

      执行结果如图9-3所示:

【示例9-5】两个List之间的元素处理

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

public class TestList {

    public static void main(String[] args) {

        test02();

    }

    /**

     * 测试两个容器之间元素处理

     */

    public static void test02() {

        List<String> list = new ArrayList<String>();

        list.add("高淇");

        list.add("高小七");

        list.add("高小八");

        List<String> list2 = new ArrayList<String>();

        list2.add("高淇");

        list2.add("张三");

        list2.add("李四");

        System.out.println(list.containsAll(list2)); //false list是否包含list2中所有元素

        System.out.println(list);

        list.addAll(list2); //将list2中所有元素都添加到list中

        System.out.println(list);

        list.removeAll(list2); //从list中删除同时在list和list2中存在的元素

        System.out.println(list);

        list.retainAll(list2); //取list和list2的交集

        System.out.println(list);

    }

}

      执行结果如图9-4所示:

图9-4 示例9-5运行效果图

【示例9-6】List中操作索引的常用方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

public class TestList {

    public static void main(String[] args) {

        test03();

    }

    /**

     * 测试List中关于索引操作的方法

     */

    public static void test03() {

        List<String> list = new ArrayList<String>();

        list.add("A");

        list.add("B");

        list.add("C");

        list.add("D");

        System.out.println(list); // [A, B, C, D]

        list.add(2"高");

        System.out.println(list); // [A, B, 高, C, D]

        list.remove(2);

        System.out.println(list); // [A, B, C, D]

        list.set(2"c");

        System.out.println(list); // [A, B, c, D]

        System.out.println(list.get(1)); // 返回:B

        list.add("B");

        System.out.println(list); // [A, B, c, D, B]

        System.out.println(list.indexOf("B")); // 1 从头到尾找到第一个"B"

        System.out.println(list.lastIndexOf("B")); // 4 从尾到头找到第一个"B"

    }

}

      执行结果如图9-5所示:

三、Map接口-HashMap和HashTable

Map就是用来存储“键(key)-值(value) 对”的

Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复(根据equals方法),否则新的会覆盖旧的

Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等

HashMap底层实现采用了哈希表,这是一种非常重要的数据结构。希表的本质就是“数组+链表”

Entry[] table 就是HashMap的核心数组结构,我们也称之为“位桶数组”。一个Entry对象存储了:

  • key:键对象,value:值对象
  • next:下一个节点
  • hash: 键对象的hash值

Entry[]数组的结构:

存储数据过程put(key,value)

  当添加一个元素(key-value)时,首先计算key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这时就添加到同一hash值的元素的后面,他们在数组的同一位置,就形成了链表,同一个链表上的Hash值是相同的,所以说数组存放的是链表。

HashMap

 HashMap采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。

【示例9-7】Map接口中的常用方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public class TestMap {

    public static void main(String[] args) {

        Map<Integer, String> m1 = new HashMap<Integer, String>();

        Map<Integer, String> m2 = new HashMap<Integer, String>();

        m1.put(1"one");

        m1.put(2"two");

        m1.put(3"three");

        m2.put(1"一");

        m2.put(2"二");

        System.out.println(m1.size());

        System.out.println(m1.containsKey(1));

        System.out.println(m2.containsValue("two"));

        m1.put(3"third"); //键重复了,则会替换旧的键值对

        Map<Integer, String> m3 = new HashMap<Integer, String>();

        m3.putAll(m1);

        m3.putAll(m2);

        System.out.println("m1:" + m1);

        System.out.println("m2:" + m2);

        System.out.println("m3:" + m3);

    }

}

      执行结果如图9-11所示:

HashTable

      HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低。

HashMap与HashTable的区别

      1. HashMap: 线程不安全,效率高。允许key或value为null。

      2. HashTable: 线程安全,效率低。不允许key或value为null。

四、Set接口-HashSet基本使用

大家在做下面练习时,重点体会“Set是无序、不可重复”的核心要点。

【示例9-9】HashSet的使用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class Test {

    public static void main(String[] args) {

        Set<String> s = new HashSet<String>();

        s.add("hello");

        s.add("world");

        System.out.println(s);

        s.add("hello"); //相同的元素不会被加入

        System.out.println(s);

        s.add(null);

        System.out.println(s);

        s.add(null);

        System.out.println(s);

    }

}

      执行结果如图9-24所示:

五、Collections工具类

类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。

      1. void sort(List) //对List容器内的元素排序,排序的规则是按照升序进行排序。

      2. void shuffle(List) //对List容器内的元素进行随机排列。

      3. void reverse(List) //对List容器内的元素进行逆续排列 。

      4. void fill(List, Object) //用一个特定的对象重写整个List容器。

      5. int binarySearch(List, Object)//对于顺序的List容器,采用折半查找的方法查找特定对象。

【示例9-23】Collections工具类的常用方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class Test {

    public static void main(String[] args) {

        List<String> aList = new ArrayList<String>();

        for (int i = 0; i < 5; i++){

            aList.add("a" + i);

        }

        System.out.println(aList);

        Collections.shuffle(aList); // 随机排列

        System.out.println(aList);

        Collections.reverse(aList); // 逆续

        System.out.println(aList);

        Collections.sort(aList); // 排序

        System.out.println(aList);

        System.out.println(Collections.binarySearch(aList, "a2")); 

        Collections.fill(aList, "hello");

        System.out.println(aList);

    }

}

      执行结果如图9-31所示:

相关文章:

JAVA面向对象基础-容器

一、泛型 我们可以在类的声明处增加泛型列表&#xff0c;如&#xff1a;<T,E,V>。 此处&#xff0c;字符可以是任何标识符&#xff0c;一般采用这3个字母。 【示例9-1】泛型类的声明 1 2 3 4 5 6 7 8 9 10 class MyCollection<E> {// E:表示泛型; Object[] o…...

2022年山东省职业院校技能大赛高职组信息安全管理与评估—开发测试服务器解析

任务5:开发测试服务器 目录 任务5:开发测试服务器 解题方法:...

2024年我国网络安全发展形势展望

2023年&#xff0c;我国网络安全政策法规陆续出台&#xff0c;网络安全与数据安全产业发展势头强劲&#xff0c;网络安全形势整体向好。展望2024年&#xff0c;世界各国在网络空间中的竞争将变得愈发激烈&#xff0c;我国网络安全领域的法律法规将不断完善&#xff0c;数据安全…...

如何使用 NFTScan NFT API 在 PlatON 网络上开发 Web3 应用

PlatON 是由万向区块链和矩阵元主导开发的面向下一代的全球计算架构&#xff0c;创新性的采用元计算框架 Monad 和基于 Reload 覆盖网络的同构多链架构&#xff0c;其愿景是成为全球首个提供完备隐私保护能力的运营服务网络。它提供计算、存储、通讯服务&#xff0c;并提供算力…...

如何使用web文件管理器Net2FTP搭建个人网盘

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…...

总结多线程的各种锁

1、公平锁和非公平锁 公平锁是严格按照线程请求的顺序来分配锁&#xff0c;每一个线程都能获取到锁&#xff0c;避免线程饥饿现象&#xff1b;相反&#xff0c;非公平锁表示线程竞争锁时可以插队来抢占资源。 非公平锁在大多数情况下效率优于公平锁&#xff0c;因为公平锁涉及到…...

树形结构的窗口小部件

这段代码是一个使用Qt框架的C程序&#xff0c;实现了一个树形结构的窗口小部件&#xff08;TreeWidget&#xff09;。以下是主要的解释&#xff1a; #include "treewidget.h" #include "ui_treewidget.h"TreeWidget::TreeWidget(QWidget *parent) : QWidg…...

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》 写在最前面私钥加密与伪随机性 第一部分密码学的计算方法论计算安全加密的定义&#xff1a;对称加密算法 伪随机性伪随机生成器&#xff08;PRG&#xff09; 规约法规约证明 构造安全…...

Redis底层原理

持久化 Redis虽然是个内存数据库,但是Redis支持RDB和AOF两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程。所谓内存快照,就是…...

掌握亚马逊、Lazada、shopee、速卖通、eBay、wish测评自养号补单系统:解锁跨境电商新机遇

在选择测评环境系统时&#xff0c;市面上有很多选项。但是&#xff0c;究竟哪个系统使用起来更高效、成本更低、成功率更高呢&#xff1f;下面将详细分析各种网络环境的使用经验&#xff0c;希望能帮助大家避免一些不必要的困扰和错误。我曾经亲自尝试过各种网络环境&#xff0…...

15_多线程

文章目录 OS中的基本概念进程&#xff08;process&#xff09;与线程&#xff08;thread&#xff09;串行(serial)、并行(parallel)与并发(concurrency)同步(synchronization)与异步(asynchronization) java程序运行原理java命令主类类名运行原理 多线程的实现方式一&#xff1…...

吉他打谱软件Guitar Pro8苹果Mac电脑简体中文特别版

Guitar Pro 8 Mac是一款吉他编曲学习软件&#xff0c;用于吉他、贝和其他弦乐器的制谱和演奏&#xff0c;这是一个多轨编辑器&#xff0c;具有集成的 MIDI 编辑器、合唱绘图仪、吉他、节拍器和其他音乐家工具。它使您能够编辑吉他、贝司和尤克里里、乐谱、指法谱&#xff0c;并…...

go study oneday

这段代码的详细解释&#xff0c;涵盖了Go 语言变量声明、函数调用、用户输入、类型转换以及结果输出。 package main import "fmt" func main() {var num1 intvar num2 float32var num3 intfmt.Println("请输入数字一&#xff1a;")fmt.Scanln(&num1)f…...

Avatar虚拟数字人方案,元宇宙时代的企业新动力

随着元宇宙概念的兴起&#xff0c;虚拟数字人技术逐渐成为各行业关注的焦点。为了满足市场需求&#xff0c;美摄科技凭借专业、自研的虚拟数字人技术&#xff0c;结合强大的ChatGPT能力&#xff0c;隆重推出Avatar虚拟数字人方案&#xff0c;助力企业实现营销及内容创作的生产力…...

用golang 实现给图片添加文字水印

package mainimport ("fmt""github.com/golang/freetype""image""image/draw""image/jpeg""io""os""time" )func main() {// 打开原始图片file, err : os.Open("004.jpeg")if err …...

苹果电脑Markdown文本编辑Typora mac功能介绍

Typora mac是一款跨平台的Markdown编辑器&#xff0c;支持Windows、MacOS和Linux操作系统。它具有实时预览功能&#xff0c;能够自动将Markdown文本转换为漂亮的排版效果&#xff0c;让用户专注于写作内容而不必关心格式调整。Typora Mac版除了支持常见的Markdown语法外&#x…...

大型语言模型与知识图谱的完美结合:从LLMs到RAG,探索知识图谱构建的全新篇章

最近,使用大型语言模型(LLMs)和知识图谱(KG)开发 RAG(Retrieval Augmented Generation)流程引起了很大的关注。在这篇文章中,我将使用 LlamaIndex 和 NebulaGraph 来构建一个关于费城费利斯队(Philadelphia Phillies)的 RAG 流程。 我们用的是开源的 NebulaGraph 来…...

Vue 缓存Hook:提高接口性能,减少重复请求

前言 在开发 Web 应用时&#xff0c;我们经常会遇到需要重复调用接口的场景。例如&#xff0c;当用户频繁刷新页面或进行某个操作时&#xff0c;我们可能需要多次请求相同的数据。这不仅会增加服务器负担&#xff0c;还会导致用户体验下降。为此&#xff0c;我们可以使用缓存机…...

【Python机器学习】用于回归的决策树

用于回归的决策树与用于分类的决策树类似&#xff0c;在DecisionTreeRegressor中实现。DecisionTreeRegressor不能外推&#xff0c;也不能在训练数据范围之外的数据进行预测。 利用计算机内存历史及格的数据进行实验&#xff0c;数据展示&#xff1a; import pandas as pd im…...

numpy库的一些常用函数

文章目录 广播&#xff08;broadcast&#xff09;迭代数组数组运算修改数组的形状 修改数组维度连接数组分割数组数组元素的添加与删除Numpy算术函数Numpy 统计函数Numpy排序、条件筛选函数条件筛选 import numpy as np anp.arange(15).reshape(3,5)aarray([[ 0, 1, 2, 3, …...

成员变量与局部变量的区别?

如果你现在需要准备面试&#xff0c;可以关注我的公众号&#xff1a;”Tom聊架构“&#xff0c;回复暗号&#xff1a;”578“&#xff0c;领取一份我整理的50W字面试宝典&#xff0c;可以帮助你提高80%的面试通过率&#xff0c;价值很高&#xff01;&#xff01; 语法形式&…...

ES6---判断对象是否为{}

介绍 使用es6语法判断一个对象是否为{} 示例 使用ES6的Object.keys()方法&#xff0c;返回值是对象中属性名组成的数组 let obj {}let keys Object.keys(obj) if(keys.length){alert(对象不为{}) }else{alert(对象为{}) }代码地址 https://gitee.com/u.uu.com/js-test/b…...

高性能、可扩展、分布式对象存储系统MinIO的介绍、部署步骤以及代码示例

详细介绍 MinIO 是一款流行的开源对象存储系统&#xff0c;设计上兼容 Amazon S3 API&#xff0c;主要用于私有云和边缘计算场景。它提供了高性能、高可用性以及易于管理的对象存储服务。以下是 MinIO 的详细介绍及优缺点&#xff1a; 架构与特性&#xff1a; 开源与跨平台&am…...

oracle重启数据库lsnrctl重启监听

oracle重启数据库lsnrctl重启监听 su到oracle用户下,命令 su - oracle切换需要启动的数据库实例&#xff1a; export ORACLE_SIDorcl进入Sqlplus控制台&#xff0c;命令&#xff1a; sqlplus /nolog以系统管理员登录&#xff0c;命令&#xff1a; connect / as sysdba如果是…...

08、Kafka ------ 消息存储相关的配置-->消息过期时间设置、查看主题下的消息存活时间等配置

目录 消息存储相关的配置★ 消息的存储介绍★ 消息过期时间及处理方式演示&#xff1a;log.cleanup.policy 属性配置 ★ 修改指定主题的消息保存时间演示&#xff1a;将 test2 主题下的消息的保存时间设为10个小时1、先查看test2主题下的配置2、然后设置消息的保存时间3、然后再…...

JAVA基础学习笔记-day15-File类与IO流

JAVA基础学习笔记-day15-File类与IO流 1. java.io.File类的使用1.1 概述1.2 构造器1.3 常用方法1、获取文件和目录基本信息2、列出目录的下一级3、File类的重命名功能4、判断功能的方法5、创建、删除功能 2. IO流原理及流的分类2.1 Java IO原理2.2 流的分类2.3 流的API 3. 节点…...

WPF ComboBox限制输入长度

在WPF中&#xff0c;你可以通过两种方式来限制ComboBox的输入长度&#xff1a; 使用PreviewTextInput事件&#xff1a;你可以在这个事件的处理程序中检查输入文本的长度&#xff0c;如果超过最大长度则阻止输入。 <ComboBox PreviewTextInput"ComboBox_PreviewTextIn…...

windows配置网络IP地址的方法

在Windows系统中配置网络IP地址&#xff0c;可以按照以下步骤进行&#xff1a; 打开“控制面板”&#xff0c;选择“网络和Internet”选项。在“网络和Internet”窗口中&#xff0c;单击“网络和共享中心”选项。在“网络和共享中心”窗口中&#xff0c;单击“更改适配器设置”…...

windows配置电脑网络IP的方法

通过控制面板配置IP地址&#xff1a; 打开控制面板&#xff1a; 可以通过在开始菜单中搜索“控制面板”来打开控制面板。选择“网络和Internet”或“网络和共享中心”&#xff1a; 在控制面板中&#xff0c;根据 Windows 版本不同&#xff0c;选中对应的选项进入网络设置。点击…...

MySQL,原子性rename

RENAME TABLE old_table TO backup_table, new_table TO old_table;...

网站广告推广怎么做/武汉网络关键词排名

问题如下:点发表新主题,却到了登陆的页面(这之前我是保存了用户名和密码的).填以前的密码却显示不正确,再次发回密码进入,却仍停留在登陆页面,不知何故.有没有遇到相同问题的朋友?我已多次遇到. 转载于:https://www.cnblogs.com/coolbug/archive/2004/09/08/41030.html...

如何拥有自己的私人网站平台/app推广方式有哪些

Orcad 画原理图的快捷键与allegro pcb不同&#xff0c;Orcad是无法修改快捷键的&#xff0c;只能使用系统自带的常用快捷键 I&#xff1a;放大原理图 O&#xff1a;缩小原理图 R&#xff1a;90度旋转 H&#xff1a;水平翻转...

全屏类网站/最有效的网络推广方式和策略

在Windows 8 的IIS&#xff08;8.0&#xff09;中搭建PHP运行环境&#xff1a; 一&#xff1a;安装IIS服务器 1.进入控制面板>>程序和功能>>打开或关闭Windows 功能&#xff0c;找到Internet信息服务&#xff0c;记得选中CGI这一项 2.安装完成后在浏览器中打开loca…...

站长工具最近查询/广东企业网站seo哪里好

2019独角兽企业重金招聘Python工程师标准>>> Logback日志使用说明 项目跑了几个月了、测试服务器一直报空间不足、公司很小也没有运维。登上去查看以后发现log日志文件上百G并且很多都是没用的。所以下午简单查看了一下日志文件的配置。 没有优化后的logback.xml配置…...

win10做的网站其他电脑访问不了怎么办/查关键词的排名工具

题目传送门 题意&#xff1a;一个置换群&#xff0c;经过最少k次置换后还原。问给一个N个元素&#xff0c;在所有的置换群里&#xff0c;有多少个不同的k。 分析&#xff1a;这道题可以转化成&#xff1a;N Σ ai &#xff0c;求LCM ( ai )有多少个不同的值。比如N10时&#x…...

wordpress网站迁移问题/什么是竞价

开启我的技术博客园&#xff0c;还希望能够与大家多多的交流哦&#xff01;转载于:https://www.cnblogs.com/roseredff/p/10135138.html...