Java学习之集合2

news/2024/5/20 17:53:13

集合:

1.ArrayList集合类

import java.util.ArrayList;public class Demo01ArrayList {public static void main(String[] args) {/*ArrayList类概述底层数据结构是数组,查询快,增删慢TODO 方法插入数据时不会对插入的数据进行自然排序或字典排序add(index,value)  => 指定下标添加数据时,指定下标最大只能再当前ArrayList最大下标后+1  并且可以实现插入数据remove() => 根据下标或数据删除*/ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(0,2);arrayList.add(1,3);arrayList.add(2,10);arrayList.add(1,30);System.out.println(arrayList);/*TODO 删除数据Integer 包装类数据在传递数据调用函数时,优先调用符合要求的函数,如果不符合再考虑自动拆箱*/Integer integer =3;arrayList.remove(integer);System.out.println(arrayList);}
}

2. Vector

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.ListIterator;
import java.util.Vector;public class DemoVector {public static void main(String[] args) {/* TODO   public class Vector<E> extends AbstractList<E>为什么需要使用Vector?Vector是同步的线程安全的。 如果不需要线程安全的实现,建议使用ArrayList代替Vector*/Vector<String> vector = new Vector<>();vector.add("张三");vector.add("李四");vector.add("王五");//整个逻辑相当于迭代器遍历//Enumeration 接口位于 java.util 包中,它是一个传统的、古老的接口,// 提供了两个主要的方法:hasMoreElements() 和 nextElement()。//使用在诸如 Vector 和 Properties 这些传统类所定义的方法中//Vector的elements()方法返回一个枚举器,可以用来遍历Vector中的元素。Enumeration<String> elements = vector.elements();// addElement() 方法在功能上与 add(Object) 方法相同。// add() 方法返回 true/false 但 addElement() 方法不返回任何值。vector.addElement("赵六");while (elements.hasMoreElements()) {String name = elements.nextElement();if ("李四".equals(name)){//对于迭代器进行遍历数据删除时,只能使用迭代器中的remove方法进行删除//可直接使用vector.remove()进行删除vector.remove("李四");}System.out.println();}// 获取第一个及最后一个元素System.out.println(vector.firstElement());System.out.println(vector.lastElement());// 指定下标位置插入数据vector.insertElementAt("麻七",2);System.out.println(vector);/*演示ArrayList的ConcurrentModificationExceptionArrayList 获取到 iterator 迭代器之后,改变了当前ArrayList中的数据长度没有通过iterator的next方法中对于长度的检查要求 iterator 创建后原先的ArrayList长度不能发生变化final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}*/ArrayList<String> list = new ArrayList<>();list.add("1");list.add("2");ListIterator<String> iterator = list.listIterator();list.add("3");list.add("4");while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

3. LinkedList

import java.util.LinkedList;public class DemoLinkedList {public static void main(String[] args) {/*TODO:LinkedList 底层为链表,增删快*/LinkedList<Object> linkedList = new LinkedList<>();linkedList.add("1");linkedList.addFirst("2");linkedList.addLast("3");System.out.println(linkedList);  // [2, 1, 3]System.out.println(linkedList.getFirst());System.out.println(linkedList.getLast());//poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除System.out.println(linkedList.poll());// 2//检索并删除此列表的第一个元素,如果此列表为空,则返回nullSystem.out.println(linkedList.pollFirst());// 1//pop是栈结构的实现类的方法,表示返回栈顶的元素,同时该元素从栈中删除,// 当栈中没有元素时,调用该方法会发生异常System.out.println(linkedList.pop());// 3System.out.println(linkedList);linkedList.removeFirst();linkedList.removeLast();}
}

4.泛型

import java.util.ArrayList;public class DemoGenerics {public static void main(String[] args) {/*TODO 泛型1.为什么需要泛型?1.  对于有时调用某个类中的方法时,方法的参数类型需要明确,但是为了方法的使用广泛,那么该方法的参数类型不能写死 而Java是一种强类型语言,必须要表示其类型是什么所以需要使用某种 标记 来表示其类型2. 对于集合在添加数据时,如果对数据不进行限制,那么对于其具体的元素只能泛化为Object的子类实际使用时需要对其元素的类型进行明确,一般情况下,一个容器中,保存的数据应该为同一种类型总结:泛型可以对类型进行控制2.泛型的书写格式使用 <> 进行表示 并可以对 类进行修饰传参 / 方法进行修饰 / 变量泛型 可以表述一种未知的类型,可以增加方法的灵活性*/ArrayList arrayList = new ArrayList();arrayList.add(1);arrayList.add("字符串");for (Object o : arrayList) {System.out.println(o);}/*TODO 当在类名旁使用<类型>进行表述时,就限定其 T = 类型*/A<String> stringA = new A<>("张三");A<Name> nameA = new A<>(new Name("李", "亮"));nameA.name.printInfo();new B().fun("这是B类中的泛型方法");String string = new B().fun1("String");Integer integer = 1;
//        new B().<String>fun(integer);new B().<String>fun("integer");B b = new B();b.fun2(new Cat());}
}class A<T> {T name;/*TODO A类的有参构造使用了 T 作为其参数类型T同时也是当前 A类中的一个属性*/public A(T t) {this.name = t;}
}class B {// TODO  public <E> 用于限制方法在调用时,对其中的参数进行限制类型public <E> void fun(E e) {System.out.println(e);}public <F> F fun1(F f) {return f;}// TODO 对于T泛型要求为一个动物public <T extends Animal> void fun2(T t) {t.eat();t.run();}
}abstract class Animal {public abstract void run();public abstract void eat();
}class Cat extends Animal {@Overridepublic void run() {System.out.println("猫可以走猫步...");}@Overridepublic void eat() {System.out.println("🐱爱吃鱼...");}
}class JJLCat extends Cat{final String type = "金吉拉";String name;public JJLCat(String name) {this.name = name;}
}class Name {String xing;String ming;public Name(String xing, String ming) {this.xing = xing;this.ming = ming;}public void printInfo() {System.out.println("在下免贵姓" + xing + "名" + ming);}
}

5. ArrayList forEach() 方法

import java.util.ArrayList;
import java.util.function.Consumer;public class DemoFor {public static void main(String[] args) {ArrayList<Integer> integers = new ArrayList<>();integers.add(1);integers.add(2);integers.add(4);//增强For循环遍历集合for (Integer integer : integers) {System.out.println(integer);}//        integers.listIterator().for/*iterator方法是属于 Iterable 的 生成一个迭代器迭代器在有些情况下,因为可以维护一个指针,并且有时并不需要将所有的数据全部获取到之后再再去进行数据遍历可能有时是数据获取一条,再遍历一条  这样提升了效率 也节约了内存空间*/integers.iterator();/* TODOforEach() 方法用于遍历动态数组中每一个元素并执行特定操作。forEach() 方法的语法为:arraylist.forEach(Consumer<E> action)/*/integers.forEach(// TODO  Consumer 表示一个消费器 用于获取ArrayList中的每个元素new Consumer<Integer>() {/*accept 方法用于接收每个元素 会将 ArrayList中的每一个元素 传入到  elem 变量中每个元素调用一次 accept 函数*/@Overridepublic void accept(Integer elem) {System.out.println("accept被执行了一次:" + elem * 3);}});}
}

6.可变长参数

import java.util.Arrays;
import java.util.List;public class MoreParameter {public static void main(String[] args) {
//        3,4,5,6,7,8int[] ints = {3,4,5,6,7,8};System.out.println(ints);System.out.println(compute1(ints));System.out.println(compute2(3,4,5,6,7,8));// TODO   Arrays.<String> 中的String可以去除,是因为编译时,可以根据传入的数据推导出来 T 但是建议加上List<String> stringList = Arrays.<String>asList("a", "b", "c");System.out.println(stringList);}/*TODO 在做数据计算时,如果需要对多个值进行求积计算,那么如何操作?*/public static int compute1(int[] allData){int res = 1;for (int data : allData) {res *= data;}return res;}// TODO Java中给定了一个可变长参数 格式为 类型... 实际上就是一个数组//    可以避免一些无效的数组变量创建public static int compute2(int... allData){System.out.println(allData); // [I @4554617c 数组return 1;}}

7.Set

package com.shujia.day09_ArrayList_Set;import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.function.Consumer;public class Demo09Set {public static void main(String[] args) {/*Set集合中不包含重复元素,并且是无序的*/Set<String> stringSet = new HashSet<String>();stringSet.add("2");stringSet.add("3");stringSet.add("2");  // 去重了stringSet.add("4");System.out.println(stringSet);for (String value : stringSet) {System.out.println(value);}/*TODO自定义类进行数据保存Set对于自定义类添加到Set中时,会按照对象的内存地址进行等值判断后去重判断是通过 equals 方法 => 自定义类会继承Object默认使用 == 地址判断*/Set<Data> data = new HashSet<>();Data data1 = new Data("1");data.add(data1);data.add(new Data("2"));data.add(data1);data.add(new Data("1"));data.add(new Data("3"));  // 重写 equals 后根据属性 value 进行比较System.out.println(data);System.out.println(data.size());for (Data datum : data) {System.out.println(datum.value);}}
}
class Data{String value;public Data(String value) {this.value = value;}//重写equals()方法,使其符合所要的判断逻辑@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Data data = (Data) o;return Objects.equals(value, data.value);}//Objects.hash() 可以接受一个或多个对象并为它们提供哈希码@Overridepublic int hashCode() {return Objects.hash(value);}
}

8. HashSet

import java.util.HashSet;public class DemoHashSet {public static void main(String[] args) {/*TODO 由于integers数据对其调用HashCode函数得到的结果和数值一样那么在Hash表中存储的位置是根据Hash结果进行定位的,所以相邻的数值存储位置也是相邻的TODO  HashSet如何保证元素唯一性底层数据结构是哈希表(元素是链表的数组)哈希表依赖于哈希值存储添加功能底层依赖两个方法:int hashCode()boolean equals(Object obj)如果hashCode相同,那么并不一定说明两个数据就一定一样,( x=数据  y=hashCode)同时在存储时经过取余计算,两个不同的数据也有可能得到相同的位置数据所以需要再通过等值判断*/HashSet<Integer> integers = new HashSet<>();integers.add(2);integers.add(1);integers.add(5);integers.add(4);integers.add(6);System.out.println(integers); // [1, 2, 4, 5, 6]HashSet<String> strHash = new HashSet<>();strHash.add("11");strHash.add("10");strHash.add("8");strHash.add("0");strHash.add("a");System.out.println(strHash); // [11, 0, a, 8, 10]Integer integer1 = 1;Integer integer2 = 2;System.out.println(integer1.hashCode()); // 1System.out.println(integer2.hashCode()); // 2}
}

9. LinkedHashSet

import java.util.LinkedHashSet;public class DemoLinkedHashSet {public static void main(String[] args) {/*TODO LinkedHashSet:元素有序唯一由链表保证元素有序 => 只能保证其添加顺序 =>由哈希表保证元素唯一*/LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>();linkedHashSet.add(2);linkedHashSet.add(1);linkedHashSet.add(5);linkedHashSet.add(4);linkedHashSet.add(6);System.out.println(linkedHashSet); //  [2, 1, 5, 4, 6]}
}

http://www.mrgr.cn/p/34570034

相关文章

项目冲刺——第三篇Scrum冲刺博客

作业所属课程 所属课程作业要求 作业要求作业目标 总结第二天的敏捷开发,安排好第三天敏捷开发冲刺一、站立式会议 1、会议图片2、昨天已完成的内容成员 任务肖杨、梁丽贤 完成注册登陆页面设计黄诃华、欧文杰 完成用户注册登陆功能姚佳如、李慧娣 完成发布帖子模块的设计廖莹…

93、动态规划-最长回文子串

思路 首先从暴力递归开始&#xff0c;回文首尾指针相向运动肯定想等。就是回文&#xff0c;代码如下&#xff1a; public String longestPalindrome(String s) {if (s null || s.length() 0) {return "";}return longestPalindromeHelper(s, 0, s.length() - 1);…

大模型微调实战之强化学习 贝尔曼方程及价值函数(五)

大模型微调实战之强化学习 贝尔曼方程及价值函数&#xff08;五&#xff09; 现在&#xff0c; 看一下状态-动作值函数的示意图&#xff1a; 这个图表示假设首先采取一些行动(a)。因此&#xff0c;由于动作&#xff08;a&#xff09;&#xff0c;代理可能会被环境转换到这些状…

团队作业4——项目冲刺 第3篇 Scrum 冲刺博客

这个作业属于哪个课程 软件工程这个作业要求在哪里 团队作业4——项目冲刺这个作业的目标 团队完成任务的分配,明确团队每个人在接下来七天敏捷冲刺的目标其他参考文献这个作业所属团队 SuperNewCode团队成员 张楠 曾琳备 黄铭涛 张小宇 周广1.每日举行站立时会议2.燃尽图3.每…

牛客NC97 字符串出现次数的TopK问题【中等 哈希+优先级队列 Java/Go】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/fd711bdfa0e840b381d7e1b82183b3ee 核心 哈希&#xff0c;优先级队列Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返…

计算机组成原理网课笔记

无符号整数的表示与运算 带符号整数的表示与运算 原反补码的特性对比 移码 定点小数

linux增加环境变量示例

首先,通过 vim ~/.bashrc 命令进入我这个用户的.bashrc文件内 然后在这个文件末尾添加环境变量,比如下面红框中的内容表示添加了路径/home/nfs_new/wangpeng/VSCode-linux-x64/bin为环境变量,实际上这里是把vscode启动命令添加作为环境变量了。其中, $PATH 表示之前所有的…

go学习笔记——Kratos框架

官方文档https://go-kratos.dev/en/docs/getting-started/start/1.安装Go 参考:mac安装go1.20 2.安装Kratos框架 kratos依赖protobuf grpc等框架,需要先进行安装brew install grpc brew install protobuf brew install protoc-gen-go brew install protoc-gen-go-grpc验证pro…

js逆向,参数加密js混淆

关键词 JS 混淆、源码乱码、参数动态加密 逆向目标 题目1&#xff1a;抓取所有&#xff08;5页&#xff09;机票的价格&#xff0c;并计算所有机票价格的平均值&#xff0c;填入答案。 目标网址&#xff1a;https://match.yuanrenxue.cn/match/1目标接口&#xff1a;https://ma…

【Linux】在Linux中执行命令ifconfig, 报错-bash:ifconfig: command not found解决方案

一、报错信息 ifconfig 报错-bash:ifconfig: command not found 同时&#xff0c;通过ip addr查看&#xff0c;也看不到IP信息 二、解决方案 找到ifcfg-ens0文件&#xff0c;此文件的目录在/etc/sysconfig/network-scripts目录下 命令&#xff1a;cd /etc/sysconfig/network…

m基于遗传优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真

1.算法仿真效果 matlab2022a仿真结果如下:遗传优化迭代过程:误码率对比:2.算法涉及理论知识概要低密度奇偶校验码(Low-Density Parity-Check Code, LDPC码)因其优越的纠错性能和近似香农极限的潜力,在现代通信系统中扮演着重要角色。归一化最小和(Normalized Min-Sum, NMS)…

Vue.js-----vue组件

能够说出vue生命周期能够掌握axios的使用能够了解$refs, $nextTick作用能够完成购物车案例 Vue 生命周期讲解 1.钩子函数 目标&#xff1a;Vue 框架内置函数&#xff0c;随着组件的生命周期阶段&#xff0c;自动执行 作用: 特定的时间点&#xff0c;执行特定的操作场景: 组…

交流接触器

一般按负载电流的1.5倍选择;

IPFoxy:什么是静态住宅IP?静态ISP代理指南

静态住宅代理&#xff08;也称为静态ISP代理&#xff09;是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务&#xff1f;下面我具体分享。 一、什么是静态住宅代理&#xff1f; 首先&#xff0c;我…

C++学习笔记——仿函数

文章目录 仿函数——思维导图仿函数是什么仿函数的优势理解仿函数仿函数的原理举例 仿函数——思维导图 仿函数是什么 使用对象名调用operator&#xff08;&#xff09;函数看起来像是在使用函数一样&#xff0c;因此便有了仿函数的称呼&#xff1b;仿函数存在的意义是&#x…

stm32 出现 hard fault 的排查记录

参考链接:https://blog.csdn.net/qq_43118572/article/details/1327596261、先验知识先验知识1: cortex m3 在中断/异常时,会把 8 个寄存器(xPSR、PC、LR、R12 以及R3-R0)的值压入栈。入栈顺序以及入栈后堆栈中的内容如下(CM4 是从低地址到搞地质):地址 寄存器 被保存的…

stm32 将外部 Flash挂载在 SPI 出现数据传输时好时不好的排查过程

现象: 将外部 Flash 挂载在 SPI,在 hardware_init() -> read_jedec_id() 里的 result = spi->wr(spi, cmd_data, sizeof(cmd_data), recv_data, sizeof(recv_data)) 中, recv_data 的值经常不一致,result 的值偶尔为 SFUD_SUCCESS, 大部分会 Error。备注: 正常情况…

力扣每日一题112:路径总和

题目 简单 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 是…