Java 集合---尚硅谷Java入门视频学习

news2025/1/16 18:47:47
  • 问题:什么时候需要一个容纳数据的容器,也就是集合对象?
    Java集合框架中就包含了对不确定个数的数据处理的集合类
  • 问题:如果只是为了容纳数据,可以是直接使用数组,为什么要学习集合?
    数组使用起来不方便。在数据个数不确定的场合,数组使用起来不是很方便

总结:对不确定的有关系的数据进行相同的逻辑处理的场合,使用集合是一个不错的选择

根据数据的不同,Java的集合分为2大体系:

    1. 单一数据体系 : Collection接口定义了相关的规则
      常用的子接口

List :按照插入顺序保存数据,数据可以重复的
具体的实现类: ArrayList, LinkedList
Set : 集,无序保存,数据不能重复
具体的实现类 HashSet
Queue : 队列
具体的实现类:ArrayBlockingQueue

    1. 成对出现的数据体系 : Map接口定义了相关的规则
      所谓的成对的数据,就是2个数据有关系,可以根据第一个数据关联到第二个数据。
      也称之为键值对数据 ,(123123, zhangsan) => (key, value)

具体的实现 : HashMap, Hashtable

1.ArrayList

创建第一个集合对象:ArrayList

 ArrayList list = new ArrayList(3);
  1. 不需要传递构造参数,直接new就可以,底层数组为空数组
  2. 构造参数需要传递一个int类型的值,用于设定底层数组的长度
  3. 构造参数需要传递一个Collection集合类型的值,用于将其他集合中的数据放置在当前集合中
  • 增加数据
    添加数据时,如果集合中没有任何的数据,那么底层会创建长度为10的数组(扩容)
 	// add方法可以增加数据,只要将数据作为参数传递到add方法即可
    // 添加数据时,如果集合中没有任何的数据,那么底层会创建长度为10的数组
    list.add("zhangsan");
    list.add("zhangsan");
    list.add("wangwu");
    list.add("zhaoliu");
    // 获取集合中数据的条数
    System.out.println(list.size());
    // 获取指定位置的数据,可以采用索引的方式
    System.out.println(list.get(1));
    // 遍历集合中的数据
    for ( int i = 0; i < list.size(); i++ ) {
        //System.out.println("集合中的数据:" + list.get(i));
    }
    // TODO 如果循环遍历集合数据时,不关心数据的位置,那么可以采用特殊的for循环
    // for (循环对象:集合) {}
    for ( Object obj : list ) {
        System.out.println("集合中的数据:" + obj);
    }
// add方法可以传递2个参数的,第一个参数表示数据增加的位置(索引),第二个参数表示数据
list.add(1, "zhaoliu");

addAll()方法

		ArrayList list = new ArrayList();
        list.add("zhangsan");
        list.add("lisi");
        list.add("wangwu");
        list.add("zhangsan");
        list.add("zhangsan");
        ArrayList otherList = new ArrayList();
        otherList.add("1");
        otherList.add("2");
        otherList.add("3");
        list.addAll( otherList );//将otherList 集合追加到list集合末尾
  • 修改数据
    将指定位置的数据进行修改,set方法需要传递2个参数,第一个参数表示数据的位置,第二个参数修改的值。
    方法会返回结果,这个结果就是更新前的值
Object oldVal = list.set(1, "lisi");
System.out.println("修改前的值:" + oldVal);
  • 删除数据
    将指定位置的数据进行删除,remove方法需要传递1个参数,参数表示数据的位置。
    方法会返回结果,这个结果就是删除的值
Object removeVal = list.remove(1);
System.out.println("删除的值:" + removeVal);
// TODO 打印集合对象
System.out.println(list);
  • 其他常用方法
// size方法表示集合内部数据的数量
System.out.println(list.size());
// 清空集合中的数据
list.clear();
// 删除指定集合中的数据
list.removeAll(otherList);  //删除list集合中otherList集合里的数据
// 判断集合中的数据是否为空
System.out.println(list.isEmpty());
// 用于判断集合中是否存在某条数据,返回布尔类型的值
System.out.println(list.contains("zhangsan123"));
// 用于获取数据在索引中的第一个位置,如果数据不存在,那么返回-1
System.out.println(list.indexOf("zhangsan123"));
System.out.println(list.indexOf("zhangsan"));
System.out.println(list.lastIndexOf("zhangsan"));
//集合变数组
Object[] objects = list.toArray();
// 复制新集合
Object clone = list.clone();
ArrayList list1 = (ArrayList)clone;
System.out.println(list);
System.out.println(list1);

2.LinkedList

在这里插入图片描述

  • 构建集合对象
  LinkedList list = new LinkedList();
  • 添加数据
//添加数据
// 增加第一个数据
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
//向指定的位置添加数据 
list.addFirst("lisi"); //增加到数据的前面
list.addLast("2");//增加到数据的后面(默认)
list.add(1, "wangwu"); //添加到第一个位置(0和1之间)
//向集合中添加另一个集合
LinkedList list1 = new LinkedList();
list1.add("zhangsan1");
list1.add("lisi2");
list1.add("wangwu3");
list.addAll(list1);  //将list1集合追加到list集合末尾
  • 获取数据
System.out.println(list.getFirst());
System.out.println(list.getLast());
// 获取数据(遍历数据)
System.out.println(list.get(1));
for ( int i = 0; i < list.size(); i++ ) {
    System.out.println(list.get(i));
}
for ( Object obj : list ) {
   System.out.println(obj);
}
  • 修改数据
list.set(1, "zhaoliu");
  • 删除数据
   list.remove("zhangsan");
   list.removeFirst(); // 删除第一个
   list.removeLast(); // 删除最后一个
   list.remove(1);// 删除指定索引
  • 其他方法
System.out.println(list.size());
System.out.println(list.isEmpty());
list.clear();
list.contains("1");
list.element(); // 获取集合第一个数据
list.indexOf("");
list.lastIndexOf("");
list.push("aaa"); // 添加数据到第一个
System.out.println(list.pop()); // 弹出第一个数据

ArrayList和LinkedList对比

在这里插入图片描述

3.泛型

背景

public class Main{
    public static void main(String[] args) {
        Person6 person = new Person6();
        User6 user = new User6();
		ArrayList list = new ArrayList();
        list.add(person);
      	list.add(user);
        list.remove(0);
        // 从集合中获取的对象类型为Object
        Object o = list.get(0);
        // 如果想要执行对象的方法,那么需要进行强制类型转换
       if ( o instanceof  Person6 ) {
            Person6 p = (Person6)o;
            p.testPerson();
       }
    }
}
class Person6 {
    public void testPerson() {
        System.out.println("person...");
    }
}
class User6 {
    public void testUser() {
        System.out.println("user...");
    }
}

因为多态语法对对象的使用场景进行了约束,从集合中获取的对象类型为Object,不能直接调用对象类型本身的方法,可见集合对象在处理不同类型的数据时比较繁琐。
集合中没有约定存储数据的类型,不同类型的数据都可以存放在里面,保存了不同类型的数据后,处理起来机会比较麻烦。
在这里插入图片描述
在这里插入图片描述

泛型的使用

泛型和类型
在这里插入图片描述
类型相当于一个容器类,可以是集合,也可以是其他类

public class Java07_Collection_Generic {
    public static void main(String[] args) {
        // 泛型语法
        // TODO 泛型和类型的区别
        // 有时,也把泛型称之为类型参数
        MyContainer<User7> myContainer = new MyContainer();
        //myContainer.data = new Object();

        // 类型存在多态的使用方式,但是泛型没有多态的概念
        test(myContainer);


    }
    public static void test(MyContainer<User7> myContainer) {
        System.out.println(myContainer);
    }
}
// TODO 容器类
class MyContainer<T> {
    public T data;
}
class User7 {

}

4.HashSet

  • 创建对象
 // HashSet : Hash + Set
// Hash : 哈希算法,散列算法
HashSet set = new HashSet();
  • 增加数据
    不会重复存储
// TODo 增加数据
set.add("zhangsan");
set.add("zhangsan");  
set.add("lisi");
set.add("wangwu");  //[zhangsan,lisi,wangwu]

不能修改数据 ,要修改只能先删除再增加。

  • 删除数据
//删除数据
set.remove("wangwu");
  • 查询数据
    数据没有对应的索引,没有查询数据的方法。要查询只能遍历
// TODo 查询数据
for (Object o : set) {
   System.out.println(o);
}
System.out.println(set);
}
  • 其他常用方法
HashSet set = new HashSet();
ArrayList list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add("wamngwu");
set.addAll(list);
Object[] objects = set.toArray();
System.out.println(set.isEmpty());
set.clear();
set.contains("zhangsan");
System.out.println(set.size());
Object clone = set.clone();
System.out.println(clone);
System.out.println(set);
  • 重复数据的问题
public class Java09_Collection_Set_2 {
    public static void main(String[] args) {

        
        HashSet set = new HashSet();

        User9 user1 = new User9();
        user1.id = 1001;
        user1.name = "zhangsan";
        System.out.println(user1.hashCode());

        User9 user2 = new User9();
        user2.id = 1001;
        user2.name = "zhangsan";
        System.out.println(user2.hashCode());

        User9 user3 = new User9();
        user3.id = 1002;
        user3.name = "lisi";

        set.add(user1);
        set.add(user2);
        set.add(user3);
        System.out.println(set);
    }
}
class User9 {
    public int id;
    public String name;
    @Override
    public String toString() {
        return "User["+id+", "+name+"]";
    }
}

HashSet中不会有重复的数据,上面的例子中,user1和user2对象虽然属性值相同,但其内存地址不同,在内存中是独立保存的,是两个不同的对象,因此上面的HashSet中存储的是三个对象。

传递给HashSet一个对象时,进行定位操作的方式:传递一个对象时,以对象的hashCode来做哈希运算,找到数据存放的位置。如果这个位置没有存放数据,则直接将数据存储,如果这个位置已经有数据,则通过equals()方法判断两个数据是否相等,如果相等,则直接丢弃即将要存入的数据;如果不相等,则通过链表将两个位置相同的数据连接起来进行存放(HashSet 底层数据结构为 数组 + 链表)。
如果要使HashSet以对象的属性值是否相同为标准,判断存入的两个对象是否相同,则需要将判断对象是否相等以及获取对象hashCode值的方法进行重写。

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

        // TODO 集合 - Collection - Set
        // HashSet 底层数据结构为 数组 + 链表

        HashSet set = new HashSet();
        User9 user1 = new User9();
        user1.id = 1001;
        user1.name = "zhangsan";
        System.out.println(user1.hashCode());

        User9 user2 = new User9();
        user2.id = 1001;
        user2.name = "zhangsan";
        System.out.println(user2.hashCode());

        User9 user3 = new User9();
        user3.id = 1002;
        user3.name = "lisi";

        set.add(user1);
        set.add(user2);
        set.add(user3);
        System.out.println(set);
    }
}
class User9 {
    public int id;
    public String name;

    @Override
    // 类似于内存地址
    public int hashCode() {
        return id;
    }

    @Override
    // 判断两个对象的属性是否完全相同
    public boolean equals(Object obj) {
        if ( obj instanceof User9 ) {
            User9 otherUser = (User9)obj;
            if ( otherUser.id == this.id ) {
                if ( otherUser.name.equals(this.name) ) {
                    return true;
                }
            }
            return false;
        } else {
            return false;
        }
    }
    @Override
    public String toString() {
        return "User["+id+", "+name+"]";
    }
}

如此,两个对象id值相同时,其hashCode值相同,进行哈希定位时其位置也相同;再根据重写的equals方法,可判断出两个对象属性完全相同,即两个数据为同一个值。因此上面的HashSet中只会存储两个对象。

5.Queue

  • 入队方法
// ArrayBlockingQueue : Array + Blocking(阻塞,堵住) + Queue
ArrayBlockingQueue queue = new ArrayBlockingQueue(3);
// add方法如果增加数据增加不了,直接发生错误。
queue.add("zhangsan");
queue.add("lisi");
queue.add("wangwu");
queue.add("zhaoliu"); // 发生错误,Queue full
queue.put("zhangsan");
System.out.println("第一个人挂号");
queue.put("lisi");
System.out.println("第二个人挂号");
queue.put("wangwu");
System.out.println("第三个人挂号");
queue.put("zhaoliu");  // 不发生错误,但一直阻塞
System.out.println("第四个人挂号");
boolean zhangsan = queue.offer("zhangsan");
System.out.println(zhangsan);   // true
boolean lisi = queue.offer("lisi");
System.out.println(lisi);
boolean wangwu = queue.offer("wangwu");
System.out.println(wangwu);
boolean zhaoliu = queue.offer("zhaoliu");
System.out.println(zhaoliu);  // false
  • 出队方法
System.out.println(queue.poll());  // zhangsan
//当队列中没有数据时,执行此方法会输出null
System.out.println(queue.take());// zhangsan
//当队列中没有数据时,执行此方法会阻塞程序

6. HashMap

在这里插入图片描述
存储原理:根据key,由Hash算法计算存储的位置,可以不能重复,重复则覆盖

// HashMap : Hash + Map
// 数据存储是无序
HashMap map = new HashMap();
 // 添加数据:put
// 修改数据,put方法也可以修改数据,返回值就是被修改的值
map.put("zhangsan", "1");
System.out.println(map.put("zhangsan", "4"));  //key相同,value会被覆盖   输出覆盖的值 1
map.put("lisi", "2");
map.put("wangwu", "3");
// 修改数据 返回值就是被修改的值   如果不存在则返回null,且不会在map中添加
Object b = map.replace("b", "4"); 
System.out.println(b);
 //查询数据
System.out.println(map.get("zhangsan"));
// 删除数据
map.remove("zhangsan");
System.out.println(map);
map.remove("zhangsan", "1");  //删除键值对 key value都相同时才删除
// TODO 获取map集合中所有的key
Set set = map.keySet();
for (Object k : set) {
   System.out.println(map.get(k));  //获取key对应的value
}
System.out.println(map.containsKey("zhangsan"));
Collection values = map.values();
map.containsValue("1");
System.out.println(map);
HashMap<String, String> map = new HashMap();
// TODO 获取键值对对象
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
   System.out.println(entry.getKey() + "=" + entry.getValue()); //lisi=2
}

7.Hashtable

HashMap与Hashtable

  1. 实现方式不一样的 : 继承父类不一样
  2. 底层结构的容量不同: HashMap(16), Hashtable(11)
  3. HashMap的K,V都可以为null, Hashtable的K, V不能是null
  4. HashMap的数据定位采用的是Hash算法,但是Hashtable采用的就是hashcode
  5. HashMap的性能较高,但是Hashtable较低

8.迭代器

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
Set<String> keys = map.keySet();
for (String key : keys) {
    if ( "b".equals(key) ) {
	    map.remove("b");
    }
   System.out.println(map.get(key));
}

在遍历的时候修改会发生错误ConcurrentModificationException

// TODO 迭代器
        Iterator<String> iterator = keys.iterator();
        // hasNext方法用于判断是否存在下一条数据
        while (iterator.hasNext()) {
            // 获取下一条数据
            String key = iterator.next();
            if("b".equals(key)) {
                // remove方法只能对当前数据删除
                iterator.remove();
            }
            System.out.println(map.get(key));
        }

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

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

相关文章

【论文阅读】多模态模型CoCa

Introduction 在这项工作中&#xff0c;我们统一了单编码器、双编码器和编码器-解码器范式&#xff0c;并训练了一个包含三种方法优点的图像-文本基础模型。我们提出了对比Captioner模型(CoCa)&#xff0c;该模型采用经过对比损失和captioning损失训练的编码器-解码器架构。如图…

C语言源代码系列-管理系统之职工工资管理系统

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过…

数据存储策略——lsm-tree

文章目录一、背景二、lsm-tree简介三、lsm-tree设计思想四、lsm-tree原理1.写操作2.读操作3.有序表持久化4.后台压缩五、lsm-tree的应用六、lsm-tree优缺点分析总结一、背景 由于传统机械磁盘的原理&#xff0c;它在读写时有个寻道的操作&#xff0c;在读写时都需要消耗一个寻…

基于PHP+MySQL网上报名系统的设计与实现

一直以来如何更好的实现校园现代化和信息化是当前很多高校一直探索的问题&#xff0c;随着时代的发展&#xff0c;高校内各类考试和报名也越来越多&#xff0c;如何通过互联网直接进行在线报名是本系统研究的一个重点内容。 本系统是一个网上报名系统&#xff0c;为了能够更加灵…

[计算机毕业设计]机器学习的数据驱动股票价格预测

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

财政政策与货币政策(下)

财政政策与货币政策(下) – 潘登同学的宏观经济学笔记 文章目录财政政策与货币政策(下) -- 潘登同学的宏观经济学笔记粘性价格下的货币经济总供给曲线总供给曲线斜率与价格粘性菲利普斯曲线的消失货币政策的“动态不一致”财政政策与货币政策的配合财政主导 vs. 货币主导恶性通…

【学习记录】实例分割的发展与区别

【学习记录】实例分割的发展与区别 参考于《The Evolution Of Instantce Segmentation》 文章目录【学习记录】实例分割的发展与区别发展历程RCNNFast RCNNMultipath NetworkFaster RCNNMask RCNN发展历程 RCNN 开发集成了RCNN技术产生了AlexNet&#xff0c;以及使用选择性搜索…

浅谈App的启动优化

1. 应用启动的方式 在Android中&#xff0c;应用启动一般可分为三种&#xff1a;冷启动、温启动、热启动。 那么什么是冷启动、温启动和热启动呢&#xff1f;下面我们来简单看一下它们的定义&#xff1a; 冷启动&#xff1a;当启动应用时&#xff0c;后台没有该应用的进程。这…

Allegro导入导出设计数据操作指导

Allegro导入导出设计数据操作指导 Allegro有个非常好用的功能,就是支持设计数据的导入和导出,让协同设计变得更加方便,具体操作如下 以下面的设计数据为例,需要把这些数据导入到另外一个版本中 点击file-export-subdrawing Options所有的项目都勾选起来 Find选择需要导…

linux笔记(7):东山哪吒D1H使用framebuffer控制HDMI直线

文章目录1.测试流程和结果1.1 使能HDMI1.2 framebuffer操作流程1.3 测试结果2.测试过程详述2.1 编译源码2.2上传可执行文件2.3修改文件的权限&#xff0c;执行文件3.源码解释3.1 HDMI使用的颜色格式是ARGB4.源码工程链接这部分linux笔记是记录我入门的过程&#xff0c;内容基本…

【Flutter】【widget】Table 表格widget

文章目录前言一、Table 是什么&#xff1f;二、使用步骤1.Table 基础使用2.宽度3.设置边框4.TableCell设置单元格式widget等其他设置总结前言 Table 表格widget&#xff0c;其实很少使用到的&#xff0c;等有需要的时候在查看该widget 一、Table 是什么&#xff1f; 表格widg…

Trino源码Gitlab CICD单测环境建设

在中大型公司&#xff0c;由于对Presto源码的定制魔改量越来越大&#xff0c;会随着时间推移而增大出现冷门bug的概率&#xff0c;所以建立一套自动测试机制&#xff0c;在魔改源码合入主分支时可以自动触发test case&#xff0c;通过特定单测的执行失败&#xff0c;来更清晰的…

多云管理产品组合VMware Aria,开启多云管理新篇章

今年8月份&#xff0c;VMware Explore美国大会上宣布了多云管理产品组合VMware Aria&#xff0c;宣布之后&#xff0c;市场上关注度非常高&#xff0c;而且受到了热捧。Aria这个名字动听且贴切&#xff0c;中文意思是 “咏叹调”&#xff0c;也就是说要用统一的、一致的曲调来歌…

big.LITTLEDynamIQ

最近看到了DynamIQ&#xff0c;于是来了解一下什么是DynamIQ&#xff1f; 前言 首先要知道DynamIQ&#xff0c;那么你肯定得知道big.LITTLE。因为DynamIQ可以说是big.LITTLE新一代或者是升级版。 那么在这之前你肯定得知道什么是big.LITTLE&#xff1f; 然后知道了后你就会…

旋转框目标检测mmrotate v0.3.1 训练DOTA数据集(三)——配置文件优化技巧

1、 目标检测比赛中的tricks DOTAv2遥感图像旋转目标检测竞赛经验分享&#xff08;Swin Transformer Anchor free/based方案&#xff09; 目标检测比赛中的tricks&#xff08;已更新更多代码解析&#xff09; 水下目标检测算法赛解决方案分享 | 2020年全国水下机器人&#xf…

基于布谷鸟搜索混合灰狼优化算法求解单目标优化问题(AGWOCS)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

【工具】typora的一些配置

文章目录1. 自动编号1.1 大纲编号1.2 目录编号3. 正文部分2. 自定义快捷键1. 自动编号 我们在查看文档时候&#xff0c;希望编译器能够自动根据标题样式按顺序编号&#xff0c;不需要用户自行添加相应标题。这样也方便用户随时更新文档时候不会因为修改了某个编号而要去修改其…

分享3个文字配音软件,帮助你们轻松制作短视频

有没有刚踏入自媒体行业的小伙伴呀&#xff1f;那你们是不是为视频的后期工作所困惑着呢&#xff1f; 大家平时刷到的视频虽然看起来简短又有趣&#xff0c;但其实后期制作并没那么简单&#xff0c;是由许多道工序环环相扣而成的&#xff0c;其中比较重要的&#xff0c;就是为视…

JavaEE进阶:Spring 更简单的读取和存储对象

文章目录前言一、存储 Bean 对象1、前置⼯作&#xff1a;配置扫描路径&#xff08;重要&#xff09;2、添加注解存储 Bean 对象① Controller&#xff08;控制器存储&#xff09;② Service&#xff08;服务存储&#xff09;③ Repository&#xff08;仓库存储&#xff09;④ C…

栈的实现.

文章目录1.栈的概念及结构2.栈的实现&#xff08;数组实现&#xff09;2.1栈头文件2.2函数实现3.栈的习题3.1有效的括号3.1.1思路分析3.1.2代码实现1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删…