Java学习之集合2

集合:

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.mzph.cn/web/6802.shtml

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

相关文章

视频下载器 UC网盘

老王导航 - 复杂问题找老王&#xff0c;简单问题百度搜 神器啊

Spring框架的扩展点

Spring框架是一个非常流行的Java应用程序框架&#xff0c;它提供了一系列的扩展点&#xff0c;使得开发者可以自定义和增强框架的功能。这些扩展点包括&#xff1a; Bean生命周期回调 Spring允许通过实现特定的接口或使用注解来在Bean的生命周期的不同阶段&#xff08;如初始…

深入理解 ICMP 协议

目录 前言 1. 概述 特性与功能 报文封装与格式 2. ICMP差错报告 3. ICMP查询 4. ICMP应用 总结 前言 ICMP&#xff08;Internet Control Message Protocol&#xff09;是互联网控制报文协议&#xff0c;是TCP/IP协议族中的一个重要组成部分。作为网络层的协议之一&#…

保研面试408复习 2——操作系统、计网

文章目录 1、操作系统一、进程、线程的概念以及区别&#xff1f;二、进程间的通信方式&#xff1f; 2、计算机网络一、香农准则二、协议的三要素1. 语法2. 语义3. 时序 标记文字记忆&#xff0c;加粗文字注意&#xff0c;普通文字理解。 1、操作系统 一、进程、线程的概念以及…

利用反射和自定义注解优化参数处理

文章目录 自定义注解类定义反射和注解取值格式化参数测试 自定义注解 Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface PropertyAnnotation {//字段类型: STRING->0,Number 1,Decimal 2,DateTime 3, Date 4 ,int 5,Float 6,Double 7int ty…

力扣经典150题第五十五题:逆波兰表达式求值

目录 题目描述和要求示例解释解题思路算法实现复杂度分析测试和验证总结和拓展参考资料 题目描述和要求 给你一个字符串数组 tokens&#xff0c;表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式&#xff0c;并返回一个表示表达式值的整数。 注意&#xff1a; 有…

团队经理口才训练教案(3篇)

团队经理口才训练教案&#xff08;3篇&#xff09; **篇&#xff1a;基础口才训练 一、教学目标 让团队经理了解口才在团队管理中的重要性。 教授基础口才技巧&#xff0c;如发音、语速、语调等。 二、教学内容 口才的重要性 强调团队经理的口才能力对团队凝聚力、沟通…

牛客NC383 主持人调度(一)【简单 排序 Java/Go/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/e160b104354649b69600803184094adb 思路 直接看代码&#xff0c;不难Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返…

Android Binder机制

一.简介 Binder是什么&#xff1f; Android系统中&#xff0c;涉及到多进程间的通信底层都是依赖于Binder IPC机制。 例如当进程A中的Activity要向进程B中的Service通信&#xff0c;这便需要依赖于Binder IPC。不仅于 此&#xff0c;整个Android系统架构中&#xff0c;大量采…

BI不等同数据分析,别搞错了!

✅作者简介&#xff1a;《数据运营&#xff1a;数据分析模型撬动新零售实战》作者、《数据实践之美》作者、数据科技公司创始人、多次参加国家级大数据行业标准研讨及制定、高端企培合作讲师。 &#x1f338;公众号&#xff1a;风姑娘的数字视角&#xff0c;免费分享数据应用相…

小红的循环移位

题目描述&#xff1a;小红拿到了一个数字串&#xff0c;她每次操作可以使得其向左循环移动一位。将串 ss0 s1...sn−1s ​ 向左循环移动一位&#xff0c;将得到串s1...sn−1s0。小红想知道&#xff0c;使得该数字串变成4的倍数&#xff0c;需要最少操作多少次&#xff1f;&…

leetCode80. 删除有序数组中的重复项 II

leetCode80. 删除有序数组中的重复项 II 具体思路见我上篇博客&#xff1a;只不过哪里是只能出现1次&#xff0c;这里只能出现两次 删除有序数组中的重复项打卡博客 代码 class Solution { public:int removeDuplicates(vector<int>& nums) {int k 0;for(auto x :…

步态识别论文(6)GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation

摘要: 视角变化导致步态外观存在显着差异。因此&#xff0c;识别跨视图场景中的步态是非常具有挑战性的。最近的方法要么在进行识别之前将步态从原始视图转换为目标视图&#xff0c;要么通过蛮力学习或解耦学习提取与相机视图无关的步态特征。然而&#xff0c;这些方法有许多约…

2010NOIP普及组真题 2. 接水问题

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1950 解法一、朴素模拟 核心思想&#xff1a; 朴素模拟&#xff1a; 1、先给每个b[i]水龙头分配一个人a[i]&#xff0c;b[i] 表示水龙头的剩余时间。同时标记该水龙头为 used 使用中 2…

FFmpeg———encode_video(学习)

目录 前言源码函数最终效果 前言 encode_video:实现了对图片使用指定编码进行编码&#xff0c;生成可播放的视频流&#xff0c;编译时出现了一些错误&#xff0c;做了一些调整。 基本流程&#xff1a; 1、获取指定的编码器 2、编码器内存申请 3、编码器上下文内容参数设置 4、…

政安晨:【Keras机器学习示例演绎】(三十五)—— 使用 LayerScale 的类注意图像变换器

目录 简介 导入 层刻度层 随机深度层 类注意力 会说话的头注意力 前馈网络 其他模块 拼凑碎片&#xff1a;CaiT 模型 定义模型配置 模型实例化 加载预训练模型 推理工具 加载图像 获取预测 关注层可视化 结论 政安晨的个人主页&#xff1a;政安晨 欢迎 &#…

计算机专业就业前景以及工资待遇水平怎么样

计算机专业毕业生的就业前景不错的&#xff0c;计算机专业人才的需求量大&#xff0c;各行各业都需要这类人才来进行软件开发、数据分析、网络安全管理、系统维护等工&#xff0c;工资待遇水平较高&#xff0c;以下是上大学网&#xff08;www.sdaxue.com)整理的计算机专业就业前…

SMB协议之-那些隐藏/非隐藏共享share

在前面的文章中&#xff0c;介绍了SMB协议相关的内容&#xff0c;详见我的专栏《网络攻防协议实战分析》&#xff0c;连接这里。在SMB协议中往往会使用 tree connect命令连接到对应的远程共享地址。如果你经常接触到SMB协议&#xff0c;相信你对于ADMIN$ ,IPC$ ,C$ 等多种共享一…

质因数分解(cpp实现)--一种快速求得一个数有多少个因子的黑魔法

前言 最近机试没少吃不会质因数分解的亏&#xff0c;用传统的求得因子个数只能过一点点…(ex, 20%) 质因数分解后&#xff0c;可以将因子问题转化为 集合的组合问题&#xff0c;因此会很快&#xff0c;目测是 l o g n log n logn (n是该整数的值)。 传统解法 假设输入整数的…

每天学习一个Linux命令之dd

每天学习一个Linux命令之dd dd命令是Linux系统下一个非常强大的工具&#xff0c;它能够进行数据的复制和转换。本文将详细介绍dd命令的使用方法及常用选项。 1. dd命令的基本介绍 dd命令是一个进行数据转换和复制的工具&#xff0c;可以从输入文件中读取数据&#xff0c;并按…