有关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 常用方法…...
使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控
使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控系统,可以分为以下几个步骤: 1. 系统架构设计 前端:使用 Vue.js、React 或 Angular 等前端框架实现用户界面。后端:使用 Spring Boot 提供 RESTful API,负责与…...
在 Apache Tomcat 中,部署和删除项目
在 Apache Tomcat 中,部署和删除 WAR 文件是常见的操作。以下是详细步骤: 1. 删除 WAR 文件 (1) 停止应用 进入 Tomcat 的管理界面(默认地址:http://localhost:8080/manager/html)。 找到需要删除的应用,…...
宇树科技G1人形机器人:从炫技到实用,AI驱动下的进化跃迁
 宇树科技的G1人形机器人近期凭借“720度回旋踢”“走梅花桩”等高难度动作频频出圈,成为人形机器人领域的现象级产品。 G1人形机器人看似炫技的表演背后,实则暗含了技术突破的深意。G1的每一次技能升级,都是对机器人运动控制、平衡算法和A…...
给定计算预算下的最佳LLM模型尺寸与预训练数据量分配
给定计算预算下的最佳LLM模型尺寸与预训练数据量分配 FesianXu 20250304 at Wechat Search Team 前言 如果给定了计算预算 C C C,如何分配LLM的模型尺寸 N N N和训练的数据量 D D D,才能使得模型的效果 L L L最好呢?笔者在此介绍一篇经典的文…...
H5DS编辑器是如何让企业快速构建动态页面
H5DS编辑器核心亮点: 1.拖拽式操作,小白友好:无需设计与代码基础!通过简单拖拽元素、调整文字和动画,即可生成交互式H5页面。内置海量模板和素材库,支持自定义设计风格,轻松适配企业品牌需求。…...
面试题汇总(一)
熙牛医疗面经 1.平衡二叉树的概念 平衡二叉树是一种二叉搜索树,他的左右两个字数的高度差绝对值不超过1,并且左右两个子树都是一颗平衡二叉树,通过左旋,右旋,左右双旋,右左双旋,来保持平衡&…...
论坛系统测试报告
目录 一、项目背景二、论坛系统测试用例思维导图三、论坛系统测试3.1界面测试3.2登陆测试3.3主页测试3.4个人中心测试 四、自动化测试脚本4.1配置驱动4.2创建浏览器类4.3功能测试4.3.1登陆测试4.3.2注册测试4.3.3主页测试4.3.4帖子编辑4.3.5运行主代码 五、BUG分析六、测试总结…...
算法比赛中处理输入和输出
在算法比赛中,不推荐使用 Scanner 和 System.out.println()。Scanner 线程安全,有大量同步操作,读取输入时每次都要解析数据类型,处理大数据量时性能开销大、效率低,易使程序超时间限制。System.out.println() 每次调用…...
llama.cpp: GGUF格式及模型量化参数介绍
GGUF格式介绍 GGUF(GPT-Generated Unified Format)是推理框架llama.cpp 中使用的一种专为大语言模型设计的二进制文件格式,旨在实现模型的快速加载和保存,同时易于读取。GGUF格式的特点: 单文件部署:模型…...
PGlite:浏览器中运行的PostgreSQL
PGlite 是一款基于 WebAssembly(WASM)构建的轻量级 PostgreSQL 数据库引擎,旨在简化开发者在浏览器、Node.js、Bun 或 Deno 环境中运行 PostgreSQL。PGlite 无需复杂的安装或配置,特别适合开发测试、本地化应用及快速原型设计。 一…...
【C++】vector(上):vector的常用接口介绍
文章目录 前言一、vector的介绍二、vector的常用接口介绍1.vector类对象的常见构造2.vector iterator 的使用3.vector类对象的容量操作3.1 size、capacity 和 empty的使用3.2 reserve的使用3.3 resize的使用 4.vector类对象的访问(包含data:返回底层数组…...
【算法】二分查找(上)
目录 一、写好二分查找的四个步骤 二、在排序数组中查找元素的第一个和最后一个位置 三、搜索插入位置 四、x的平方根 通过上篇文章【手撕二分查找】,我们知道了二分查找的【四要素】:初始值、循环条件、mid的计算方式、左右边界更新语句。 循环条件…...
【人工智能】GPT-4 vs DeepSeek-R1:谁主导了2025年的AI技术竞争?
前言 2025年,人工智能技术将迎来更加激烈的竞争。随着OpenAI的GPT-4和中国初创公司DeepSeek的DeepSeek-R1在全球范围内崭露头角,AI技术的竞争格局开始发生变化。这篇文章将详细对比这两款AI模型,从技术背景、应用领域、性能、成本效益等多个方…...
linux nginx 安装后,发现SSL模块未安装,如何处理?
?? 主页: ?? 感谢各位大佬 点赞?? 收藏 留言?? 加关注! ?? 收录于专栏:运维工程师 文章目录 前言SSL模块安装 前言 nginx 安装后,发现SSL模块未安装,如果不需要配置SSL域名,就无关紧要。但是很多时候客户后…...
蓝桥杯 - 每日打卡(类斐波那契循环数)
题目: 解题思路: 假设输入数值为number 分析题目,如果想要解决这个问题,我们需要实现两个方法,第一个检查number是否是类斐波那契,第二个是模拟1e7 - 0的过程,因为是求最大的,那么我们从1e7开始…...
深入探索C++17文件系统库:std::filesystem全面解析
前言 在C编程中,文件系统操作是许多应用程序的基础功能之一。无论是读写文件、创建目录,还是遍历文件系统,文件系统操作几乎无处不在。然而,在C17之前,标准库并没有提供一个统一、高效且易用的文件系统操作接口。开发…...
LLM | 论文精读 | GIS Copilot : 面向空间分析的自主GIS代理
论文标题:GIS Copilot: Towards an Autonomous GIS Agent for Spatial Analysis 作者:Temitope Akinboyewa,Zhenlong Li,Huan Ning,M. Naser Lessani等 来源:arXiv DOI:10.48550/arXiv.2411.…...
Unity 适用Canvas 为任一渲染模式的UI 拖拽
RectTransformUtility-ScreenPointToWorldPointInRectangle - Unity 脚本 API 将一个屏幕空间点转换为世界空间中位于给定RectTransform 平面上的一个位置。 实现 获取平面位置。 parentRT transform.parent as RectTransform; 继承IPointerDownHandler 和IDragHandler …...
基于遗传算法的无人机三维路径规划仿真步骤详解
基于遗传算法的无人机三维路径规划仿真步骤详解 一、问题定义 目标:在三维空间内,寻找从起点到终点的最优路径,需满足: 避障:避开所有障碍物。路径最短:总飞行距离尽可能短。平滑性:转折角度不宜过大,降低机动能耗。输入: 三维地图(含障碍物,如立方体、圆柱体)。起…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
