搭建网站的软件/seo顾问张智伟
Java题集练习5(集合)
1.三种集合差别,集合类都是什么,数据结构是什么,都什么时候用
三者关系
Set集合
Set接口是Collection接口的一个子接口是无序的,set中不包含重复的元素,也就是说set中不存在两个这样的元素a1.equals(a2)结果为true。又因为Set接口提供的数据结构是数学意义上的集合概念的抽象,因此他支持对象的添加和删除。
- TreeSet:在集合中以升序对对象排序的集的实现,这意味着从一个TreeSet对象获得第一个迭代器将按照升序来提供对象,TreeSet类使用了一个TreeMap
List集合
List接口继承了Collection接口以定义一个允许重复项的有序集合。
一般有2种List,一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,他并不是为了快速随机访问而设计的,而是具有一套更通用的方法
List最重要的特点就是:它保证维护元素特定的顺序,List为Collection添加了很多方法,使得能够向List中间插入和移除元素。
Map集合
Map接口不是Collection接口的继承,而是从自己的用于维护键值对关联的接口层次结构入手,按定义,该接口描述了从不重复的键到值的映射。
一般可以分为三组操作:改变,查询和提供可选视图
HashMap:
实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。
数据结构
数据结构,指计算机存储,组织数据的方式
2.Map集合:主要接口:Map 、Map.Entry 、 AbstractMap、SortedMap分别有什么用途
首先我们来看一下Map的族谱
Map.Entry 接口
Map
的entrySet()
方法返回一个实现Map.Entry
接口的对象集合。集合中每个对象都是底层Map
中一个特定的键值对。
通过这个集合迭代,您可以获得每一条目的键或值并对值进行更改。但是,如果底层Map
在Map.Entry
接口的setValue()
方法外部被修改,此条目集就会变得无效,并导致迭代器行为未定义。
AbstractMap接口
- 不可序列化:被static修饰,被transient修饰的字段
AbstractMap 是Map接口的 实现类之一,也是HashMap、TreeMap、ConcurrentHashMap 等的父类,它提供了Map 接口中方法的基本实现
抽象方法entrySet()
AbstractMap类中有一个唯一的抽象方法 entrySet() ,类中对集合视图操作的很多方法都是依赖这个抽象函数的,它返回一个保存所有 key-value 映射的Set。
当我们要实现一个不可变的 Map 时,只需要继承 AbstractMap 类并实现 entrySet() 即可。
如果想要实现一个可变的 Map ,我们还需要重写 put() 方法,因为 AbstractMap 类中默认不支持 put实现,子类必须重写该方法的实现,否则会抛出异常:
public V put(K key, V value) {throw new UnsupportedOperationException();
}
SortedMap
SortedMap接口:SortedMap是一个接口,继承自Map接口,它定义了对键值对按照键的自然顺序或自定义顺序进行排序的功能。SortedMap中的键值对是按照键的顺序排列的,因此可以根据键的顺序进行范围查找和遍历操作。SortedMap接口提供了一系列的导航方法和有序操作方法。
SortedMap接口的常用实现类是TreeMap,使用的是红黑树数据结构来实现有序的映射,TreeMap根据键的自然顺序或自定义比较器对键进行排序,并保持键值对的有序性
SortedMap的优缺点
优点
-
有序性
-
提供子映射:SortedMap提供了subMap方法,可以获取原有映射的子映射,方便进行范围操作
-
可自定义排序:SortedMap可以根据自然排序或自定义比较器对键进行排序,灵活性较强
缺点
-
内存占用:相比HashMap,SortedMap需要额外的内存来维护有效性,因此可能会占用较多的内存空间
-
插入和删除的性能较低:由于需要维护有效性,会略微降低性能
使用场景
-
当需要按照键的排序进行范围查找或遍历操作时
-
当需要根据键的顺序对映射进行排序时
-
当需要获取子映射进行范围操作时
3.hashset为什么要重写hashcode和equals方法?
只有两个方法都被重写才能判断两个值是否是重复的,只要有任何一个方法没有被重写,都不能判断两个值是否是重复的
4.Treeset两种实现方式,在哪用到过
自然排序(默认排序)
自然排序是TreeSet的默认排序方式,他通过在自定义的类中使用Comparable接口,重写里面的compareTo方法,就可以使TreeSet按照你所重写的方法内的规则进行排序
比较器排序
比较器排序是TreeSet的另一种排序方式,它通过TreeSet的构造方法传入一个匿名内部类的比较器给TreeSet,在内部类中定义比较排序规则给TreeSet使用
总结
1 TreeSet是通过二叉树实现的,TreeSet中的数据是自动排序的,不允许放入null值!
2 TreeSet支持两种排序方式自然排序和比较器排序,默认方式是自然排序
5.红黑树原理
红黑树的特性
(1)每个节点或者是黑色,或者是红色
(2)根节点是黑色
(3)每个叶子节点(NIL)是黑色
(4)如果一个节点是红色的,则它的子节点必须是黑色的
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
注意
-
特性3中的叶子结点,只能是为空的结点
-
特性5 ,确保没有一条路径会比其他路径长处两倍,所以,红黑树相当于接近平衡的二叉树
红黑树的应用
红黑树的应用及其广泛,它主要用来存储有序的数据,他的时间复杂度是O(logn),效率极其的高,例如Java中的TreeSet和TreeMap
红黑树的时间复杂度定理
定理:一颗含有n个节点的红黑树高度至多为2log(n+1)
红色节点规则
不能有两个相邻的红色节点,这个规则确保了书的红色平衡,即红色节点在树中分布均匀
插入操作
当插入一个新节点时,首先按照二叉搜索树的插入规则将节点插入到合适的位置,并将节点标记为红色。然后,根据红黑树的规则进行必要的调整,以保持红黑树的性质。调整包括以下几种情况:
(1)变色:如果父节点和叔节点都是红色,将父节点和叔节点变为黑色,祖父节点变为红色。
(2)旋转:如果父节点是红色,但叔节点是黑色或缺失(NIL节点),且新节点是父节点的右子节点,或者父节点是祖父节点的左子节点且新节点是父节点的左子节点,进行相应的旋转操作来调整节点位置。
删除操作
当删除一个节点时,首先按照二叉搜索树的删除规则删除节点,并用其后继节点或前驱节点来替代被删除的节点。然后,根据红黑树的规则进行必要的调整,以保持红黑树的性质。调整包括以下几种情况:
(1)兄弟节点为红色:通过旋转操作将兄弟节点变为黑色,然后重新调整。
(2)兄弟节点为黑色且其子节点都为黑色(包括NIL节点):将兄弟节点变为红色,然后将当前节点上移作为新的当前节点。
(3)兄弟节点为黑色且至少有一个子节点为红色:通过旋转操作调整节点位置。
通过这些规则和调整操作,红黑树保持了平衡性,确保了树的高度始终保持在较小的范围内,使得插入、删除和查找操作的时间复杂度保持在O(log n)级别。这使得红黑树在许多应用中成为一种高效的数据结构选择,如C++ STL中的map和set,Linux系统的虚拟内存的管理就是基于红黑树实现的。
6.ArrayList和LinkedList各自什么时候用
-
ArrayList:由数组实现的List,允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。
-
LinkedList:对顺序访问进行了优化,向List中间插入与删除的开销并不大,随机访问则相对较慢,(使用ArrayList代替)还有下列方法:addFirst(),addLast(),getFirst(),getLast(),removeFirst(),romoveLast().这些方法使得LinkedList可以当作堆栈,队列和双向队列使用。
7.Map两种解析方式
Map中键值对的两种取出方式
- Set keySet
将map中所有的键存入到set集合,因为set内部具有迭代器,可以根据迭代器取出所有的键,在调用get方法获取每个键对应的值
- Set<>Map.entry<K,V>> entrySet
将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是Map.entry,Entry其实就是Map中的一个static内部接口,为什么要定义在内部呢?因为只有有了Map集合,有了键值对,才会有键值的映射关系;关系属于Map集合中的一个内部事物,而且该事物可以直接访问Map集合中的元素
8.迭代器模式
定义
迭代器模式为遍历不同的容器结构提供统一的接口,提供一种方法顺序访问聚合对象中的各个元素,而又不暴露聚合对象内部的表示,迭代器模式的核心思想是数据的存储和遍历分离开来,同其他设计模式类似,迭代器的分离操作的优缺点共存
- 优点
聚合对象只负责存储,遍历由迭代器完成,可以将聚合对象保护起来,外部用户使用只需要调用迭代器就可以
- 缺点
遍历操作从聚合对象中剥离出去,由单独的迭代器类完成,这会增加类的数量,进而增加系统的复杂性
模式结构
迭代器模式主要包含以下角色:
1 抽象迭代器:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
2 具体迭代器:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
3 抽象聚合:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
4 具体聚合:实现抽象聚合类,返回一个具体迭代器的实例。
这四个结构的关系如下图所示
适用场景
顾名思义,迭代器用于迭代聚合数据类型,java中的聚合数据类型实际是指集合框架。集合框架中广泛使用迭代器模式。
由于java的集合框架提供的功能基本满足日常开发需要,一般不会在设计新的容器类,也就不会实现对应的迭代器。若需要自定义实现聚合类型,则同样需要提供该集合的迭代器。
代码实践
迭代器模式的结构比较简单,根据模式结构创建对应的类即可,为突出重点,不适用泛型,直接假设聚合对象中存储的是Student类,因此只需要创建五个类即可
抽象迭代器接口
/**集合迭代器接口该类定义了两个实现迭代操作的两个关键方法*/
public interface AggregateIterator {Student nextStudent();boolean isLastStudent();
}
具体迭代器实现类
/**学生集合类的迭代器的实现接口*/
public class StudentAggregateIteratorImpl implements AggregateIterator {private List<Student> studentList;int position;Student student;public StudentAggregateIteratorImpl(List<Student> studentList){this.studentList = studentList;}@Overridepublic Student nextStudent() {student = studentList.get(position);position++;return student;}@Overridepublic boolean isLastStudent() {return position < studentList.size();}
}
抽象聚合接口
/**学生集合接口,定义存储Student类的接口*/
public interface StudentAggregate {//添加学生方法void addStudent(Student student);//删除学生方法void removeStudent(Student student);//获取迭代器方法AggregateIterator getStudentIterator();
}
具体的聚合实现类
/**学生集合接口实现类*/
public class StudentAggregateImpl implements StudentAggregate{private List<Student> studentList;public StudentAggregateImpl(){this.studentList = new ArrayList<Student>();}//实现添加学生方法@Overridepublic void addStudent(Student student) {studentList.add(student);}//实现删除学生方法@Overridepublic void removeStudent(Student student) {studentList.remove(student);}//返回一个迭代器实例@Overridepublic AggregateIterator getStudentIterator() {return new StudentAggregateIteratorImpl(studentList);}
}
存储元素Student类
/**学生类*/
public class Student {private String name;public Student(String name){this.name = name;}public String getName(){return this.name;}
}
9.Collections和Collection的差别
Collection
Collection是集合类的上层接口,本身是一个Interface,里面包含了一些集合的基本操作
Collection接口是Set接口和List接口的父接口
Collections
Collections是一个集合框架的帮助类,里面包含一些对集合的排序,搜索以及序列化的方法
最根本的是Collections是一个类,而Collection是一个接口
10.Collections类常用的方法及demo
Collections常用的静态方法
-
sort()排序方法
-
binarySearch()二分查找方法
-
max()/ min()查找最大值或最小值方法
-
reverse()反转元素顺序方法
代码演示
public class CollectionsUseDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("ant");list.add("bear");list.add("pen");list.add("zoo");list.add("apple");list.add("candy");list.add("zookeeper");System.out.println("*************");for (String s : list) {System.out.println(s);}System.out.println("**************");Collections.sort(list);for (String s : list) {System.out.println(s);}//查找集合元素的最大、最小值System.out.println("集合中的最大元素:" + Collections.max(list));System.out.println("集合中的最小元素:" + Collections.min(list));System.out.println("***************");//查找集合中的特定元素System.out.println(Collections.binarySearch(list, "candy"));//反转集合元素的顺序Collections.reverse(list);for (String s : list) {System.out.println(s);}}
}
Collections实现Comparable接口自定义比较规则
Collections可以实现Comparable接口并重写接口中的compareTo()方法来自定义比较规则比较元素的大小
* @Description//学生类型:学号、姓名和性别*/
public class Student implements Comparable {private int no;private String sex;private String name;public Student() {}public Student(int no, String name, String sex) {this.no = no;this.sex = sex;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}//重写方法:定义学生对象的比较规则//比较规则:按学号比,学号大的同学往后排,学号小的同学往前排//比较对象:当前学生对象(this)和Object o@Overridepublic int compareTo(Object o) {Student student = (Student) o;if (this.no == student.no) {return 0;//学号相同,两个学生对象一般大} else if (this.no > student.no) {return 1;//当前学生对象学号大于比较的学生对象学号} else {return -1;//当前学生对象学号小于比较的学生对象学号}}
}
11.数组和List相互转换的方法及demo
数组转List
我们可以使用Arrays类中的asList()方法来将数组转换为集合。注意:基本类型数组转换为List集合需要使用包装类
List转数组
使用toArray()方法可以使集合转换为Object类型的数组
代码演示
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class TransForm {public static void main(String[] args) {//集合转化为数组List list = new ArrayList();list.add("123");System.out.println(list);Object[] arr = list.toArray();for (Object i:arr) {System.out.println(i);}//数组转化为集合,基本类型数组转换为集合时需要使用包装类Integer[] integers = {1,2,3,4,5};List intList = Arrays.asList(integers);System.out.println(intList);}
}
12.遍历数据库结果集时会遇到的问题
我们在遍历数据库的结果集合时,可能会有如下代码书写形式:
ArrayList<user> al = new ArrayList<user>();
User user =new User();
for()
{
user.setName();
.....
...... al.add(user);
}
这种写法将会导致所有用户对象共享同一个 User
实例。每次循环时,都会修改同一个对象的属性,然后将其添加到列表中。最终的结果将是列表中只有一个对象的不同版本。
问题分析
每次循环时,user
对象的引用始终指向的是同一个对象实例。因此,每次调用 al.add(user);
都是在向列表中添加同一个对象。这将导致列表中所有的元素都是最后一个用户的实例
内存图示例
1 初始化阶段
+-------------------+ +---------------------+
| ArrayList<User> al| --> | null |
| | +---------------------+
+-------------------++---------------------+
| User user | --> | null |
+---------------------+ +---------------------+
2 第一次循环
+-------------------+ +---------------------+
| ArrayList<User> al| --> | [User@Address] |
| | +---------------------+
+-------------------++---------------------+ +--------------+
| User user | --> [User@Address] | name="Alice"
+---------------------+ +--------------+
3 第二次循环
+-------------------+ +---------------------+
| ArrayList<User> al| --> | [User@Address] |
| | +---------------------+
+-------------------++---------------------+ +--------------+
| User user | --> [User@Address] | name="Bob"
+---------------------+ +--------------+
4 第三次循环
+-------------------+ +---------------------+
| ArrayList<User> al| --> | [User@Address] |
| | +---------------------+
+-------------------++---------------------+ +--------------+
| User user | --> [User@Address] | name="Charlie"
+---------------------+ +--------------+
最终,al
中的所有元素都将是指向同一个 User
对象的引用,而该对象的属性最后一次被修改为 name="Charlie"
正确做法
为了避免这个问题,应该在每次循环时都创建一个新的User实例
ArrayList<User> al = new ArrayList<>();
for (...) {User user = new User();user.setName(...);...al.add(user);
}
这样每次循环时都会创建一个新的 User
实例,从而保证每个用户对象都是独立的。
13.线程安全的集合有哪些,线程安全的list的特点
在Java中,线程安全的集合是指在多线程环境下可以直接使用而不需要额外的同步机制(如synchronized
关键字或ReentrantLock
等)就能保证数据一致性、完整性的集合类。Java提供了多种线程安全的集合实现,适用于不同的场景。
线程安全的集合
-
Vector
:这是Java中最古老的线程安全的集合之一,它的方法都是同步的。但是由于Vector
在JDK 1.2之后已经不再推荐使用,因为它提供的同步机制不够灵活,效率较低。 -
LinkedList
的线程安全版本:可以通过Collections.synchronizedList(new LinkedList<T>())
创建一个线程安全的LinkedList
。 -
ArrayList
的线程安全版本:同样,可以使用Collections.synchronizedList(new ArrayList<T>())
创建一个线程安全的ArrayList
。 -
ConcurrentHashMap
:虽然这是一个映射(Map
),但它是线程安全的,并且提供了高性能的并发访问。 -
CopyOnWriteArrayList
:这是一个特殊的线程安全的List
实现,它通过“写入时复制”的策略来实现线程安全。这种方法适用于读多写少的场景,因为在写操作时需要创建新的数组副本,因此写操作的性能较差。
线程安全的List
特点
CopyOnWriteArrayList 特点
- 读写分离:读操作不会阻塞写操作,反之亦然。读操作总是从旧数组中读取数据,而写操作则创建新数组并在新数组中进行写入。
- 适合读多写少场景:因为写操作涉及到创建新数组,所以如果写操作频繁,那么性能会受到影响。
- 不可迭代修改:一旦创建了
Iterator
,就不能再修改CopyOnWriteArrayList
,否则会抛出ConcurrentModificationException
。 - 高延迟:由于写操作涉及到数组的复制,所以写操作可能会有较高的延迟。
同步包装的ArrayList
或LinkedList
特点
- 方法同步:所有的方法都被同步,这意味着每次调用方法都需要获得锁。
- 全局同步:由于所有的操作都是在一个锁上进行同步的,所以即使是并发读取也会受到限制。
- 性能瓶颈:由于每次访问都需要锁定整个集合,所以在高并发环境下性能较差。
选择合适的线程安全集合
选择合适的线程安全集合取决于具体的应用场景:
- 如果写操作较少,读操作较多,可以选择
CopyOnWriteArrayList
。 - 如果需要在写操作频繁的情况下保证线程安全,可以考虑使用
Collections.synchronizedList
来包装ArrayList
或LinkedList
。 - 如果需要更加灵活的线程安全解决方案,可以使用自定义的同步策略,如使用
ReentrantLock
等。
14.泛型如何提供安全监测机制,什么是类型擦除(删除)
泛型如何提供安全监测机制
在Java中,泛型是用来创建参数化的类型的机制,它允许在编译时进行类型检查,从而提供类型安全性。以下是泛型如何提供安全监测机制的一些要点:
-
类型参数:使用泛型时,可以在类或接口声明时定义类型参数,例如
List<T>
中的T
。 -
类型参数的实例化:在创建泛型类型的实例时,需要指定具体的类型参数,例如
List<Integer>
。 -
编译时类型检查:编译器会在编译时检查类型参数是否正确使用,如果尝试向
List<Integer>
中添加非Integer
类型的对象,编译器会报错。 -
类型安全的强制转换:编译器会自动插入必要的强制转换,使得泛型代码在运行时能够正确工作。
-
通配符:使用通配符(如
?
)可以增加代码的灵活性,同时保持类型安全性。例如,List<?>
表示可以接受任何类型的List
,但不允许添加元素。 -
限定通配符:可以使用带有上限或下限的通配符(如
List<? extends Number>
或List<? super Integer>
)来进一步限制类型。 -
类型擦除:尽管泛型在编译时提供了类型安全,但在运行时,所有的类型参数都会被擦除为其对应的原始类型(如
List
)。这意味着在运行时,你无法直接访问泛型类型的特定信息,但编译时的类型安全仍然得到了保障。
什么是类型擦除(删除)
类型擦除是指在Java运行时环境中,所有的泛型信息都会被“擦除”,即在编译后的字节码中,泛型类型信息被替换成了它们对应的原始类型(非泛型类型)。这意味着在运行时,你无法知道一个泛型类型的特定信息,因为所有的类型参数都会被替换为它们的原始类型。
类型擦除的影响
-
运行时类型信息丢失:在运行时,无法直接获取泛型参数的类型信息。例如,
List<Integer>
和List<String>
在运行时都被视为List
。 -
强制类型转换:编译器会在适当的地方插入强制类型转换,以确保类型安全。
-
数组和泛型的限制:由于类型擦除的存在,无法创建一个泛型数组(如
T[]
),因为这会导致类型擦除后变成Object[]
,从而失去类型安全性。
示例
import java.util.List;public class GenericExample {public static void main(String[] args) {List<Integer> intList = new ArrayList<Integer>();intList.add(1); // 编译器自动插入强制转换// 以下代码在编译时不通过// List<String> stringList = intList; // 编译错误// 以下代码在编译时通过,但在运行时会抛出ClassCastException// List<String> stringList = (List<String>) intList;// 使用通配符List<?> wildcardList = intList; // 编译通过,运行时被视为List}
}
总结来说,泛型通过编译时的类型检查来提供类型安全,而在运行时,所有的泛型信息都被擦除,只保留原始类型。这种机制使得泛型在提供类型安全性的同时,又不会增加运行时的复杂性。
相关文章:

Java题集练习5
Java题集练习5(集合) 1.三种集合差别,集合类都是什么,数据结构是什么,都什么时候用 三者关系 Set集合 Set接口是Collection接口的一个子接口是无序的,set中不包含重复的元素,也就是说set中不…...

操作系统学习笔记-2.3哲学家和管程问题
哲学家问题 问题描述 假设有五位哲学家围坐在一张圆桌旁,每位哲学家面前放有一盘意大利面,他们各自间隔放置一根叉子。哲学家的行为分为“思考”和“进餐”两种状态。为了进餐,哲学家需要同时拿起左手边和右手边的两根叉子。用餐结束后&…...

2023年信息安全工程师摸底测试卷
目录 1.密码算法 2.等级保护 3.密码学 4.安全评估 5.网络安全控制技术 6.恶意代码 7.身份认证 8.资产管理 9.密码分类 10.被动攻击 11.商用密码服务编辑 12.超文本传输协议 13.数字水印技术 14.信息系统安全设计 15.重放攻击 16.信息资产保护 17.身份认证 …...

ReactOS系统中平衡二叉树。给定地址超导其所属区块MmFindRegion()
系列文章目录 PMM_REGION NTAPI MmFindRegion( PVOID BaseAddress, PLIST_ENTRY RegionListHead, PVOID Address, PVOID* RegionBaseAddress ); 宏函数 //给定地址找到其中所属区块 #define CONTAINING_RECORD(address,type,field) ((type FAR *\(PCHAR)(address)-(PCHAR)(&…...

基于TESSY的单元测试与分类树方法深入解析
在现代软件开发中,单元测试是确保软件质量和可靠性的关键步骤之一。特别是对于嵌入式软件,由于其应用环境的特殊性和高安全性要求,单元测试显得尤为重要。本文将基于《TESSY 用户手册》的内容,详细介绍如何使用TESSY 进行单元测试,并深入探讨分类树方法(Classification T…...

整理了一些大模型的课程,非常详细,大模型零基础入门到精通,收藏我这一篇就够了
目前有多个科普类的大模型课程,这些课程涵盖了从基础理论到实际应用的各个方面。以下是一些主要的科普类大模型课程:复旦大学“大模型开发与赋能”专题讲习班:由复旦大学计算机学院邱锡鹏教授带来的《大模型科普讲解》课程,通过深…...

区块链国赛题目--食品溯源(模块三)
区块链国赛题目–食品溯源(模块三) 任务 3-1:区块链应用前端功能开发 1.请基于前端系统的开发模板,在登录组件 login.js、组件管理文件components.js 中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功 能完整性,示例页面如下: 具体要求如下: (1)有明…...

【Searxng】Searxng docker 安装
SearXNG将用户的查询请求分发至多个支持的搜索引擎,并收集返回的结果进行汇总处理。在这个过程中,它通过内置的过滤器功能屏蔽广告和其他不相关内容,确保搜索结果的纯净度。 一键部署 docker run \--name searxng \-p ????:8080 \-v ~/s…...

Java Lock/AQS ReentrantLock 源码
前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & AQS & 目录》(持续更新)《Java & Lock/AQS & ReentrantLock & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Jav…...

魔法伤害--是谁偷走了我的0
起因:需要迁移数据进行数据更新,使用pandasorcal进行数据处理以及库迁移 首先把数据导出为xls格式数据文件,使用python import pandas as pdnew_obj pd.read_excel(ne,dtype{DAY: str, MONTH: str}) 原有导出数据格式为: 使用…...

【ArcGIS Pro实操第4期】绘制三维地图
【ArcGIS Pro实操第4期】绘制三维地图 ArcGIS Pro绘制三维地图-以DEM高程为例参考 如何使用ArcGIS Pro将栅格数据用三维的形式进行表达?在ArcGIS里可以使用ArcScene来实现,ArcGIS Pro实现原理跟ArcScene一致。由于Esri未来将不再对ArcGIS更新,…...

Vuestic 整理使用
简单示例 1. 条件渲染 2. 列表渲染 3. 组件插槽 4. 插值语法 5. 前后端路由的区别(还是转一下,可以减少代码量)SFC 构建 … … Okay,可以干活了,通顺 数据表的操作更加简化了 数据类别通过后端路由区别,但是还得由前端路由转一下 简单了许多呀,上脚手…...

学习伊圣雨老师的 epoll 编程
(1)书里提出了疑问,epoll 函数的工作方式,区分为水平触发与边缘触发 : (2) 谢谢...

详细了解C++11(1)
大家好呀,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流哦 本文由:残念ing原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各…...

ITA的去锅盖处理流程
一、说明 锅盖是什么 锅盖的类型有哪些 二、去锅盖处理流程 去锅盖算法首先需要采集一份锅盖模板数据,该模板数据用户可以自定义保存,方便后面的开机重启直接导入使用。去锅盖处理包含两个历程:保存锅盖模板;去锅盖处理。 保存锅盖模板: ( 1 ) 打开采集锅盖模板开关。…...

日志管理系统的系统目标是什么?
在网络安全、数据管理、故障排查等领域,日志都被广泛使用并需要进行有效的管理与分析。因此,日志管理系统的系统目标显得尤为重要,如以下几方面。 1、确保数据的安全性及完整性 在企业和组织的日常运营中,各类信息数据都会通过系统…...

uniapp 底部导航栏tabBar设置后不显示的问题——已解决
uniapp 底部导航栏tabBar设置后不显示的问题——已解决 网上找了一堆解决办法,挨个对着试吧 解决办法一:tabBar里的list第一项和page中的第一项要相同,确实就能显示了。但是问题来了,page中的第一项是入口页,那就意味…...

JVM 类加载器
字节码的结构 魔数u4 cafe babe 版本u4 52 java8 常量池计数器u2 从1开始,0索引留给不需要的情况 常量池 表 #1 -> #计数器-1 类标识符 u2 public final abstrat class annotion interface 之类 类索引u2 名字 父类索引u2 父类名字 接口计数器 u2 接口数…...

《C++长时间运行程序:驯服内存膨胀的“怪兽”》
在 C编程的世界里,当我们编写长时间运行的程序时,内存膨胀问题就像一个隐藏在暗处的“怪兽”,随时可能吞噬我们程序的性能和稳定性。无论是服务器应用程序、大型模拟系统还是其他长时间运行的关键任务软件,有效地处理内存膨胀问题…...

ELK之路第二步——可视化界面Kibana
Kibana 1.安装2.解压3.修改配置4.启动 这部分内容就比较简单了,水一片文章。 1.安装 需要梯子 官网下载链接:https://www.elastic.co/cn/downloads/past-releases/kibana-7-3-0 如果你去官网下载页面,点击下载是404报错,记得切换…...

Nature Medicine病理AI汇总|CONCH:病理图像分析的零样本学习模型·顶刊精析·24-10-30
小罗碎碎念 最近在整理24年发表在Nature Medicine上的病理AI文章,简单列了一个表。 接下来我将按照先后顺序,系统的把这13篇文献分析完。其中底色做了填充的,代表商业公司在本论文中占据了一作或通讯。 本期推文介绍的模型是CONCH࿰…...

通过不当变更导致 PostgreSQL 翻车的案例分析与防范
在数据库管理领域,PostgreSQL 凭借其强大的功能和稳定性,赢得了广泛的认可。然而,即便是如此稳健的系统,在不当的变更操作下,也可能遭遇性能下降、数据丢失甚至系统崩溃的风险。本文将通过一个具体案例,分析…...

Windows高级技巧:轻松实现多进程窗口的连接与管理
在Windows操作系统中,管理多个进程窗口可能是一项复杂的任务,特别是在自动化测试或多任务处理时。本文将介绍一种高效的方法,通过Python编程和AirtestIDE工具,实现多进程窗口的便捷连接与管理。同时,将提供具体的代码示…...

洪水淹没制图
原文链接:洪水淹没制图https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247624956&idx2&sn2557e56396eed7568d27baf694dc86fe&chksmfa8da91bcdfa200d307ea12ab9f52394ca6ef0bea3111bd8a873b34c950bcd9441c377f13674&token1392391660&…...

PHP的 CSRF、XSS 攻击和防范
CSRF攻击 CSRF(Cross-Site Request Forgery)攻击,也称为跨站请求伪造,是一种常见的网络安全威胁。在这种攻击中,攻击者利用已认证的用户身份,在用户不知情的情况下伪造请求,冒充用户的操作向目…...

怎么在线制作活码?二维码活码的简单制作技巧
进入数字化时代,二维码已经成为主要的一种内容分享方式,将内容生成活码二维码,可以方便内容的传输与存储,在日常生活中的很多场景都有二维码的应用。通过生成二维码的方式可以更简单快速的分享内容给其他人,有效提高获…...

Lua中实现异步HTTP请求的方法
Lua,作为一种轻量级的脚本语言,因其简洁和高效,在游戏开发、嵌入式系统以及互联网应用中得到了广泛的应用。本文将介绍如何在Lua中实现异步HTTP请求,并提供相应的代码实现,包括如何通过代理服务器发送请求。 异步HTTP…...

拓展学习-golang的基础语法和常用开发工具
golang的基础语法 golang的基础语法和其他语言大部分都差别不大,如果我们有学习过其他语言,比如JavaScript,php,java,python等,有其他语言的语法基础,那么我们学习golang将更容易上手。那我们直…...

得计算题者得天下!软考系统集成计算题详解!
软考中级系统集成项目管理工程师考试一共有《综合知识》和《案例分析》两门科目,而在这两科中都会涉及到计算题,特别是案例分析中,计算题每次考试都会占到一道大题,共25分,占到了科目总分的1/4,所以对于系统…...

在AdaBoost中每轮训练后,为什么错误分类的样本权重会增大e^2αt倍
在 AdaBoost 的每一轮迭代中,样本 i i i 的权重更新公式为: w t 1 , i w t , i ⋅ exp ( − α t y i G t ( x i ) ) Z t w_{t1,i} \frac{w_{t,i} \cdot \exp(-\alpha_t y_i G_t(x_i))}{Z_t} wt1,iZtwt,i⋅exp(−αtyiGt(xi)) …...