面试准备——Java理论高级【笔试,面试的核心重点】
集合框架
Java集合框架是面试中的重中之重,尤其是对List、Set、Map的实现类及其底层原理的考察。
1. List
-  
ArrayList:
- 底层是动态数组,支持随机访问(通过索引),时间复杂度为O(1)。
 - 插入和删除元素时,如果是在中间位置,需要移动后续元素,时间复杂度为O(n)。
 - 扩容机制:默认初始容量为10,扩容时增加为原来的1.5倍。
 - 线程不安全。
 
面试问题:
- ArrayList的扩容机制是什么?
 - ArrayList和LinkedList的区别?
 
案例:
List<Integer> list = new ArrayList<>(); list.add(1); // 添加元素 list.get(0); // 获取元素 list.remove(0); // 删除元素 -  
LinkedList:
- 底层是双向链表,适合频繁的插入和删除操作,时间复杂度为O(1)。
 - 随机访问效率低,时间复杂度为O(n)。
 - 线程不安全。
 
面试问题:
- LinkedList的实现原理是什么?
 - 如何实现一个LRU缓存?(可以用LinkedList实现)
 
案例:
List<Integer> linkedList = new LinkedList<>(); linkedList.add(1); linkedList.add(2); linkedList.remove(1); // 删除元素 
2. Set
-  
HashSet:
- 基于
HashMap实现,元素无序且不允许重复。 - 添加元素时,先计算哈希值,再通过
equals方法判断是否重复。 - 线程不安全。
 
面试问题:
- HashSet如何保证元素唯一性?
 - HashSet和TreeSet的区别?
 
案例:
Set<String> set = new HashSet<>(); set.add("A"); set.add("B"); set.add("A"); // 不会重复添加 - 基于
 -  
TreeSet:
- 基于
TreeMap实现,元素按自然顺序或自定义顺序排序。 - 内部使用红黑树实现,插入、删除、查找的时间复杂度为O(log n)。
 - 线程不安全。
 
案例:
Set<Integer> treeSet = new TreeSet<>(); treeSet.add(3); treeSet.add(1); treeSet.add(2); System.out.println(treeSet); // 输出 [1, 2, 3] - 基于
 
3. Map
-  
HashMap:
- 基于哈希表实现,允许
null键和null值。 - 扩容机制:默认初始容量为16,负载因子为0.75,扩容时容量变为原来的2倍。
 - 线程不安全。
 
面试问题:
- HashMap的底层实现原理?
 - HashMap如何解决哈希冲突?(链地址法)
 - JDK 1.8中HashMap的优化?(引入红黑树)
 
案例:
Map<String, Integer> map = new HashMap<>(); map.put("A", 1); map.put("B", 2); map.get("A"); // 获取值 - 基于哈希表实现,允许
 -  
ConcurrentHashMap:
- 线程安全的HashMap,JDK 1.8之前使用分段锁,JDK 1.8之后使用CAS + synchronized。
 - 面试问题: 
- ConcurrentHashMap如何保证线程安全?
 - ConcurrentHashMap的锁粒度是什么?
 
 
案例:
Map<String, Integer> concurrentMap = new ConcurrentHashMap<>(); concurrentMap.put("A", 1); concurrentMap.put("B", 2); 
File API
File API用于操作文件和目录,常见操作包括创建、删除、重命名、遍历等。
常见面试问题:
-  
如何递归遍历目录下的所有文件?
- 使用递归或
Files.walk()方法。 
案例:
public void listFiles(File dir) {if (dir.isDirectory()) {File[] files = dir.listFiles();for (File file : files) {if (file.isDirectory()) {listFiles(file); // 递归} else {System.out.println(file.getName());}}} } - 使用递归或
 -  
如何读取大文件?
- 使用
BufferedReader逐行读取。 
案例:
try (BufferedReader br = new BufferedReader(new FileReader("largeFile.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);} } - 使用
 
IO
Java IO分为字节流和字符流,常见类包括InputStream、OutputStream、Reader、Writer。
常见面试问题:
-  
字节流 vs 字符流的区别?
- 字节流以字节为单位操作数据,适合处理二进制文件(如图片、视频)。
 - 字符流以字符为单位操作数据,适合处理文本文件。
 
案例:
// 字节流 try (FileInputStream fis = new FileInputStream("input.txt");FileOutputStream fos = new FileOutputStream("output.txt")) {int data;while ((data = fis.read()) != -1) {fos.write(data);} }// 字符流 try (FileReader fr = new FileReader("input.txt");FileWriter fw = new FileWriter("output.txt")) {int data;while ((data = fr.read()) != -1) {fw.write(data);} } -  
NIO是什么?
- NIO(Non-blocking IO)是Java提供的高性能IO API,基于通道(Channel)和缓冲区(Buffer)操作。
 - 核心组件:
Channel、Buffer、Selector。 
案例:
try (FileChannel channel = FileChannel.open(Paths.get("input.txt"), StandardOpenOption.READ)) {ByteBuffer buffer = ByteBuffer.allocate(1024);while (channel.read(buffer) > 0) {buffer.flip();while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}buffer.clear();} } 
线程
线程是Java并发编程的核心,面试中常考线程的创建、生命周期、同步机制等。
常见面试问题:
-  
如何实现线程同步?
- 使用
synchronized关键字或ReentrantLock。 
案例:
class Counter {private int count = 0;public synchronized void increment() {count++;}public int getCount() {return count;} } - 使用
 -  
wait()、notify()、notifyAll()的作用?
- 用于线程间的通信,
wait()使线程等待,notify()唤醒一个等待线程,notifyAll()唤醒所有等待线程。 
案例:
class SharedResource {private boolean flag = false;public synchronized void produce() {while (flag) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}flag = true;notify();}public synchronized void consume() {while (!flag) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}flag = false;notify();} } - 用于线程间的通信,
 
线程池
线程池是面试中的高频考点,尤其是对ThreadPoolExecutor的参数和原理的考察。
常见面试问题:
-  
线程池的核心参数有哪些?
corePoolSize:核心线程数。maximumPoolSize:最大线程数。keepAliveTime:空闲线程存活时间。workQueue:任务队列。threadFactory:线程工厂。handler:拒绝策略。
 -  
线程池的拒绝策略有哪些?
AbortPolicy:直接抛出异常。CallerRunsPolicy:由调用线程处理任务。DiscardOldestPolicy:丢弃队列中最老的任务。DiscardPolicy:直接丢弃任务。
案例:
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // corePoolSize5, // maximumPoolSize60, // keepAliveTimeTimeUnit.SECONDS,new LinkedBlockingQueue<>(10),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy() ); 
问题答案
ArrayList的扩容机制是什么?
-  
答案:
ArrayList的底层是一个动态数组,初始容量为10。- 当元素数量超过当前容量时,
ArrayList会自动扩容。 - 扩容时,新容量通常是旧容量的1.5倍(即
oldCapacity + (oldCapacity >> 1))。 - 扩容过程会创建一个新的数组,并将旧数组中的元素复制到新数组中。
 
示例:
ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < 20; i++) {list.add(i); // 当元素数量超过10时,ArrayList会自动扩容 } 
ArrayList和LinkedList的区别?
-  
答案:
- 底层实现: 
ArrayList基于动态数组,支持随机访问,时间复杂度为O(1)。LinkedList基于双向链表,插入和删除操作效率高,时间复杂度为O(1),但随机访问效率低,时间复杂度为O(n)。
 - 内存占用: 
ArrayList占用连续内存空间。LinkedList占用非连续内存空间,每个节点需要额外存储前后节点的引用。
 - 适用场景: 
ArrayList适合频繁查询的场景。LinkedList适合频繁插入和删除的场景。
 
示例:
List<Integer> arrayList = new ArrayList<>(); arrayList.add(1); // 适合查询 arrayList.get(0); // O(1)List<Integer> linkedList = new LinkedList<>(); linkedList.add(1); // 适合插入和删除 linkedList.remove(0); // O(1) - 底层实现: 
 
HashSet如何保证元素唯一性?
-  
答案:
HashSet基于HashMap实现,元素存储在HashMap的键中。- 添加元素时,先计算元素的哈希值(通过
hashCode()方法),然后通过equals()方法判断是否重复。 - 如果哈希值相同且
equals()返回true,则认为元素重复,不会添加。 
示例:
Set<String> set = new HashSet<>(); set.add("A"); set.add("B"); set.add("A"); // 不会重复添加 
HashMap的底层实现原理?
-  
答案:
HashMap基于哈希表实现,底层是数组 + 链表(JDK 1.8之前)或数组 + 链表 + 红黑树(JDK 1.8之后)。- 添加元素时,先计算键的哈希值,然后通过哈希值找到数组中的位置(桶)。
 - 如果发生哈希冲突(即多个键映射到同一个桶),则使用链表或红黑树存储冲突的元素。
 - 当链表长度超过8时,链表会转换为红黑树,以提高查找效率。
 
示例:
Map<String, Integer> map = new HashMap<>(); map.put("A", 1); map.put("B", 2); map.get("A"); // 获取值 
LinkedList的实现原理是什么?
-  
答案:
LinkedList是基于双向链表实现的。- 每个节点(
Node)包含三个部分:- 数据域(存储元素值)。
 - 前驱指针(指向前一个节点)。
 - 后继指针(指向后一个节点)。
 
 - 链表的头节点(
first)和尾节点(last)分别指向链表的第一个和最后一个节点。 - 插入和删除操作只需要修改节点的指针,时间复杂度为O(1)。
 - 随机访问需要从头节点或尾节点遍历,时间复杂度为O(n)。
 
示例:
LinkedList<Integer> list = new LinkedList<>(); list.add(1); // 添加到链表尾部 list.add(2); list.remove(1); // 删除元素 
如何实现一个LRU缓存?(可以用LinkedList实现)
-  
答案:
- LRU(Least Recently Used)缓存是一种淘汰最近最少使用数据的缓存策略。
 - 可以使用
LinkedList+HashMap实现:LinkedList用于维护数据的访问顺序,最近访问的数据放在链表头部。HashMap用于快速查找数据。
 
实现步骤:
- 当访问一个数据时,如果数据在缓存中,则将其移动到链表头部。
 - 如果数据不在缓存中,则将其添加到链表头部。
 - 如果缓存已满,则移除链表尾部的数据。
 
示例:
class LRUCache<K, V> {private final int capacity;private final Map<K, V> map;private final LinkedList<K> list;public LRUCache(int capacity) {this.capacity = capacity;this.map = new HashMap<>();this.list = new LinkedList<>();}public V get(K key) {if (map.containsKey(key)) {list.remove(key); // 移除旧位置list.addFirst(key); // 放到链表头部return map.get(key);}return null;}public void put(K key, V value) {if (map.containsKey(key)) {list.remove(key); // 移除旧位置} else if (map.size() >= capacity) {K lastKey = list.removeLast(); // 移除链表尾部数据map.remove(lastKey);}list.addFirst(key); // 放到链表头部map.put(key, value);} } 
HashSet和TreeSet的区别?
-  
答案:
- 底层实现: 
HashSet基于HashMap实现,元素无序。TreeSet基于TreeMap实现,元素按自然顺序或自定义顺序排序。
 - 性能: 
HashSet的插入、删除、查找操作的时间复杂度为O(1)。TreeSet的插入、删除、查找操作的时间复杂度为O(log n)。
 - 适用场景: 
HashSet适合需要快速查找且不关心顺序的场景。TreeSet适合需要有序数据的场景。
 
示例:
Set<Integer> hashSet = new HashSet<>(); hashSet.add(3); hashSet.add(1); hashSet.add(2); System.out.println(hashSet); // 输出顺序不确定Set<Integer> treeSet = new TreeSet<>(); treeSet.add(3); treeSet.add(1); treeSet.add(2); System.out.println(treeSet); // 输出 [1, 2, 3] - 底层实现: 
 
HashMap如何解决哈希冲突?(链地址法)
-  
答案:
HashMap使用链地址法解决哈希冲突。- 当多个键映射到同一个桶(数组位置)时,
HashMap会将这些键值对存储在同一个链表中。 - 在JDK 1.8中,当链表长度超过8时,链表会转换为红黑树,以提高查找效率。
 
示例:
Map<String, Integer> map = new HashMap<>(); map.put("A", 1); map.put("B", 2); map.put("C", 3); // 假设 "A" 和 "B" 的哈希值相同,它们会被存储在同一个链表中 
JDK 1.8中HashMap的优化?(引入红黑树)
-  
答案:
- 在JDK 1.8中,
HashMap引入了红黑树来优化性能。 - 当链表长度超过8时,链表会转换为红黑树,查找时间复杂度从O(n)降低到O(log n)。
 - 当红黑树的节点数少于6时,红黑树会退化为链表。
 
优化点:
- 提高了哈希冲突严重时的查找效率。
 - 减少了链表过长时的性能问题。
 
示例:
Map<String, Integer> map = new HashMap<>(); for (int i = 0; i < 100; i++) {map.put("Key" + i, i); } // 当链表长度超过8时,会自动转换为红黑树 - 在JDK 1.8中,
 
ConcurrentHashMap的锁粒度是什么?
-  
答案:
- 在JDK 1.7中,
ConcurrentHashMap使用分段锁(Segment),每个段独立加锁,锁粒度是段级别。 - 在JDK 1.8中,
ConcurrentHashMap使用CAS +synchronized,锁粒度是桶级别(数组中的每个位置)。- 对每个桶(数组中的每个位置)使用
synchronized锁。 - 使用CAS操作保证原子性。
 
 - 对每个桶(数组中的每个位置)使用
 
示例:
Map<String, Integer> concurrentMap = new ConcurrentHashMap<>(); concurrentMap.put("A", 1); concurrentMap.put("B", 2); - 在JDK 1.7中,
 
ConcurrentHashMap如何保证线程安全?
-  
答案:
- 在JDK 1.7中,
ConcurrentHashMap使用分段锁(Segment),每个段独立加锁。 - 在JDK 1.8中,
ConcurrentHashMap使用CAS(Compare-And-Swap) +synchronized实现线程安全。- 对每个桶(数组中的每个位置)使用
synchronized锁。 - 使用CAS操作保证原子性。
 
 - 对每个桶(数组中的每个位置)使用
 
示例:
Map<String, Integer> concurrentMap = new ConcurrentHashMap<>(); concurrentMap.put("A", 1); concurrentMap.put("B", 2); - 在JDK 1.7中,
 
如何递归遍历目录下的所有文件?
-  
答案:
- 使用递归方法遍历目录及其子目录。
 - 对于每个文件,如果是目录,则递归调用;如果是文件,则输出文件名。
 
示例:
public void listFiles(File dir) {if (dir.isDirectory()) {File[] files = dir.listFiles();for (File file : files) {if (file.isDirectory()) {listFiles(file); // 递归} else {System.out.println(file.getName());}}} } 
字节流 vs 字符流的区别?
-  
答案:
- 字节流:以字节为单位操作数据,适合处理二进制文件(如图片、视频)。 
- 核心类:
InputStream、OutputStream。 
 - 核心类:
 - 字符流:以字符为单位操作数据,适合处理文本文件。 
- 核心类:
Reader、Writer。 
 - 核心类:
 
示例:
// 字节流 try (FileInputStream fis = new FileInputStream("input.txt");FileOutputStream fos = new FileOutputStream("output.txt")) {int data;while ((data = fis.read()) != -1) {fos.write(data);} }// 字符流 try (FileReader fr = new FileReader("input.txt");FileWriter fw = new FileWriter("output.txt")) {int data;while ((data = fr.read()) != -1) {fw.write(data);} } - 字节流:以字节为单位操作数据,适合处理二进制文件(如图片、视频)。 
 
如何实现线程同步?
-  
答案:
- 使用
synchronized关键字或ReentrantLock实现线程同步。 synchronized可以修饰方法或代码块,确保同一时刻只有一个线程访问共享资源。
示例:
class Counter {private int count = 0;public synchronized void increment() {count++;}public int getCount() {return count;} } - 使用
 
线程池的核心参数有哪些?
-  
答案:
corePoolSize:核心线程数。maximumPoolSize:最大线程数。keepAliveTime:空闲线程存活时间。workQueue:任务队列。threadFactory:线程工厂。handler:拒绝策略。
示例:
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // corePoolSize5, // maximumPoolSize60, // keepAliveTimeTimeUnit.SECONDS,new LinkedBlockingQueue<>(10),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy() ); 
线程池的拒绝策略有哪些?
-  
答案:
AbortPolicy:直接抛出异常。CallerRunsPolicy:由调用线程处理任务。DiscardOldestPolicy:丢弃队列中最老的任务。DiscardPolicy:直接丢弃任务。
示例:
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>(10),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy() ); 
哈希表核心原理
相关文章:
面试准备——Java理论高级【笔试,面试的核心重点】
集合框架 Java集合框架是面试中的重中之重,尤其是对List、Set、Map的实现类及其底层原理的考察。 1. List ArrayList: 底层是动态数组,支持随机访问(通过索引),时间复杂度为O(1)。插入和删除元素时&#…...
AI伴读-清华大学104页《DeepSeek:从入门到精通》
辅助工具:deepseek、豆包AI伴读 官网:DeepSeekDeepSeek, unravel the mystery of AGI with curiosity. Answer the essential question with long-termism.https://www.deepseek.com/https://www.deepseek.com/清华大学104页《DeepSeek:从入…...
unity学习34:角色相关3,触发器trigger,铰链 hingejoint 等 spring joint, fixed joint
目录 1 触发的实现条件 1.1 碰撞的的实现条件 1.2 触发的实现条件 1.3 触发器trigger,直接拿 碰撞器collider修改下配置即可 2 触发器相关实验:触发开门效果 2.0 目标 2.1 player物体的属性 2.2 新建一个trigger 物体 2.3 新建一个被trigger 控…...
HarmonyOS Next 方舟字节码文件格式介绍
在开发中,可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中,arkts会编译成方舟字节码。方舟字节码长什么样呢?我们以一个demo编译出的abc文件: 二进制就是长这样,怎么去理解呢&…...
计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)
计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目录 计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模块3. 软注意力与硬注意力4. 实验…...
html 列动态布局
样式说明: /* 列动态布局,列之间以空格填充 */ li {display: flex;/* flex-direction: column; */justify-content: space-between; }...
DeepSeek开源多模态大模型Janus-Pro部署
DeepSeek多模态大模型部署 请自行根据电脑配置选择合适环境配置安装conda以及gitJanus 项目以及依赖安装运行cpu运行gpu运行 进入ui界面 请自行根据电脑配置选择合适 本人家用电脑为1060,因此部署的7B模型。配置高的可以考虑更大参数的模型。 环境配置 安装conda…...
DeepSeek结合Langchain的基本用法
DeepSeek结合Langchain的基本用法 DeepSeek 基于Openai接口规范的Prompt应答Deepseek结合LangchainDeepSeek 基于langchain的结构化返回 DeepSeek 基于Openai接口规范的Prompt应答 首先我们需要先基于pip 安装 pip install openai最开始我们先熟悉如何使用openai的接口规范&a…...
Redis持久化的两种方式:RDB和AOF
redis中的数据存储在缓存中,如果没有持久化的策略,Redis一旦宕机,那么将会导致数据丢失;因此redis提供了以下两种持久化方式:RDB和AOF 一般来说,大部分公司对这两种方式都是同时开启的 一、RDB RDB策略全…...
每日一题——131.分割回文串
题目链接:131. 分割回文串 - 力扣(LeetCode) 代码: class Solution { private:vector<vector<string>> result;vector<string> path;void backtracking (const string& s,int startindex){if(startindex …...
内容中台赋能人工智能技术提升业务创新能力
内容概要 在当今快速变化的市场环境中,企业需要不断寻求创新以保持竞争力。内容中台作为一种新型的内容管理架构,能够极大地提升企业在内容创建、管理和分发方面的效率。通过与人工智能技术的深度融合,企业能够将海量的数据和信息转化为有价…...
第七节 文件与流
基本的输入输出(iostream) C标准库提供了一组丰富的输入/输出功能,C的I/O发生在流中,流是字节序列。如果字节流是从设备(键盘、磁盘驱动器、网络连接等)流向内存,叫做输入操作。如果字节流是从…...
软件工程 项目管理
软件项目管理中可以分成两部分: 软件创新 软件项目管理项目是定义明确的任务,这是为了实现某个目标(例如,软件开发和交付)进行的一系列操作的集合。一个项目可以表征为: 每个项目都可以有一个独特而鲜明的目标。 项目不是日常活…...
通过类加载和初始化的一些题目理解Java类加载过程
通过题目重点理解:Class加载流程和运行时区域 目录 子类和父类static变量父子类加载顺序2class.forName初始化 子类和父类static变量 class Parent {static int a 1;static int b 2;static int c;static {c 3;System.out.println("parent static block&quo…...
LLMs之DeepSeek r1:TinyZero的简介、特点、安装和使用方法、案例应用Logic-RL的简介、安装和使用方法、案例应用之详细攻略
LLMs之DeepSeek r1:TinyZero的简介、特点、安装和使用方法、案例应用Logic-RL的简介、安装和使用方法、案例应用之详细攻略 目录 TinyZero的简介 1、TinyZero的特点 TinyZero的安装和使用方法 1、安装 创建 conda 环境 数据准备 (倒计时任务) 多GPU (适用于 …...
爬取豆瓣电影 Top250 数据的脚本及调整方法
以下是一个完整的 Python 脚本,用于爬取豆瓣电影 Top250 的数据,包括电影名称、评分和短评。同时,我将提供应对豆瓣页面结构更新和反爬虫机制的调整方法。 安装必要的库 首先,确保安装了必要的库: bash复制 pip install requests beautifulsoup4 pandas示例代码 Pyth…...
Deepseek 接入Word处理对话框(隐藏密钥)
硅基流动邀请码:1zNe93Cp 邀请链接:网页链接 亲测deepseek接入word,自由调用对话,看截图有兴趣的复用代码(当然也可以自己向deepseek提问,帮助你完成接入,但是提问逻辑不一样给出的答案是千差万…...
Jupyter Notebook自动保存失败等问题的解决
一、未生成配置文件 需要在命令行中,执行下面的命令自动生成配置文件 jupyter notebook --generate-config 执行后会在 C:\Users\用户名\.jupyter目录中生成文件 jupyter_notebook_config.py 二、在网页端打开Jupyter Notebook后文件保存失败;运行代码…...
基于机器学习时序库pmdarima实现时序预测
目录 一、Pmdarima实现单变量序列预测1.1 核心功能与特性1.2 技术优势对比1.3 python案例1.3.1 时间序列交叉验证1.3.1.1 滚动交叉验证1.3.1.2 滑窗交叉验证 时间序列相关参考文章: 时间序列预测算法—ARIMA 基于VARMAX模型的多变量时序数据预测 基于机器学习时序库…...
Dart语言的云计算
Dart语言在云计算中的应用 引言 云计算作为一种新兴的计算模式,为各行各业带来了重大变革。借助于云计算,用户可以通过互联网获取和使用各种资源,如计算能力、存储、数据库等。随着云计算的快速发展,编程语言的选择变得愈发重要…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了  先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
