java 集合
Java集合框架(Java Collections Framework)是一个强大的工具库,旨在简化数据存储和操作的任务。它提供了一组接口、类和算法,帮助开发者高效地管理数据,如列表、集合和映射。下面是Java集合框架的详细介绍:
一. 集合框架的核心接口
Java集合框架由多个核心接口组成,每个接口定义了不同的功能:
(1) Collection接口
Collection是所有集合类的根接口,定义了集合中元素的基本操作方法。主要方法包括:
- add(E e):向集合添加元素。
- remove(Object o):从集合中删除指定元素。
- clear():清空集合。
- size():返回集合中的元素个数。
(2) List接口
List接口继承自Collection接口,表示一个有序的元素集合。List中的元素可以重复,常见的实现类有:
- ArrayList:基于动态数组实现,适合快速随机访问。
- LinkedList:基于双向链表实现,适合频繁插入和删除。
- Vector:类似于ArrayList,但线程安全。
(3) Set接口
Set接口继承自Collection接口,表示一个不包含重复元素的集合。常见实现类有:
- HashSet:基于哈希表实现,元素无序。
- LinkedHashSet:基于哈希表和链表实现,保持插入顺序。
- TreeSet:基于红黑树实现,元素按升序排列。
(4) Queue接口
Queue接口表示一个队列集合,通常用于存储按顺序处理的元素。常见实现类有:
- PriorityQueue:基于堆实现的优先队列,元素按优先级排序。
- LinkedList:实现了Queue接口,适合队列操作。
(5) Map接口
Map接口表示一个键值对映射,存储键和值的关系。Map不继承自Collection接口。常见实现类有:
- HashMap:基于哈希表实现,不保证顺序。
- LinkedHashMap:基于哈希表和链表实现,保持插入顺序。
- TreeMap:基于红黑树实现,键按自然顺序或自定义排序。
6. 集合框架的实现类
Java集合框架提供了许多实现类,帮助开发者根据需求选择最合适的集合类型。常见的实现类有:
- ArrayList:动态数组实现,适合随机访问。
- LinkedList:双向链表实现,适合频繁插入和删除操作。
- HashSet:哈希表实现,元素无序,查找和插入效率高。
- TreeSet:红黑树实现,元素按顺序排列,支持范围查询。
- HashMap:哈希表实现,存储键值对,键唯一。
- TreeMap:红黑树实现,键有序,适合范围查找。
二 Collection集合
2.1数组和集合的区别
-
相同点
都是容器,可以存储多个数据
-
不同点
-
数组的长度是不可变的,集合的长度是可变的
-
数组可以存基本数据类型和引用数据类型
集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
-
2.2 Collection 集合概述和使用
-
Collection集合概述
- 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
- JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现
-
创建Collection集合的对象
- 多态的方式
- 具体的实现类ArrayList
Collection集合常用方法
方法名 | 说明 |
---|---|
boolean add(E e) | 添加元素 |
boolean remove(Object o) | 从集合中移除指定的元素 |
boolean removeIf(Object o) | 根据条件进行移除 |
void clear() | 清空集合中的元素 |
boolean contains(Object o) | 判断集合中是否存在指定的元素 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中元素的个数 |
2.3 Collection集合的遍历
2.3.1 迭代器遍历
-
迭代器介绍
- 迭代器,集合的专用遍历方式
- Iterator iterator(): 返回此集合中元素的迭代器,通过集合对象的iterator()方法得到
-
Iterator中的常用方法
boolean hasNext(): 判断当前位置是否有元素可以被取出
E next(): 获取当前位置的元素,将迭代器对象移向下一个索引位置 -
Collection集合的遍历
public class IteratorDemo1 {public static void main(String[] args) {//创建集合对象Collection<String> c = new ArrayList<>();//添加元素c.add("hello");c.add("world");c.add("java");c.add("javaee");//Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到Iterator<String> it = c.iterator();//用while循环改进元素的判断和获取while (it.hasNext()) {String s = it.next();System.out.println(s);}} }
-
迭代器中删除的方法
void remove(): 删除迭代器对象当前指向的元素
public class IteratorDemo2 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("b");list.add("c");list.add("d");Iterator<String> it = list.iterator();while(it.hasNext()){String s = it.next();if("b".equals(s)){//指向谁,那么此时就删除谁.it.remove();}}System.out.println(list);} }
2.3.2 增强for
-
介绍
- 它是JDK5之后出现的,其内部原理是一个Iterator迭代器
- 实现Iterable接口的类才可以使用迭代器和增强for
- 简化数组和Collection集合的遍历
-
格式
for(集合/数组中元素的数据类型 变量名 : 集合/数组名) {
// 已经将当前遍历到的元素封装到变量中了,直接使用变量即可
}
-
代码
public class MyCollectonDemo1 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");list.add("d");list.add("e");list.add("f");//1,数据类型一定是集合或者数组中元素的类型//2,str仅仅是一个变量名而已,在循环的过程中,依次表示集合或者数组中的每一个元素//3,list就是要遍历的集合或者数组for(String str : list){System.out.println(str);}} }
-
细节点注意:
1.报错NoSuchElementException
2.迭代器遍历完毕,指针不会复位
3.循环中只能用一次next方法
4.迭代器遍历时,不能用集合的方法进行增加或者删除
public class A04_CollectionDemo4 {public static void main(String[] args) {/*迭代器的细节注意点:1.报错NoSuchElementException2.迭代器遍历完毕,指针不会复位3.循环中只能用一次next方法4.迭代器遍历时,不能用集合的方法进行增加或者删除暂时当做一个结论先行记忆,在今天我们会讲解源码详细的再来分析。如果我实在要删除:那么可以用迭代器提供的remove方法进行删除。如果我要添加,暂时没有办法。(只是暂时)*///1.创建集合并添加元素Collection<String> coll = new ArrayList<>();coll.add("aaa");coll.add("bbb");coll.add("ccc");coll.add("ddd");//2.获取迭代器对象//迭代器就好比是一个箭头,默认指向集合的0索引处Iterator<String> it = coll.iterator();//3.利用循环不断的去获取集合中的每一个元素while(it.hasNext()){//4.next方法的两件事情:获取元素并移动指针String str = it.next();System.out.println(str);}//当上面循环结束之后,迭代器的指针已经指向了最后没有元素的位置//System.out.println(it.next());//NoSuchElementException//迭代器遍历完毕,指针不会复位System.out.println(it.hasNext());//如果我们要继续第二次遍历集合,只能再次获取一个新的迭代器对象Iterator<String> it2 = coll.iterator();while(it2.hasNext()){String str = it2.next();System.out.println(str);}}
}
2.3.3 lambda表达式
利用forEach方法,再结合lambda表达式的方式进行遍历
public class A07_CollectionDemo7 {public static void main(String[] args) {/* lambda表达式遍历:default void forEach(Consumer<? super T> action):*///1.创建集合并添加元素Collection<String> coll = new ArrayList<>();coll.add("zhangsan");coll.add("lisi");coll.add("wangwu");//2.利用匿名内部类的形式//底层原理://其实也会自己遍历集合,依次得到每一个元素//把得到的每一个元素,传递给下面的accept方法//s依次表示集合中的每一个数据/* coll.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});*///lambda表达式coll.forEach(s -> System.out.println(s));}
}
三 .List集合
3.1List集合的概述和特点
- List集合的概述
- 有序集合,这里的有序指的是存取顺序
- 用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
- 与Set集合不同,列表通常允许重复的元素
- List集合的特点
- 存取有序
- 可以重复
- 有索引
3.2List集合的特有方法
-
方法介绍
方法名 描述 void add(int index,E element) 在此集合中的指定位置插入指定的元素 E remove(int index) 删除指定索引处的元素,返回被删除的元素 E set(int index,E element) 修改指定索引处的元素,返回被修改的元素 E get(int index) 返回指定索引处的元素 -
示例代码
public class MyListDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");//method1(list);//method2(list);//method3(list);//method4(list);}private static void method4(List<String> list) {// E get(int index) 返回指定索引处的元素String s = list.get(0);System.out.println(s);}private static void method3(List<String> list) {// E set(int index,E element) 修改指定索引处的元素,返回被修改的元素//被替换的那个元素,在集合中就不存在了.String result = list.set(0, "qqq");System.out.println(result);System.out.println(list);}private static void method2(List<String> list) {// E remove(int index) 删除指定索引处的元素,返回被删除的元素//在List集合中有两个删除的方法//第一个 删除指定的元素,返回值表示当前元素是否删除成功//第二个 删除指定索引的元素,返回值表示实际删除的元素String s = list.remove(0);System.out.println(s);System.out.println(list);}private static void method1(List<String> list) {// void add(int index,E element) 在此集合中的指定位置插入指定的元素//原来位置上的元素往后挪一个索引.list.add(0,"qqq");System.out.println(list);} }
3.3List集合的五种遍历方式
- 迭代器
- 列表迭代器
- 增强for
- Lambda表达式
- 普通for循环
代码示例:
//创建集合并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");//1.迭代器
/*Iterator<String> it = list.iterator();while(it.hasNext()){String str = it.next();System.out.println(str);
}*///2.增强for
//下面的变量s,其实就是一个第三方的变量而已。
//在循环的过程中,依次表示集合中的每一个元素
/* for (String s : list) {System.out.println(s);}*///3.Lambda表达式
//forEach方法的底层其实就是一个循环遍历,依次得到集合中的每一个元素
//并把每一个元素传递给下面的accept方法
//accept方法的形参s,依次表示集合中的每一个元素
//list.forEach(s->System.out.println(s) );//4.普通for循环
//size方法跟get方法还有循环结合的方式,利用索引获取到集合中的每一个元素
/*for (int i = 0; i < list.size(); i++) {//i:依次表示集合中的每一个索引String s = list.get(i);System.out.println(s);}*/// 5.列表迭代器
//获取一个列表迭代器的对象,里面的指针默认也是指向0索引的//额外添加了一个方法:在遍历的过程中,可以添加元素
ListIterator<String> it = list.listIterator();
while(it.hasNext()){String str = it.next();if("bbb".equals(str)){//qqqit.add("qqq");}
}
System.out.println(list);
3.4 细节点注意:
List系列集合中的两个删除的方法
1.直接删除元素
2.通过索引进行删除
代码示例:
//List系列集合中的两个删除的方法
//1.直接删除元素
//2.通过索引进行删除//1.创建集合并添加元素
List<Integer> list = new ArrayList<>();list.add(1);
list.add(2);
list.add(3);//2.删除元素
//请问:此时删除的是1这个元素,还是1索引上的元素?
//为什么?
//因为在调用方法的时候,如果方法出现了重载现象
//优先调用,实参跟形参类型一致的那个方法。//list.remove(1);//手动装箱,手动把基本数据类型的1,变成Integer类型
Integer i = Integer.valueOf(1);list.remove(i);System.out.println(list);
四.泛型
在Java中,泛型(Generics) 是一种允许在类、接口和方法中使用类型参数的机制。通过使用泛型,可以实现更加通用且类型安全的代码。泛型的引入主要是为了提供代码的复用性、类型安全性,并且避免了大量的强制类型转换。
4.1 泛型的基本语法
4.1.1泛型类
泛型类是定义时使用了泛型类型的类,它允许在创建对象时指定类型。
public class Box<T> {private T value;public void set(T value) {this.value = value;}public T get() {return value;}
}public class Main {public static void main(String[] args) {Box<Integer> integerBox = new Box<>();integerBox.set(10);System.out.println(integerBox.get()); // 输出 10Box<String> stringBox = new Box<>();stringBox.set("Hello");System.out.println(stringBox.get()); // 输出 Hello}
}
这里的表示一个类型参数,可以在创建Box类的实例时指定类型(如Integer、String等)。这样,Box类就可以被复用,而不需要为每种类型写多个类。
4.1.2 泛型方法
泛型方法是定义时方法的参数或者返回值使用了泛型类型。
public class GenericMethodExample {// 泛型方法public static <T> void printArray(T[] array) {for (T element : array) {System.out.println(element);}}public static void main(String[] args) {Integer[] intArray = {1, 2, 3, 4};String[] stringArray = {"Apple", "Banana", "Cherry"};printArray(intArray); // 输出 1 2 3 4printArray(stringArray); // 输出 Apple Banana Cherry}
}
这里的声明的是方法的类型参数,表示printArray方法可以接受任何类型的数组。
4.1.3 泛型接口
泛型接口允许接口的方法使用泛型类型。
interface Pair<K, V> {K getKey();V getValue();
}public class KeyValuePair<K, V> implements Pair<K, V> {private K key;private V value;public KeyValuePair(K key, V value) {this.key = key;this.value = value;}public K getKey() {return key;}public V getValue() {return value;}
}public class Main {public static void main(String[] args) {Pair<String, Integer> pair = new KeyValuePair<>("Age", 25);System.out.println("Key: " + pair.getKey()); // 输出 Key: AgeSystem.out.println("Value: " + pair.getValue()); // 输出 Value: 25}
}
这个例子展示了一个泛型接口Pair,其中K和V分别是键和值的类型。
4.2 泛型的边界
你可以使用通配符(?)来限制泛型类型的范围,这叫做泛型边界。
4.2.1 上限通配符(extends)
上限通配符? extends T表示类型参数必须是T或T的子类。
public static void printNumbers(List<? extends Number> list) {for (Number number : list) {System.out.println(number);}
}public static void main(String[] args) {List<Integer> intList = List.of(1, 2, 3);List<Double> doubleList = List.of(1.1, 2.2, 3.3);printNumbers(intList); // 输出 1 2 3printNumbers(doubleList); // 输出 1.1 2.2 3.3
}
这里,? extends Number表示printNumbers方法可以接受任何Number类的子类,如Integer、Double等。
4.2.2 下限通配符(super)
下限通配符? super T表示类型参数必须是T或T的父类。
public static void addNumbers(List<? super Integer> list) {list.add(10); // 可以安全地添加Integer类型
}public static void main(String[] args) {List<Number> numberList = new ArrayList<>();addNumbers(numberList);System.out.println(numberList); // 输出 [10]
}
这里,? super Integer表示addNumbers方法可以接受Integer或Integer的父类的集合。
4.3 泛型的优点
- 类型安全:泛型提供了类型检查,使得你在编译时可以检查类型的一致性,从而避免运行时的ClassCastException。
- 代码重用:泛型允许你编写可重用的代码,不需要为不同的类型编写多个类。
- 更简洁:避免了强制类型转换,让代码更加清晰简洁。
4.4泛型的类型擦除
Java的泛型是通过类型擦除(Type Erasure)实现的,这意味着在编译时,泛型类型信息会被擦除,转而用Object来替代。由于类型擦除,泛型类和泛型方法在运行时无法直接访问到具体的泛型类型。
例如,下面的代码:
Box<Integer> box = new Box<>();
box.set(10);
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
在编译后,Box 和 Box 会被擦除为 Box,因此你无法通过反射等方式获取到Integer或String的具体类型。
五 Set集合
在 Java 中,Set 是一个集合接口,它继承自 Collection 接口,表示不允许重复元素的集合。Set 中的元素是无序的(即没有索引)。与列表(List)不同,Set 集合不允许包含重复的元素。
5.1Set集合概述和特点
- 不可以存储重复元素
- 没有索引,不能使用普通for循环遍历
5.2Set集合的使用【应用】
存储字符串并遍历
public class MySet1 {public static void main(String[] args) {//创建集合对象Set<String> set = new TreeSet<>();//添加元素set.add("ccc");set.add("aaa");set.add("aaa");set.add("bbb");// for (int i = 0; i < set.size(); i++) {
// //Set集合是没有索引的,所以不能使用通过索引获取元素的方法
// }//遍历集合Iterator<String> it = set.iterator();while (it.hasNext()){String s = it.next();System.out.println(s);}System.out.println("-----------------------------------");for (String s : set) {System.out.println(s);}}
}
5.3 常见的 Set 接口实现有:
- List item
HashSet:
- 基于哈希表实现,元素是无序的,插入的顺序不一定被保留。
- 查找和插入操作的时间复杂度为 O(1)(在理想情况下)。
LinkedHashSet:
- 基于哈希表实现,元素的插入顺序被保留。
- 性能相较于 HashSet 会稍差一些,因为要维护元素的插入顺序。
TreeSet:
- 基于红黑树实现,元素会按照自然顺序(或者通过构造时提供的 Comparator)进行排序。
- 查找、插入、删除操作的时间复杂度为 O(log n)。
5.4 常用的 Set 方法
- add(E e):添加元素,返回 true 如果集合中没有该元素。
- remove(Object o):删除指定元素,返回 true 如果成功删除。
- contains(Object o):检查集合中是否包含指定元素。
- size():返回集合中元素的数量。
- isEmpty():判断集合是否为空。
- clear():清空集合中的所有元素。
- iterator():返回集合的迭代器,用于遍历集合。
import java.util.*;public class SetExample {public static void main(String[] args) {// 创建一个 HashSet 实例Set<String> set = new HashSet<>();// 添加元素set.add("Apple");set.add("Banana");set.add("Orange");// 添加重复元素,不会被添加set.add("Apple");// 打印集合内容System.out.println("Set contains: " + set);// 检查元素是否存在System.out.println("Contains 'Banana': " + set.contains("Banana"));// 删除元素set.remove("Banana");// 打印删除后的集合System.out.println("After removal: " + set);// 遍历集合for (String fruit : set) {System.out.println(fruit);}}
}
相关文章:
java 集合
Java集合框架(Java Collections Framework)是一个强大的工具库,旨在简化数据存储和操作的任务。它提供了一组接口、类和算法,帮助开发者高效地管理数据,如列表、集合和映射。下面是Java集合框架的详细介绍:…...
Java常见排序算法及代码实现
1、选择排序算法 选择排序(Selection Sort)是一种简单直观的排序算法,它的工作原理是每次从未排序部分选择最小(或最大)的元素,将其放到已排序部分的末尾。 2、冒泡排序算法 冒泡排序(Bubble…...
130,[1] 攻防世界 very_easy_sql
进入靶场 典型SQL注入页面 先查看源码 访问 试试http://127.0.0.1/ 还尝试了其他都是nonono 回归第一个登录页面 提交的内容不在url处显示,反而第二个url页面会在url处显示 明白第一个页面是通过post方式提交,反正没得到什么信息,去抓…...
Spring Boot从入门到精通:核心知识点+实战指南
目录 一、Spring Boot 是什么?为什么它如此流行? 二、快速创建你的第一个Spring Boot应用 2.1 使用Spring Initializr生成项目 2.2 核心代码示例 三、深度解析Spring Boot核心机制 3.1 自动配置原理揭秘 3.2 自定义Starter实战 四、生产环境必备…...
深入探索现代CSS:从基础到未来趋势
引言:CSS的进化之路 CSS(层叠样式表)自1996年诞生以来,已从简单的样式描述语言发展为构建现代Web体验的核心技术。截至2023年,超过98%的网站使用CSS3技术,其发展历程见证了Web从静态文档到富交互应用的蜕变…...
python-leetcode 23.反转链表
题目: 给单链表的头节点,反转链表,并返回反转后的链表。 方法一:迭代 在遍历链表时,将当前节点的next指针改为指向前一个节点。由于节点没有引用其前一个节点,因此要先存储前一个节点,在更改引…...
Foundation CSS 可见性
Foundation CSS 可见性 引言 在网页设计中,CSS可见性是一个至关重要的概念。它决定了元素在网页上是否可见,以及如何显示。Foundation CSS 是一个流行的前端框架,它提供了丰富的工具和组件来帮助开发者构建响应式和可访问的网页。本文将深入探讨 Foundation CSS 中的可见性…...
DeepSeek模拟阿里面试——java基本语法
为了全面准备阿里Java高级程序员的面试,以下是针对数据类型和变量、运算符、流程控制的系统性复习和准备策略: 数据类型和变量 基本数据类型 整数类型:byte(1字节)、short(2字节)、int…...
大模型基本原理(二)——ChatGPT的工作原理
如何得到一个ChatGPT? 1、无监督预训练:通过大量的文本数据集进行无监督训练,得到一个基座模型(只会续写文本) 2、监督微调:通过一些人类撰写的高质量对话数据对基座模型进行监督微调,得到一个…...
TensorRT 8.6.1教程1-TensorRT简介
区分计算节点和数据节点 视频 TensorRT 教程 | 基于 8.6.1 版本 | 第一部分_哔哩哔哩_bilibili cookbook...
Seaweedfs(master volume filer) docker run参数帮助文档
文章目录 进入容器后执行获取weed -h英文中文 weed server -h英文中文 weed volume -h英文中文 关键点测试了一下,这个-volume.minFreeSpace string有点狠,比如设置值为10(10%),它直接给系统只留下10%的空间࿰…...
深度求索(DeepSeek)的AI革命:NLP、CV与智能应用的技术跃迁
Deepseek官网:DeepSeek 引言:AI技术浪潮中的深度求索 近年来,人工智能技术以指数级速度重塑全球产业格局。在这场技术革命中,深度求索(DeepSeek)凭借其前沿的算法研究、高效的工程化能力以及对垂直场景的…...
探索RDMA技术:从基础到实践
1. 引言 在当今的高性能计算(HPC)和数据中心领域,数据传输的效率和速度至关重要。RDMA(Remote Direct Memory Access,远程直接内存访问)技术作为一种高效的网络通信机制,能够显著减少数据传输的延迟和CPU负载。本文将从基础到实践,详细介绍RDMA技术及其编程模型,帮助…...
Excel 笔记
实际问题记录 VBA脚本实现特殊的行转列 已知:位于同一Excel工作簿文件中的两个工作表:Sheet1、Sheet2。 问题:现要将Sheet2中的每一行,按Sheet1中的样子进行转置: Sheet2中每一行的黄色单元格,为列头。…...
Flutter编译运行android问题之JVM版本问题
错误1: FAILURE: Build failed with an exception. * What went wrong: Execution failed for task :audioplayers_android:compileDebugKotlin. > Inconsistent JVM-target compatibility detected for tasks compileDebugJavaWithJavac (1.8) and compileDebug…...
自动化遇到的问题记录(遇到问题就更)
总结回归下自己这边遇到的一些问题 “EOF错误”,获取不到csv里面的内容 跑多csv文件里的场景,部分场景的请求值为 1、检查csv文件里不能直接是[]开头的参数,把[]改到ms平台的请求参数里 2、有时可能是某个参数值缺了双引号的其中一边 met…...
解决 Flutter Device Daemon 启动失败问题的实践记录
解决 Flutter Device Daemon 启动失败问题的实践记录 最近在使用 Flutter 开发时踩了一个坑。看似是个小问题,但折腾了好久,最终通过日志分析和查阅资料才找到了解决办法。这里记录一下整个问题的排查过程,希望能帮助到遇到类似问题的小伙伴…...
中国通信企业协会 通信网络安全服务能力评定 证书使用说明
中国通信企业协会颁发的通信网络安全服务能力资格证书,是证明证书持有单位符合通信网络安全服务相应能力准则要求。证书持有单位在使用中国通信企业协会颁发的证书时,应遵守以下规定: 评定证书 证书持有单位必须遵守《中国通信企业协会通信网…...
《我在技术交流群算命》(三):QML的Button为什么有个蓝框去不掉啊(QtQuick.Controls由Qt5升级到Qt6的异常)
有群友抛出类似以下代码和运行效果截图: import QtQuick import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Button{anchors.centerIn: parentwidth: 100height: 40background: Rectangle {color: "red…...
多项式插值(数值计算方法)Matlab实现
多项式插值(数值计算方法)Matlab实现 一. 原理介绍二. 程序设计1. 构建矩阵2. 求解矩阵方程3. 作出多项式函数4. 绘制插值曲线5. 完整代码 三. 图例 一. 原理介绍 关于插值的定义及基本原理可以参照如下索引 插值原理(数值计算方法ÿ…...
【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯语言模型的发展历程:从统计方法到大规模预训练模型的演化1 统计语言模型(Statistical Language Model, SLM):统…...
[python]如何安装whl包并解决依赖关系(详细)
一、什么是whl文件? whl是一种预编译的二进制包文件,它主要用于安装python库。简单来讲whl就是一种已经编译好的python库文件。我们可以使用whl包来安装python库。 二、我们为什么需要使用whl文件来安装python库? 有的小伙伴可能会疑惑&…...
Windows中使用Docker安装Anythingllm,基于deepseek构建自己的本地知识库问答大模型,可局域网内多用户访问、离线运行
文章目录 Windows中使用Docker安装Anythingllm,基于deepseek构建自己的知识库问答大模型1. 安装 Docker Desktop2. 使用Docker拉取Anythingllm镜像2. 设置 STORAGE_LOCATION 路径3. 创建存储目录和 .env 文件.env 文件的作用关键配置项 4. 运行 Docker 命令docker r…...
用Kibana实现Elasticsearch索引的增删改查:实战指南
在大数据时代,Elasticsearch(简称 ES)和 Kibana 作为强大的数据搜索与可视化工具,受到了众多开发者的青睐。Kibana 提供了一个直观的界面,可以方便地对 Elasticsearch 中的数据进行操作。本文将详细介绍如何使用 Kiban…...
AI前端开发的国际化发展机遇:ScriptEcho助力全球化布局
在全球化的今天,互联网应用已不再局限于单一市场。高效便捷的前端开发方案成为企业拓展国际市场的关键。得益于人工智能技术的飞速发展,AI代码生成器 正在深刻改变前端开发模式,为国际化应用开发带来前所未有的机遇。然而,国际化开…...
本地基于GGUF部署的DeepSeek实现轻量级调优之一:提示工程(Prompt Engineering)(完整详细教程)
前文,我们在本地windows电脑基于GGUF文件,部署了DeepSeek-1.5B模型,如果想自行对模型进行训练,离线模式下加载本地的DeepSeek模型进行训练时,是不能直接使用GGUF文件进行训练。 请参照我的文章在本地部署好模型之后再继…...
基于 GEE 计算研究区年均地表温度数据
目录 1 代码解析 2 完整代码 3 运行结果 1 代码解析 (1)定义研究区: // 研究区的范围需要自己提前上传 var dataset table;// 将研究区显示在中心,后面的数字为缩放等级,范围从1 - 24 Map.centerObject(dataset,…...
编程语言的深度剖析:从语法到性能优化
引言 随着软件开发的不断进化,编程语言的选择对项目的成功与否具有关键影响。今天的开发者面临着丰富多样的编程语言选择:每一种语言都有独特的优势、特性和适用场景。然而,语言的设计理念、运行机制和优化技巧背后的技术细节却常常被忽视。本…...
设计模式-结构型-外观模式
在软件开发中,随着功能的不断迭代,系统会变得越来越复杂,模块之间的依赖关系也会越来越深。这种复杂性会导致代码难以理解、维护和扩展。而外观模式(Facade Pattern)正是为了解决这一问题而生的。 一、外观模式简介 …...
uniapp中对于文件和文件夹的处理,内存的查询
目录 移动文件到指定文件夹 新增本地文件夹 设定本地文件过期时间,清除超时文件,释放内存 操作本地文件之----删除 uniapp获取设备剩余存储空间的方法 读取本地文件夹下的文件 移动文件到指定文件夹 function moveTempFile(tempFilePath, targetFo…...
计算机网络和操作系统常见面试题目(带脑图,做了延伸以防面试官深入提问)
呜哦~~(✪▽✪)曼波~~~~ 今天我们来聊聊计算机网络和操作系统的面试题目吧!这些题目是面试中经常遇到的,曼波觉得掌握它们对面试非常有帮助哦!(๑✧◡✧๑) --- 1. 计算机网络面试题目 1.1 OSI 七层模型是什么? 回答ÿ…...
C++ Primer 条件语句
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试
前言 讲了FastJson反序列化的原理和利用链,今天讲一下Shiro的反序列化利用,这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化,之前也是讲过的,打开我们写过的serialization_demo。代码也很简单&…...
16.React学习笔记.React更新机制
一. 发生更新的时机以及顺序## image.png props/state改变render函数重新执行产生新的VDOM树新旧DOM树进行diff计算出差异进行更新更新到真实的DOM 二. React更新流程## React将最好的O(n^3)的tree比较算法优化为O(n)。 同层节点之间相互比较,不跨节点。不同类型的节…...
React使用 useImperativeHandle 自定义暴露给父组件的实例方法(包括依赖)
关键词 React useImperativeHandle 摘要 useImperativeHandle 是 React 提供的一个自定义 Hook,用于在函数组件中显式地暴露给父组件特定实例的方法。本文将介绍 useImperativeHandle 的基本用法、常见应用场景,以及如何处理其依赖项,以帮…...
Vue 过渡动画实现全解析:打造丝滑交互体验
Vue 过渡动画实现全解析:打造丝滑交互体验 在当今竞争激烈的 Web 开发领域,用户体验已成为衡量项目成功与否的关键指标。过渡动画作为提升用户体验的利器,能让应用的交互更加丝滑流畅,给用户带来愉悦的使用感受。在 Vue.js 框架中…...
从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)
个人主页:chian-ocean 前言: 随着人工智能技术的迅速发展,大语言模型在各个行业中得到了广泛应用。DeepSeek 作为一个新兴的 AI 公司,凭借其高效的 AI 模型和开源的优势,吸引了越来越多的开发者和企业关注。为了更好地…...
Render上后端部署Springboot + 前端Vue 问题及解决方案汇总
有一个 Vue 前端 和 Spring Boot 后端的动态网页游戏,当前在本地的 5173 端口和运行。你希望生成一个公开链接,让所有点击链接的人都能访问并玩这个游戏。由于游戏原本需要在本地执行 npm install 后才能启动,你现在想知道在部署时是选择 Ren…...
Linux——信号的保存与处理
前言:本文主要介绍信号的保存与处理过程。 一、信号阻塞与信号底层逻辑 在linux下面的进程控制块(PCB),存在一个pending变量用于存放接收到的信号,该变量有32位,变量的位代表信号的类别,变量的值代表是否收到信号。进程会根据该变…...
【deepseek-r1本地部署】
首先需要安装ollama,之前已经安装过了,这里不展示细节 在cmd中输入官网安装命令:ollama run deepseek-r1:32b,开始下载 出现success后,下载完成 接下来就可以使用了,不过是用cmd来运行使用 可以安装UI可视化界面&a…...
Docker Desktop Windows 安装
一、先下载Docker desktop WIndows 下载地址 二、安装 安装超简单 一路 下一步 三、安装之后,桌面会出现一个 小蓝鲸图标,打开它 》更新至最新版本,不然小蓝鲸打开,一会就退出了。 》wsl --update (这个有时比较慢…...
pytorch环境已安装库汇总
简略版总计:python pytorch nb_conda(Jupyter Notebook的插件) 创建环境conda create -n pytorch python3.8 conda install nb_conda命令...
基于Django以及vue的电子商城系统设计与实现
基于Django以及vue的电子商城系统设计与实现 引言 随着电子商务的快速发展,越来越多的企业和个人选择搭建线上商城,以提供更加便捷的购物体验。本文基于Python开发了一套电子商城系统,后端采用Django框架,前端使用Vue.js&#x…...
Spring Boot + ShardingSphere 踩坑记
最近在准备秋招,偷了个轮子项目之后想改个分表,于是有了这篇文章。 省流:请使用shardingsphere-jdbc 5.5.2,并根据官方5.5.2版本文档进行配置,不要使用starter。此外,如果希望使用INTERVAL分片算法&#x…...
【算法学习】DFS与BFS
目录 一,深度优先搜索 1,DFS 2,图的DFS遍历 (1),递归实现(隐士栈) (2),显示栈实现(非递归) 二,广度优先搜索 1,BFS 2,图的BF…...
从零到一:开发并上线一款极简记账本小程序的完整流程
从零到一:开发并上线一款极简记账本小程序的完整流程 目录 前言需求分析与功能设计 2.1 目标用户分析2.2 核心功能设计2.3 技术栈选择 开发环境搭建 3.1 微信开发者工具安装与配置3.2 项目初始化3.3 版本控制与协作工具 前端开发 4.1 页面结构与布局4.2 组件化开发…...
centos安装Nexus Repository OSS(Maven私服)
1. 下载链接:https://help.sonatype.com/en/download.html 2. 注意页面下载页面中的要求:JDK17(启动时提示最低JDK1.8最高JDK17,但是使用JDK1.8无法正常启动) 3. mkdir /opt/nexus 将压缩包上传到该目录并解压。 tar …...
Unity使用iTextSharp导出PDF-02基础结构及设置中文字体
基础结构 1.创建一个Document对象 2.使用PdfWriter创建PDF文档 3.打开文档 4.添加内容,调用文档Add方法添加内容时,内容写入到输出流中 5.关闭文档 using UnityEngine; using iTextSharp.text; using System.IO; using iTextSharp.text.pdf; using Sys…...
CSS 属性选择器详解与实战示例
CSS 属性选择器是 CSS 中非常强大且灵活的一类选择器,它能够根据 HTML 元素的属性和值来进行精准选中。在实际开发过程中,属性选择器不仅可以提高代码的可维护性,而且能够大大优化页面的样式控制。本文将结合菜鸟教程的示例,从基础…...
【漫话机器学习系列】088.常见的输出层激活函数(Common Output Layer Activation Functions)
在神经网络中,输出层(Output Layer) 的激活函数(Activation Function)直接决定了模型的输出形式,并影响损失函数的选择及训练效果。不同的任务类型(如分类或回归)需要使用不同的激活…...