JAVA面向对象基础-容器

news2025/1/18 16:57:31

一、泛型

      我们可以在类的声明处增加泛型列表,如:<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所示:

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

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

相关文章

20240109适配selinux让移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通

20240109适配selinux让移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通 2024/1/9 10:46 缘起&#xff1a;使用友善之臂的Android11可以让EC20上网&#xff0c;但是同样的修改步骤&#xff0c;Toybrick的Android11不能让EC20上网。 最后确认是selinux的问题&#…

Linux--防火墙,实验案例:基于区域、服务、端口的访问控制

实验环境 某公司的Web服务器&#xff0c;网关服务器均采用Linux CentOS 7.3操作系统&#xff0c;如图2.13所示。为了 加强网络访问的安全性&#xff0c;要求管理员熟悉firewalld防火墙规则的编写&#xff0c;以便制定有效、可行的主机防护策略。 需求描述 > 网关服务器ens3…

【计算机网络】TCP原理 | 可靠性机制分析(二)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程、计算机网络的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; T…

Kettle Local引擎使用记录(一)(基于Kettle web版数据集成开源工具data-integration源码)

Kettle Web &#x1f4da;第一章 前言&#x1f4da;第二章 demo源码&#x1f4d7;pom.xml引入Kettle引擎核心文件&#x1f4d7;java源码&#x1f4d5; controller&#x1f4d5; service&#x1f4d5; 其它&#x1f4d5; maven settings.xml &#x1f4d7;测试&#x1f4d5; 测试…

C语言中关于函数递归的理解

递归的概念&#xff1a;如果一个对象部分包含它自己,或者利用自己定义自己,则称这个对象是递归的;如果 一个过程直接或间接调用自己,则称这个过程是一个递归过程。递归的主要思考方式在于&#xff1a;将大事化小 我们先看一个例子 题目&#xff1a;输入一个无符号数&#xff0…

蜗牛目标检测数据集VOC格式480张

蜗牛&#xff0c;一种缓慢而坚韧的软体动物&#xff0c;以其螺旋形的外壳和黏附力极强的黏液而为人所熟知。 蜗牛体型呈螺旋形&#xff0c;有一个硬壳保护其柔软的身体。壳的形状和纹理因种类而异&#xff0c;有的光滑如玻璃&#xff0c;有的则布满细纹。蜗牛的头部有两对触角…

U-Boot学习(1):简介及命令行指令详解

Bootloader的主要任务是引导加载并运行应用程序&#xff0c;对于MCU中的BootLoader&#xff0c;我之前写过一篇详细的文章单片机中BootLoader的严谨实现详解介绍它实现的整体流程。对于Linux来说&#xff0c;在运行Linux内核之前也需要BootLoader进行引导&#xff0c;这个BootL…

Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用

分享一个有趣的小工具&#xff0c;10MB 身材的小工具&#xff0c;能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。 让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的&#xff0c;非 OpenAI 的 API 私有部署和使用起来。 写在前面 这个小工具软件写于两…

面试宝典进阶之redis缓存面试题

R1、【初级】Redis常用的数据类型有哪些&#xff1f; &#xff08;1&#xff09;String&#xff08;字符串&#xff09; &#xff08;2&#xff09;Hash&#xff08;哈希&#xff09; &#xff08;3&#xff09;List&#xff08;列表&#xff09; &#xff08;4&#xff09;Se…

zookeeper 与eureka区别

CAP定理 在分布式系统的发展中&#xff0c;影响最大的莫过于CAP定理了&#xff0c;是分布式系统发展的理论基石。 2000年&#xff0c;加州大学的计算机科学家 Eric Brewer提出了CAP猜想 2002 年&#xff0c;麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 CAP 猜…

深入理解 Hadoop (五)YARN核心工作机制浅析

概述 YARN 的核心设计理念是 服务化&#xff08;Service&#xff09; 和 事件驱动&#xff08;Event EventHandler&#xff09;。服务化 和 事件驱动 软件设计思想的引入&#xff0c;使得 YARN 具有低耦合、高内聚的特点&#xff0c;各个模块只需完成各自功能&#xff0c;而模…

静态关键字:static

static的作用 static是静态的意思&#xff0c;可以修饰成员变量和成员方法。 static修饰成员变量表示该成员变量只在内存中只存储一份&#xff0c;可以被共享访问、修改。 成员变量 分为2类 静态成员变量&#xff08;有static修饰&#xff0c;属于类&#xff0c;内存中加载…

【QML COOK】- 005-粒子系统(ParticleSystem)

1. 编辑main.qml import QtQuick import QtQuick.ParticlesWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")color: "#000000"MouseArea {id: mouseAreaanchors.fill: parentonClicked: {hahaEmitter.pulse(2000)}}ParticleSystem {…

大众汽车宣布将ChatGPT,批量集成在多种汽车中!

1月9日&#xff0c;大众汽车在官网宣布&#xff0c;将ChatGPT批量集成到电动、内燃机汽车中。 大众表示&#xff0c;将ChatGPT与其IDA语音助手相结合&#xff0c;用户通过自然语言就能与ChatGPT进行互动&#xff0c;例如&#xff0c;帮我看看最近的三星米其林饭店在哪里&#…

上门洗衣洗鞋小程序多门店管理模式是怎么样的

做干洗店和洗鞋店的老板们很多都不止一个门店&#xff0c;多门店的管理模式下&#xff0c;去做一个上门洗衣洗鞋小程序&#xff0c;需要有哪些必要的功能才能让不同的门店管理起来不乱呢。首先需要先确定一下不同门店的管理都会面临哪些经营场景和需求。 第一&#xff0c;加盟店…

Android BUG 之 Error: Activity class {} does not exist

项目场景&#xff1a; 更换包名&#xff0c;运行报错 问题描述 原因分析&#xff1a; 在替换包名的时候要确认&#xff0c;配置文件跟build中的保持一致&#xff0c;在更换后还要将旧包的缓存数据清理掉 解决方案&#xff1a; 1 替换后删除 app 下的build 文件夹 2 Rebuild Pr…

openEuler22.0.3安装oracle11.2.0.4报错总结

openEuler是CentOS8系列魔改来的 1.xstart无法打开报错x11拒绝转义 yum install *x11* vi /etc/ssh/sshd_config X11Forwarding yes systemctl restart sshd 2.执行runinstaller报错,无论是直接无法打开界面报错: when installed in the jdk 1.2 Linux 还是打开界面报错: no o…

20、Kubernetes核心技术 - 基于Prometheus和Grafana搭建集群监控平台

目录 一、概述 二、监控平台架构图​编辑 三、部署 Prometheus 3.1、Prometheus简介 3.2、部署守护进程node-exporter 3.3、部署rbac 3.4、ConfigMap 3.5、Deployment 3.6、Service 3.7、验证Prometheus 四、部署Grafana 4.1、Deployment 4.2、Service 4.3、Ing…

每天刷两道题——第十一天

1.1滑动窗口最大值 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出&…

Spark与Cassandra的集成与数据存储

Apache Spark和Apache Cassandra是大数据领域中两个重要的工具&#xff0c;用于数据处理和分布式数据存储。本文将深入探讨如何在Spark中集成Cassandra&#xff0c;并演示如何将Spark数据存储到Cassandra中。将提供丰富的示例代码&#xff0c;以帮助大家更好地理解这一集成过程…