有关Java中的集合(1):List<T>和Set<T>
学习目标
- 核心掌握List集合
- 了解Set集合
1.List<T>
● java.util.List。有序列表。
● List集合元素的特点:有序表示存取有序(因为有索引)而且可以重复
● List常用实现类: ArrayList、LinkedList、Vector等
1.1 常用方法

1.2 使用方法
- 测试List集合的使用方法
private static void demo1() {List<Integer> numList = new ArrayList<>();//1.新增numList.add(100);numList.add(20);numList.add(10);numList.add(2);//2.删除numList.remove(Integer.valueOf(20));//删除元素:20numList.removeIf(new Predicate<Integer>() {@Overridepublic boolean test(Integer num) {return Integer.valueOf(20).equals(num);}});numList.removeIf(Integer.valueOf(20)::equals);//numList.clear();//3.修改Integer num = numList.set(0, 200);System.out.println("num:"+num);//4.查询Integer num = numList.get(0);System.out.println(num);//5.其它方法System.out.println(numList.size());System.out.println(numList.contains(100));System.out.println(numList.indexOf(20));//获得指定数据第一次出现的索引位置 -1System.out.println(numList.lastIndexOf(20));System.out.println(numList.isEmpty());numList.sort();//对集合数据进行排序 default void sort(Comparator<? super E> c);numList.sort(Comparator.naturalOrder());//对于Integer而言 其实底层已经提供了排序规则//List集合元素类型已经实现过Comparable接口的话,使用List.sort()建议这样写numList.sort(Comparator.reverseOrder());System.out.println(numList);numList.replaceAll(new UnaryOperator<Integer>() {//修改满足条件的多个数据@Overridepublic Integer apply(Integer integer) {if (integer != null) {if (integer >= 100) {integer = 1;}}return integer;}});/* numList.replaceAll(integer->{if (integer != null) {if (integer >= 100) {integer = 1;}}return integer;});*/
}
- 了解subList方法
private static void demo3() {List<String> list = new ArrayList<>();Collections.addAll(list, "a", "b", "c", "abc", "ccc");//List<T> subList(startIndex,endIndex);List<String> subList = list.subList(0, 3);//subList之后,对截取之后的集合对象执行更新操作,都会还原到原对象。//截取的集合对象: 记着原集合对象的 root//subList.add("hello");//subList.remove(0);//subList.set(0,"aaaa");//截取之后,操作原集合(新增/遍历截取集合/删除/修改)。会出现ConcurrentModificationException。list.remove(0);// 已经删除。modCount 触发的fail-fastSystem.out.println("subList:" + subList);System.out.println("list:" + list);//Arrays.asList();//数组转集合List<String> stringList = Arrays.asList("a", "b", "c", "abc", "ccc");stringList.add("hello");System.out.println(stringList);
}
1.3 遍历集合
private static void demo2() {//方便创建对象并添加多个集合数据 还要满足后期更新。操作集合的工具类 java.util.CollectionsList<String> list = new ArrayList<>();Collections.addAll(list, "a", "b", "c", "abc", "ccc");//遍历List集合-----> 任意一种方式都可以//1.增强forfor (String s : list) {System.out.println(s);}//2.迭代器/listIteratorIterator<String> it = list.iterator();while (it.hasNext()) {String s = it.next();System.out.println(s);}/*ListIterator<String> listIterator = list.listIterator();while (listIterator.hasNext()) {String s = listIterator.next();System.out.println(s);}System.out.println("-----------------");//光标默认在最左端while (listIterator.hasPrevious()) {String s = listIterator.previous();System.out.println("s:"+s);}*///3.普通forint size = list.size();for (int index = 0; index < size; index++) {System.out.println(list.get(index));}//4.forEachlist.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});list.forEach(System.out::println);System.out.println(list);}
1.4 常用实现类
● 有序的特点: (有2种解释)
● 1.有索引位置(新增的元素顺序与遍历时候的顺序一致的)
● 2.可以按照排序规则排序(升序/降序)
● 常见数据结构:
● 1. 数组
● 2. 链表:
1.单向链表: 当前数据/元素/节点 下一个节点的引用。
2.双向链表: 上一个节点的引用 当前数据 下一个节点的引用。
● 3. 红黑树
● 4. hash表
| 实现类 | 底层数据结构 | 性能/效率 | 线程安全 |
|---|---|---|---|
| ArrayList | 动态数组 | 查询/修改效率高。新增/删除效率低 | 不安全 |
| LinkedList | 双向链表 | 查询/修改效率低。新增/删除效率高。 | 不安全 |
| Vector | 动态数组 | 单线程里面, 功能等价于ArrayList。并发,所有的功能性能偏低 | 安全 |
● ArrayList底层是数组。 因为数组内存空间连续所以查询性能较高(时间复杂度 O(1) ),删除元素和指定位置新增涉及到数组元素的移动 所以性能较低
● LinkedList底层是双向链表 内存空间不连续;链表的查询性能较低(要么从头查 要么从尾部查询 O(n)),删除和新增性能较高(只需要改动前后2个节点)
1.4.1 ArrayList<T>
● 创建集合对象的时候 使用泛型进行约束
● 底层是数组 ,当调用无参构造的时候,内部数组第一次扩容长度为10;当调用有参构造的时候 直接new一个指定长度的数组(建议使用有参构造 给一个大概的容量值 避免内部多次扩容降低性能)
● 底层是数组 因为数组内存空间连续所以查询性能较高,删除元素和指定位置新增涉及到数组元素的移动 所以性能较低
1.层级
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable{}
//RandomAccess: 快速随机访问。 空接口,标记接口。使用index遍历集合数据比迭代器效率快很多的。
2.常用构造
1. ArrayList() ;// 创建ArrayList集合对象 并初始化容量为10.---->数组的length。
2. ArrayList(int initialCapacity);//指定初始化容量数据 推荐。10//initialCapacity: 存储的最大元素个数/负载因子+1;
3. ArrayList(Collection<? extends E> c);//将一个集合的数据转换成ArrayList
3.基本使用
/**
- 泛型 元素类型 加约束
*/
public static void arrayListMethod() {
ArrayList arrayList = new ArrayList();
arrayList.add(“abc”);
arrayList.add(“123”);
// 加了泛型之后 取出来的元素 直接就是String类型了
String str = arrayList.get(1);
// 集合中都是对象 没有基本数据类型
ArrayList arrayList2 = new ArrayList<>();
arrayList2.add(123);
}
1.4.2 LinkedList<T>
● 底层是链表 双向链表 内存空间不连续
● 链表的查询性能较低,删除和新增性能较高(新增与删除最多只需要改动前后2个节点)
1.层级
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable{}
// 双链表实现了List和Deque接口。 实现所有可选列表操作,并允许所有元素(包括null )
2.常用构造
1.LinkedList();//推荐使用2.LinkedList(Collection<? extends E> c)
3.基本使用
private static void demo1() {LinkedList<String> linkedList = new LinkedList<>();//1.新增/*linkedList.add("a");linkedList.add(1,"b");linkedList.addFirst("hello");linkedList.addLast("abc");linkedList.push("111");*///addFirst add(0,"111");linkedList.add("a");linkedList.add("b");linkedList.add("c");linkedList.add("d");linkedList.offer("1");//add();linkedList.offerFirst("0");linkedList.offerLast("100");//2.删除linkedList.remove("a");linkedList.remove(0);//删除第一个数据linkedList.removeFirst();//删除最后一个数据linkedList.remove(linkedList.size() - 1);linkedList.removeLast();linkedList.pollLast();//3.修改linkedList.set(0,"abc");//4.查询system.out.println(linkedList.get(0));System.out.println(linkedList.getFirst());System.out.println(linkedList.element());System.out.println(linkedList.peek());System.out.println(linkedList.peekFirst());/*System.out.println(linkedList.get(linkedList.size() - 1));System.out.println(linkedList.getLast());System.out.println(linkedList.peekLast());*/System.out.println(linkedList);}
1.4.3 Vector<T>
● 底层也是数组,是一个线程安全的集合类.
● 线程安全的ArrayList的变体。
● 根本原因: Vector中所有的方法都使用synchronized。
● 了解此类即可。
1.层级
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable{}
2.常用构造
1. Vector();//初始化容量为10
2. Vector(int initialCapacity) ;//建议使用
3.线程安全
public class VectorDemo {//private static Vector<Integer> list = new Vector<>(100);private static List<Integer> list = Collections.synchronizedList(new ArrayList<>(100));//需要将线程不安全的集合对象 转换成线程安全的集合对象 Collections.synpublic static void main(String[] args) {demo2();}private static void demo2() {//开启多个任务 多个线程 同时操作list对象 新增数据//模拟: 创建10个线程 每个线程执行100次 add 1-100 1000个数据List<Thread> threadList = new ArrayList<>(10);for (int i = 0; i < 10; i++) {threadList.add(new Thread(VectorDemo::forDemo));}threadList.forEach(Thread::start);//启动10个线程//必须等待前10个线程的死亡try {for (Thread thread : threadList) {thread.join();}} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("size:" + list.size());//1000}private static void forDemo() {for (int num = 1; num <= 100; num++) {list.add(num);}}
}
2.Set<T>
● 实现了Set接口的实现类的集合元素数据: 无序 且不可重复
● 实现类有:HashSet ,LinkedHashSet, TreeSet等
● Set集合的每个数据都是作为Map的key来维护的。
2.1 常用方法
在Set集合中,没有独有的方法。所有的方法都是继承的Collection父接口。
2.2 使用方法
private static void demo1() {Set<Integer> set = new HashSet<>();//唯一 无序set.add(10);set.add(20);set.add(null);//删除//set.remove(10);//.....System.out.println(set);System.out.println(set.size());}
2.3 遍历集合
/*** Set 遍历方式有3种 因为没有索引 所以不能使用普通for循环*/public static void demo2() {HashSet<String> hashSet = new HashSet<>();hashSet.add("aa");hashSet.add("bb");hashSet.add("cc");System.out.println("-----1---------");for (String str : hashSet) {System.out.println(str);}System.out.println("------2---------");Iterator<String> iterator = hashSet.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}System.out.println("--------3----------");hashSet.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});hashSet.forEach((a) -> {System.out.println(a);});hashSet.forEach(System.out::println);}
2.4 常用实现类
| 数据结构 | 元素是否可以为null | 线程安全 | |
|---|---|---|---|
| HashSet | hash表+位桶(数组)+单向链表+红黑树。(HashMap维护HashSet的数据) | 可以 | 不安全 |
| LinkedHashSet | 双向链表+hash表。(LinkedHashMap) | 可以 | 不安全 |
| TreeSet | 红黑树(TreeMap) 有序(自然顺序排列)平衡 | 不可以 | 不安全 |
2.4.1 HashSet<T>
1.常用构造
1.HashSet() //HashMap实例具有默认初始容量(16)和负载因子(0.75)。
2.HashSet(int initialCapacity) // initialCapacity = 存储的最大的元素个数/负载因子+1
2.基本使用
private static void demo1() {HashSet<Integer> hashSet = new HashSet<>();//hashSet.add(1);Collections.addAll(hashSet, 1, 10, 8, 100, 2, 80);hashSet.add(100);hashSet.add(null);//元素是完全没有顺序 新增顺序与遍历顺序不一样//元素没有索引位置System.out.println(hashSet);
}
2.4.2 LinkedHashSet<T>
- LinkedHashSet是HashSet的子类。
private static void demo2() {LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>();Collections.addAll(linkedHashSet, 1, 10, 8, 100, 2, 80,null,80);System.out.println(linkedHashSet);//新增的顺序与遍历的顺序一致的
}
2.4.3 TreeSet<T>
1.常用构造
元素是有序(顺序)----> 按照自然顺序排列(排序)---->升序/降序
要求TreeSet集合的元素类型必须提供“排序规则”。
元素不能存储null(不能调用方法hashcode)
1. TreeSet() //根据其元素的自然排序进行排序. 要求集合元素类型必须实现java.lang.Comparable
2. TreeSet(Comparator<? super E> comparator) //自定义外部比较器对象 对集合元素进行排序
2.基本使用
private static void demo3() {TreeSet<Integer> treeSet = new TreeSet<>();//会集合元素排序---->集合元素类型的排序规则---> Integer//前提是无参构造 默认按照升序进行排列//treeSet.add(null);treeSet.add(10);treeSet.add(1);treeSet.add(0);treeSet.add(15);treeSet.add(12);System.out.println(treeSet);System.out.println("min:" + treeSet.first());System.out.println("max:" + treeSet.last());
}
3.集合存储对象
● 需求: 使用集合存储多个用户信息。
3.1 List<T>
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserInfo {private Integer id;private String name;private Integer age;
}
private static void demo1() {//创建多个用户对象 存储到集合中//ArrayList//List集合可以存储多个重复的数据List<UserInfo> userInfoList = new ArrayList<>(10);userInfoList.add(new UserInfo(1, "张三", 20));userInfoList.add(new UserInfo(1, "张三", 20));userInfoList.add(new UserInfo(1, "张三", 20));userInfoList.add(new UserInfo(1, "张三", 20));userInfoList.forEach(System.out::println);
}
3.2 HashSet<T>
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserInfo {private Integer id;private String name;private Integer age;//重写hashcode+equals 定义2分对象相等的规则@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;UserInfo userInfo = (UserInfo) o;returnObjects.equals(name, userInfo.name);}@Overridepublic int hashCode() {return Objects.hash( name);}//......
}
private static void demo2() {//使用HashSet存储多个用户对象//无序且唯一的//使用Set存储自定义类型对象的时候 一定自己重写equals+hashcode 底层数据结构是重建hash//根据重写的equals+hashcode 判断对象是否是相同的对象Set<UserInfo> userInfoSet = new HashSet<>();userInfoSet.add(new UserInfo(1, "张三", 20));userInfoSet.add(new UserInfo(2, "张三", 20));userInfoSet.add(new UserInfo(3, "张三", 20));userInfoSet.add(new UserInfo(4, "张三", 20));userInfoSet.forEach(System.out::println);
}
3.3 TreeSet<T>
● TreeSet底层的数据结构是红黑树。
● 由于TreeSet集合的元素要按照排序规则进行排序。所以使用TreeSet集合存储自定义类对象,一定要提供排序规则。
● 可以根据不同的TreeSet构造创建对象:
● TreeSet(); 无参构造创建对象。要求集合元素类型必须实现Comparable接口。
● TreeSet(Comparator comparator); 有参构造创建对象。集合元素类型不必实现Comparable,这个时候会使用外部比较器Comparator里面定义的排序规则对集合元素排序。
- 写法1:
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserInfo implements Comparable<UserInfo> {private Integer id;private String name;private Integer age;//自定义排序规则//不需要重写equals+hashcode TreeSet底层不是hash维护的,与这2个方法没有一点关系,只看排序规则。//在排序规则里面,相关属性相同的对象就会认为是相同的对象。@Overridepublic int compareTo(UserInfo userInfo) {return userInfo.age.compareTo(this.age);}
}
private static void demo3() {//使用TreeSet存储多个用户对象//元素会排序----->排序规则是什么?//使用TreeSet无参构造创建对象 要求集合元素类型必须实现java.lang.Comparable//TreeSet与hash没有关系 底层是树结构维护的 只看排序规则里面的属性的数据TreeSet<UserInfo> userInfoTreeSet = new TreeSet<>();userInfoTreeSet.add(new UserInfo(1, "张三", 20));userInfoTreeSet.add(new UserInfo(2, "张三", 20));userInfoTreeSet.add(new UserInfo(3, "张三", 12));userInfoTreeSet.add(new UserInfo(4, "张三", 25));userInfoTreeSet.forEach(System.out::println);
}
- 写法2:
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserInfo {private Integer id;private String name;private Integer age;
}
private static void demo4() {
// TreeSet<UserInfo> userInfoTreeSet = new TreeSet<>(new Comparator<UserInfo>(){
// @Override
// public int compare(UserInfo user1, UserInfo user2) {
// return user1.getAge().compareTo(user2.getAge());
// }
// });
// TreeSet<UserInfo> userInfoTreeSet = new TreeSet<>((user1,user2)->user1.getAge().compareTo(user2.getAge()));TreeSet<UserInfo> userInfoTreeSet = new TreeSet<>(Comparator.comparing(UserInfo::getAge));userInfoTreeSet.add(new UserInfo(1, "张三", 20));userInfoTreeSet.add(new UserInfo(2, "张三", 20));userInfoTreeSet.add(new UserInfo(3, "张三", 12));userInfoTreeSet.add(new UserInfo(4, "张三", 25));userInfoTreeSet.forEach(System.out::println);}
}
相关文章:
有关Java中的集合(1):List<T>和Set<T>
学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点:有序表示存取有序(因为有索引)而且可以重复 ● List常用实现类: ArrayList、LinkedList、Vector等 1.1 常用方法…...
【C++STL之vector】vector容器浅析
文章目录 🌟 深入探索C vector:从青铜到王者的动态数组进阶指南 🌟🚀 开篇:为什么vector是C程序员的瑞士军刀?🔍 一、vector的本质解密:不只是智能数组那么简单1.1 动态数组的华丽蜕…...
如何通过卷积神经网络(CNN)有效地提取图像的局部特征,并在CIFAR-10数据集上实现高精度的分类?
目录 1. CNN 提取图像局部特征的原理 2. 在 CIFAR - 10 数据集上实现高精度分类的步骤 2.1 数据准备 2.2 构建 CNN 模型 2.3 定义损失函数和优化器 2.4 训练模型 2.5 测试模型 3. 提高分类精度的技巧 卷积神经网络(Convolutional Neural Network, CNN&#…...
Redis的持久化-RDBAOF
文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发。 …...
Redis 的几个热点知识
前言 Redis 是一款内存级的数据库,凭借其卓越的性能,几乎成为每位开发者的标配工具。 虽然 Redis 包含大量需要掌握的知识,但其中的热点知识并不多。今天,『知行』就和大家分享一些 Redis 中的热点知识。 Redis 数据结构 Redis…...
Rust WebAssembly 入门教程
一、开发环境搭建 1. 基础工具安装 # 安装 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装 wasm-pack cargo install wasm-pack# 安装开发服务器 cargo install basic-http-server# 安装文件监听工具 cargo install cargo-watch2. VSCode 插件安装…...
靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连
靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵,这里只有两个端口,感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...
机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】
目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具,便于在客户端软件中…...
Android 中 ConstrantLayout 与 RelativeLayout 区别
ConstraintLayout 和 RelativeLayout 都是 Android 开发中常用的布局容器,它们都可以用于构建复杂的用户界面,但在功能、性能、使用方式等方面存在一些区别,下面为你详细介绍: 1. 布局原理 RelativeLayout:RelativeL…...
【3DMAX室内设计】2D转3D平面图插件2Dto3D使用方法
【一键筑梦】革新性2Dto3D插件,轻松实现2D平面图向3D空间的华丽蜕变。这款专为3DMAX室内设计师设计的神器,集一键式墙体、门、窗自动生成功能于一身,能够将2D图形无缝转化为3D网格对象(3D平面图、鸟瞰图),一…...
vscode 查看3d
目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件: 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程:开始是绿屏,过了1到2秒,后来就正常看了。 2. vsc…...
自动驾驶---不依赖地图的大模型轨迹预测
1 前言 早期传统自动驾驶方案通常依赖高精地图(HD Map)提供道路结构、车道线、交通规则等信息,可参考博客《自动驾驶---方案从有图迈进无图》,本质上还是存在问题: 数据依赖性高:地图构建成本昂贵…...
perl初试
我手头有一个脚本,用于从blastp序列比对的结果文件中,进行文本处理, 获取序列比对最优的hit记录 #!/usr/bin/perl -w use strict;my ($blast_out) ARGV; my $usage "This script is to get the best hit from blast output file wit…...
VS Code C++ 开发环境配置
VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…...
Web Snapshot 网页截图 模块代码详解
本文将详细解析 Web Snapshot 模块的实现原理和关键代码。这个模块主要用于捕获网页完整截图,特别优化了对动态加载内容的处理。 1. 模块概述 snapshot.py 是一个功能完整的网页截图工具,它使用 Selenium 和 Chrome WebDriver 来模拟真实浏览器行为&am…...
Java TCP 通信:实现简单的 Echo 服务器与客户端
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。与 UDP 不同,TCP 保证了数据的顺序、可靠性和完整性,适用于需要可靠传输的应用场景,如文件传输、网页浏览等。本文将基于 Java 实现一个简单的…...
Windows 10 下 SIBR Core (i.e. 3DGS SIBR Viewers) 的编译
本文针对在 Windows 10 上从源码编译安装3DGS (3D Gaussian Splatting)的Viewers 即SIBR Core及外部依赖库extlibs(预编译的版本直接在页面https://sibr.gitlabpages.inria.fr/download.html下载) ,参考SIBR 的官方网站…...
JavaWeb-HttpServletRequest请求域接口
文章目录 HttpServletRequest请求域接口HttpServletRequest请求域接口简介关于请求域和应用域的区别 请求域接口中的相关方法获取前端请求参数(getParameter系列方法)存储请求域名参数(Attribute系列方法)获取客户端的相关地址信息获取项目的根路径 关于转发和重定向的细致剖析…...
【C++】switch 语句编译报错:error: jump to case label
/home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp: In member function ‘virtual u32 CRkVpss::Control(u32, void*, u32)’: /home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp:242:8: error: jump to case label242 | case emRkComCmd_DBG_SaveInput:|…...
防火墙虚拟系统实验
拓扑图 需求一 安全策略要求: 1、只存在一个公网IP地址,公司内网所有部门都需要借用同一个接口访问外网 2、财务部禁止访问Internet,研发部门只有部分员工可以访问Internet,行政部门全部可以访问互联网 3、为三个部门的虚拟系统分…...
点云滤波方法:特点、作用及使用场景
点云滤波是点云数据预处理的重要步骤,目的是去除噪声点、离群点等异常数据,平滑点云或提取特定频段特征,为后续的特征提取、配准、曲面重建、可视化等高阶应用打下良好基础。以下是点云中几种常见滤波方法的特点、作用及使用场景:…...
Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南
Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南 在 Java 项目开发中,使用 Lombok 可以极大地减少样板代码(如 getter/setter 方法、构造器等),提高开发效率。然而,当使用 Gradle 构建工具并将项目发布到私…...
ArcGIS Pro 基于基站数据生成基站扇区地图
在当今数字化的时代,地理信息系统(GIS)在各个领域都发挥着至关重要的作用。 ArcGIS Pro作为一款功能强大的GIS软件,为用户提供了丰富的工具和功能,使得数据处理、地图制作和空间分析变得更加高效和便捷。 本文将为您…...
【Python · Pytorch】Conda介绍 DGL-cuda安装
本文仅涉及DGL库介绍与cuda配置,不包含神经网络及其训练测试。 起因:博主电脑安装了 CUDA 12.4 版本,但DGL疑似没有版本支持该CUDA版本。随即想到可利用Conda创建CUDA12.1版本的虚拟环境。 1. Conda环境 1.1 Conda环境简介 Conda࿱…...
Spring AI:开启Java开发的智能新时代
目录 一、引言二、什么是 Spring AI2.1 Spring AI 的背景2.2 Spring AI 的目标 三、Spring AI 的核心组件3.1 数据处理3.2 模型训练3.3 模型部署3.4 模型监控 四、Spring AI 的核心功能4.1 支持的模型提供商与类型4.2 便携 API 与同步、流式 API 选项4.3 将 AI 模型输出映射到 …...
leetcode:2965. 找出缺失和重复的数字(python3解法)
难度:简单 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从…...
Android U 分屏——SystemUI侧处理
WMShell相关的dump命令 手机分屏启动应用后运行命令:adb shell dumpsys activity service SystemUIService WMShell 我们可以找到其中分屏的部分,如下图所示: 分屏的组成 简图 分屏是由上分屏(SideStage)、下分屏(MainStage)以及分割线组…...
面试基础---MySQL 事务隔离级别与 MVCC 深度解析
MySQL 事务隔离级别与 MVCC 深度解析:原理、实践与源码分析 引言 在高并发的互联网应用中,数据库事务的隔离级别是保证数据一致性和并发性能的关键。MySQL 通过多版本并发控制(MVCC)机制实现了不同的事务隔离级别。本文将深入探…...
第十二届蓝桥杯大学A组java省赛答案整理
货物摆放 题目描述 小蓝有一个超大的仓库,可以摆放很多货物。 现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。 小蓝希望所…...
浅浅初识AI、AI大模型、AGI
前记:这里只是简单了解,后面有时间会专门来扩展和深入。 当前,人工智能(AI)及其细分领域(如AI算法工程师、自然语言处理NLP、通用人工智能AGI)的就业前景呈现高速增长态势,市场需求…...
