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所示:

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

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

相关文章

ESP32_ADC(Arduino)

ADC模数转换 ESP32集成了12位的逐次逼近式ADC&#xff0c;分别为ADC1模块ADC2模块&#xff0c;共支持18个模拟输入通道: ADC1模块&#xff1a;8个通道&#xff0c;32~39ADC2模块&#xff1a;10个通道&#xff0c;0&#xff0c;2&#xff0c;4&#xff0c;12 ~ 15&#xff0c;…

调试器加载错误,从任务栏打开可能会导致该问题 2024/1/8

&#x1f9e7;喜欢将常用软件固定在任务栏的用户肯定很苦恼这个问题 &#x1f9e7;问题复现 &#x1f9e7;这里先查找一下原因 &#x1f9e7;查看一下固定在任务栏的微信小程序开发工具的属性 如果不会打开任务栏图标属性界面的小伙伴请先翻到文章最后 &#x1f9e7;再使用同样…

CRM功能定制,哪些功能是需要格外注意的?

​到了2023年&#xff0c;在如今的商业环境中&#xff0c;千篇一律的方法很少能带来成功。这对于CRM管理系统尤其如此。虽然标准化的CRM解决方案为企业提供了一个简单的“入坑”门槛&#xff0c;但它们往往缺乏为企业带来真正竞争优势所需的灵活性&敏捷性。企业想要拥有适合…

【Python程序开发系列】一文总结API的基本概念、功能分类、认证方式、使用方法和开发流程

这是Python程序开发系列原创文章&#xff0c;我的第195篇原创文章。 一、什么是API&#xff1f; API是软件开发中非常重要的概念&#xff0c;它简化了不同组件之间的交互和集成&#xff0c;提供了对其他软件或服务功能的访问和调用方式。 API是应用程序编程接口&#xff08;Ap…

计算机配件杂谈-鼠标

目录 基础知识鼠标的发展鼠标的左右手鼠标的显示样式鼠标的移动和可见性移动可见性 现在的我们的生活工作都基本上离不开电脑了&#xff0c;不管是你平时玩玩游戏&#xff0c;上班工作等等&#xff1b; 今天将关于鼠标的一些小的技巧分享出来&#xff0c;共勉&#xff01; 基础…

Git删除远程仓库某次提交记录后的所有提交

1、鼠标右键->git bash here&#xff0c;然后cd切换到代码目录&#xff1b; 2、git log查看提交记录&#xff0c;获取commit id 3、git reset commit id&#xff08;commit id指要保留的最新的提交记录id&#xff09; 4、git push --force&#xff0c;强制push 如果出现…

上海亚商投顾:三大指数小幅反弹,旅游、机器人板块集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日震荡反弹&#xff0c;创业板指一度涨超1.7%&#xff0c;午后集体回落翻绿&#xff0c;临近尾盘又…

软考高级系统架构设计师考试经验分享

文章目录 1. 软考介绍&#xff08;1&#xff09;什么是软考&#xff08;2&#xff09;软考的作用&#xff08;3&#xff09;软考各科目的难度&#xff08;4&#xff09;考试时间&#xff08;5&#xff09;考试形式 2.系统架构设计师备考经验&#xff08;1&#xff09;辅导资料&…

知识点整理[(GraphGeo) DATA AND PROBLEM DEFINITION]

3 DATA AND PROBLEM DEFINITION 3.1 Data Collection 问题一:IP定位数据集构成 回答: 包含数以百万计的IP地址,这些IP地址包括: (1)它们具有自己的知识(如自主系统(AS)和WHOIS数据); (2)网络测量

pve多台物理机虚拟化 pve虚拟机优势

Proxmox VE是一个运行虚拟机和容器的平台。基于Debian Linux&#xff0c;完全开源。为了获得最大的灵活性&#xff0c;实现了两种虚拟化技术——基于内核的虚拟机(KVM)和基于容器的虚拟化(LXC)。一个主要的设计目标是使管理尽可能容易。运行在单个节点上使用Proxmox VE&#xf…

【低照度图像增强系列(3)】EnlightenGAN算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…

搜维尔科技:第九届元宇宙数字人设计大赛作品规范解读!

作品提交 参赛小组需要将作品上传至百度网盘&#xff0c;并将分享链接发送至frankaxis3d.cn邮箱。邮寄格式如下&#xff1a; 邮件标题&#xff1a;作品名称元宇宙数字人设计大赛作品 邮件内容标明&#xff1a;学校名称、院系名称、作品名称、作者名称、联系电话及指导老师名…

机器学习系列--R语言随机森林进行生存分析(2)

随机森林&#xff08;Breiman 2001a&#xff09;&#xff08;RF&#xff09;是一种非参数统计方法&#xff0c;需要没有关于响应的协变关系的分布假设。RF是一种强大的、非线性的技术&#xff0c;通过拟合一组树来稳定预测精度模型估计。随机生存森林&#xff08;RSF&#xff0…

Linux du和df命令

目录 一. df二. du 一. df ⏹用于显示系统级别&#xff0c;磁盘分区上的可用和已用空间的信息 -h&#xff1a;以人类可读的格式显示文件系统大小 ⏹每秒钟监视当前磁盘的使用情况 watch 用于周期性的执行特定的命令-n 1 表示每一秒刷新一次命令执行的结果df -h ./ 表示周期性…

Salesforce Einstein详解

首先给大家强调的是Einstein AI在国内的阿里云版是不具备的&#xff0c;原因不言自喻。 一&#xff0e;saleforce Einstein简介 爱因斯坦是SalesForce花重金&#xff08;收购RelateIQ、机器学习公司PredictionIO与深度学习企业MetaMind&#xff0c;MetaMind创始人Richard Soc…

Linux ps命令

一. 说明 用于显示系统中当前运行的进程信息。 提供了查看进程的不同视图和选项&#xff0c;允许用户了解系统上正在运行的进程的状态、资源使用情况等。 -e&#xff1a;显示所有进程&#xff0c;而不仅仅是与当前终端关联的进程。-f&#xff1a;以完整的格式显示进程信息&am…

Kubernetes(K8S)云服务器实操TKE

一、 Kubernetes(K8S)简介 Kubernetes源于希腊语,意为舵手,因为首尾字母中间正好有8个字母,简称为K8S。Kubernetes是当今最流行的开源容器管理平台,是 Google 发起并维护的基于 Docker 的开源容器集群管理系统。它是大名鼎鼎的Google Borg的开源版本。 K8s构建在 Docker …

Spring Boot 接入 KMS 托管中间件密码第三方接口密钥

1. 需求 Nacos中关于中间件的密码&#xff0c;还有第三方API的密钥等信息&#xff0c;都是明文存储&#xff0c;不符合系统安全要求。现需对这些信息进行加密处理&#xff0c;Nacos只存储密文&#xff0c;并在服务启动时&#xff0c;调用云厂商的KMS接口进行解密&#xff0c;将…

C#编程-实现在文本文件中的读和写

实现在文本文件中的读和写 Stream类用于从文本文件读取数据和向文本文件写入数据。它是一个抽象类,支持向流读写字节。如果文件的数据仅是文本,那么您可以使用StreamReader类和StreamWriter类来完成相应的读和写任务。 StreamReader类 StreamReader类继承自从抽象类TextRea…

机器学习指南:如何学习机器学习?

机器学习 一、介绍 你有没有想过计算机是如何从数据中学习和变得更聪明的&#xff1f;这就是机器学习 &#xff08;ML&#xff09; 的魔力&#xff01;这就像计算机科学和统计学的酷炫组合&#xff0c;计算机从大量信息中学习以解决问题并做出预测&#xff0c;就像人类一样。 …