Java基础学习(10)
Java基础学习
- 一、JDK8时间类
- 1.1 Zoneld时区
- 1.2 Instant时间戳
- 1.3 ZonedDateTime
- 1.4 DateTimeFormatter
- 1.5 日历类时间表示
- 1.6 工具类
- 1.7 包装类
- JDK5提出的新特性
- Integer成员方法
- 二、集合进阶
- 2.1 集合的体系结构
- 2.1.1 Collection
- 2.2collection的遍历方式
- 2.2.1 迭代器遍历
- 2.2.2 增强for遍历
- 2.2.3 lambda遍历
- 2.2.4 列表迭代器 ListIterator
- 2.2.5 五种遍历方式对比
- 2.3 List集合
- 2.4 数据结构
- 2.4.1 栈
- 2.4.2 队列
- 2.4.3 数组
- 2.4.4 链表
- 2.5 ArrayList
- 2.6 LinkedList集合
- iterator底层原理解析
- 2.7 泛型深入
- 2.7.1 泛型类
- 2.7.2 泛型方法
- 2.7.3 泛型接口
- 2.7.4 泛型的继承和通配符
一、JDK8时间类
JDK7:多线程环境下会导致数据安全的问题
JDK8:时间日期对象都是不可变的,解决了这个问题
在这里插入图片描述
1.1 Zoneld时区
import java.time.ZoneId;
import java.util.Set;public class ZoneId获取1 {public static void main(String[] args) {//1.获取所有的时间名称Set<String> zoneIds = ZoneId.getAvailableZoneIds();System.out.println(zoneIds.size());//600System.out.println(zoneIds);//600个名称时间 我国的Asia/Shanghai//2. 获取当前系统默认的时区ZoneId zoneId = ZoneId.systemDefault();System.out.println(zoneId);//Asia/Shanghai//3. 获取指定区域的时区ZoneId id = ZoneId.of("Asia/Shanghai");System.out.println(id);//Asia/Shanghai}
}
1.2 Instant时间戳
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;public class Instant方法 {public static void main(String[] args) {
/*//1. 获取当前Instant对象(标准时间)Instant now = Instant.now();System.out.println(now);//2023-04-18T00:18:32.623003300Z*///2. 根据(秒/毫秒/纳秒)获取Istant对象Instant instant1 = Instant.ofEpochMilli(0L);System.out.println(instant1);//1970-01-01T00:00:00ZInstant instant = Instant.ofEpochSecond(1L);System.out.println(instant);//1970-01-01T00:00:01ZInstant instant2 = Instant.ofEpochSecond(1L, 1000000000L);System.out.println(instant2);//1970-01-01T00:00:02Z//3. 指定时间ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));System.out.println(zonedDateTime);//2023-04-18T08:26:19.216394900+08:00[Asia/Shanghai]//4 .isXXX进行判断时间Instant instant3 = Instant.ofEpochSecond(0L);Instant instant4 = Instant.ofEpochSecond(10L);//isBefore判断调用者代表的时间是否在参数表示时间的前面//isAfter判断调用者代表的时间是否在参数表示时间的后面boolean result1 = instant3.isAfter(instant4);boolean result2 = instant3.isBefore(instant4);System.out.println(result1+", "+result2); //false, true//5. 减少时间系列Instant instant5 = Instant.ofEpochSecond(10000L);Instant instant6 = instant5.minusMillis(1000L);System.out.println(instant5+","+instant6);//1970-01-01T02:46:40Z,1970-01-01T02:46:39Z}
}
1.3 ZonedDateTime
import java.time.ZoneId;
import java.time.ZonedDateTime;public class zonedDateTime {public static void main(String[] args) {//1 .获取ZonedDateTime时间对象ZonedDateTime time = ZonedDateTime.now();System.out.println(time);//2023-04-18T08:49:50.154319+08:00[Asia/Shanghai]//2. 获取指定的时间对象(带时区)ZonedDateTime time1 = ZonedDateTime.of(2023, 5, 18, 8, 59, 12, 0, ZoneId.of("Asia/Shanghai"));System.out.println(time1);//2023-05-18T08:59:12+08:00[Asia/Shanghai]// 3. withXXX 修改时间系列(年/月/日/时/分/秒)都可以ZonedDateTime zonedDateTime = time1.withYear(2028);System.out.println(zonedDateTime);//2028-05-18T08:59:12+08:00[Asia/Shanghai]}
}
1.4 DateTimeFormatter
日期格式化
1.5 日历类时间表示
1.6 工具类
Period
import java.time.LocalDate;
import java.time.Period;public class JDK时间工具类 {public static void main(String[] args) {//获取当前时间对象LocalDate now = LocalDate.now();//获取生日时间对象LocalDate birthday = LocalDate.of(2004,01,05);//获取到生日与现在的时间差Period period = Period.between(birthday, now);System.out.println(period);//P19Y3M13DSystem.out.println(period.getYears());//19System.out.println(period.getDays());//13System.out.println(period.getMonths());//3System.out.println(period.toTotalMonths());//获取到生日到现在的一共月份 ---231---}
}
ChronoUnit
//获取当前时间对象LocalDate now = LocalDate.now();
1.7 包装类
基本数据类型对应的引用类型
-----> 基本类型—>对象
用一个对象把数据包起来
注意:
- new Integer 是在堆区创建一个新的对象
- Integer.ofvalue 是在-128~127之间是公用一个内存当中
Integer i6 = Integer .valueof(127);
Integer i7 = Integer.valueof(127);
System.out.println(i6 == i7);//true
Integer i8 = Integer .valueof(128);
Integer i9 = Integer.valueof(128);
System.out.println(i8 == i9);//false
JDK5提出的新特性
- 在JDK5的时候提出了一个机制:自动装箱和自动拆箱
- 自动装箱: 把基本数据类型会自动的变成其对应的包装类
- 自动拆箱:把包装类自动的变成其对象的基本数据类型
//自动装箱
Integer i1 = 10;//创建对象与上方一致
Integer i2 = new Integer(10);//自动拆箱
int i = i2;
在JDK5以后,int和Integer可以看做是同一个东西,因为在内部可以自动转化。
Integer成员方法
public class Interger类 {public static void main(String[] args) {//1.把整数转为二进制String str1 = Integer.toBinaryString(100);System.out.println(str1);//1100100//2. 把整数转为八进制String str2 = Integer.toOctalString(100);System.out.println(str2);//144//3. 把整数转为十六进制String str3 = Integer.toHexString(100);System.out.println(str3);//64//4.将字符串类型的整数转化为int类型的整数//强类型语言:每种数据在java中都有各自的数据类型// 在计算的时候,如果不是同一种数据类型,是无法直接计算的。int i = Integer.parseInt("123");System.out.println(i);//123System.out.println(i+1);//124--->数据转化成功}
}
二、集合进阶
2.1 集合的体系结构
- List系列集合:
添加的元素是有序、可重复、有索引
- Set系列集合:
添加的元素是无序不重复、无索引
2.1.1 Collection
Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的
添加对象
1 .细节:我们在添加元素的时候,如果为
List
类,无论添加什么都是返回true(添加成功),因为List类可以重复
; 但是如果为Set
类,如果有重复的就会添加不成功,返回false
,因为Set类不可以重复
//2. 添加对象coll.add("aaa");coll.add("ccc");coll.add("bbb");
// System.out.println(coll.add("bbb"));//true
删除对象
只有存在的元素才能删除,所以不存在就会返回一个false,反之true
coll.remove("aaa");System.out.println(coll.remove("aaa"));//true
判断是否包含元素
底层原理:
是依赖equals方法进行判断的
- 如果在集合当中存储的是自定义的对象,也想
利用contains进行判断
是否包含对象,就必须在自定义对象的地方进行JavaBean处理,重新来定义equals方法
coll.contains("bbb");System.out.println(coll.contains("bbb"));//true
判断集合是否为空,长度为多少
//5. 判断集合是否为空coll.isEmpty();//6. 计算集合的长度coll.size();//2
2.2collection的遍历方式
- 迭代器遍历
- 增强for遍历
- Lambda表达式遍历
2.2.1 迭代器遍历
特点:不依赖索引
Collection集合获取迭代器
方法名称 | 说明 |
---|---|
Iterator<E> iterator() | 返回迭代器对象,默认指向当前集合的0索引 |
lterator中的常用方法:
方法名称 | 说明 |
---|---|
boolean hasNext() | 判断当前位置是否有元素,有元素返回true,没有元素返回false |
E next() | 获取当前位置的元素,并将迭代器对象移向下一个位置 |
遍历时的细节
1,报错NoSuchElementException
2,迭代器遍历完毕,指针不会复位
3,循环中只能用一次next方法
4,迭代器遍历时,不能用集合的方法进行增加或者删除
若要删除可以使用Iterator里面的remove方法去除,增加元素
若要删除可以使用Iterator里面的remove方法去除:
Collection<String> coll = new ArrayList<>();coll.add("aaa");coll.add("bbb");coll.add("ccc");coll.add("ddd");
Iterator<String> it = coll.iterator();//4. 利用循环,进行遍历集合while (it.hasNext()){String str = it.next();//这个方法实现了1. 获取元素 2. 指针后移一位if(str.equals("bbb")){it.remove();}}System.out.println(coll);//aaa,ccc,ddd
2.2.2 增强for遍历
原理:
- 增强for的底层就是迭代器,为了简化迭代器的代码书写的。
- 它是JDK5之后出现的,其内部原理就是一个iterator迭代器
- 所有的单列集合和数组才能用增强for进行遍历
package 集合的进阶.ColectionDome;import java.util.ArrayList;
import java.util.Collection;public class ImportFor {public static void main(String[] args) {Collection<String> coll = new ArrayList<>();coll.add("aaa");coll.add("bbb");coll.add("ccc");//增强for遍历for (String s : coll) {System.out.println(s);}}
}
但是运用遍历的数据是第三方数据,所以通过改变第三方数据是不能改变原来数组/集合的数据的
2.2.3 lambda遍历
利用匿名内部类的形式 底层原理:就是自己利用for循环,遍历出每一个元素,把每一个元素,传递给accept s依次表示集合中的每一个元素
package 集合的进阶.ColectionDome;import java.util.ArrayList;
import java.util.Collection;public class lambda {public static void main(String[] args) {Collection<String> coll = new ArrayList<>();coll.add("aaa");coll.add("bbb");coll.add("ccc");/* coll.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});*///lambda表达式coll.forEach(s -> System.out.println(s));}
}
2.2.4 列表迭代器 ListIterator
ListIterator与Iterator的区别:
ListInterator可以添加元素
ListIterator<String> its = coll.listIterator();while (its.hasNext()){String next = its.next();if(next.equals("bbb")){its.remove();its.add("hhhh");}System.out.println(next);}System.out.println(coll);}
2.2.5 五种遍历方式对比
迭代器遍历
:在遍历的过程中需要删除元素,请使用迭代器
列表迭代器
: 在遍历的过程中需要添加元素,请使用列表迭代器
增强for遍历
\ Lambda表达式
:仅仅想遍历,那么使用增强for或Lambda表达式
普通for
: 如果遍历的时候想操作索引,可以用普通for.
2.3 List集合
- 有序:存和取的元素顺序一致有
- 索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
List特有方法:
- Collection的方法List都继承了
- List集合因为有索引,所以多了很多索引操作的方法
方法名称 | 说明 |
---|---|
void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index,E element) | 修改指定索引处的元素、返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
package 集合的进阶.ListDome;import java.util.ArrayList;
import java.util.List;public class listDome1 {public static void main(String[] args) {//1. 创建List对象List<String> list = new ArrayList<>();//2. 添加对象list.add("aaa");list.add(1,"bbb");list.add("ccc");list.add(0,"dddd");
// System.out.println(list);//[dddd, aaa, bbb, ccc]//3. 删除元素list.remove(1); //按照索引来删除元素list.remove("aaa");//按照元素来删除// 4. 修改元素list.set(1,"fff");
// System.out.println(list);//[dddd, fff, ccc]//5. 查找元素System.out.println(list.get(1));//fff}
}
注意:
在remove当中若出现删除元素与index(索引值)一样就得
2.4 数据结构
- 数据结构是计算机底层存储、组织数据的方式是指数据相互之间是以什么方式排列在一起的。
- 数据结构是为了更加方便的管理和使用数据,需要结合具体的业务场景来进行选择
- 一般情况下,精心选择的数据结构可以带来更高的运行或者存储效率
2.4.1 栈
特点:后进先出,先进后出
2.4.2 队列
特点: 先进先出,后进后出
2.4.3 数组
查询速度快
: 查询数据通过地址值和索引定位,查询任意数据耗时相同。(元素在内存中是连续存储的)
删除效率低:
要将原始数据删除,同时后面每个数据前移
添加效率极低
:添加位置后的每个数据后移,再添加元素。
2.4.4 链表
结点:
链表当中的每一个元素
特点:
- 链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
- 链表查询慢,无论查询哪个数据都要从头开始找。
- 链表增删相对快
2.5 ArrayList
底层原理:
- 利用空参创建的集合,在底层创建一个默认长度为0的数组
- 添加第一个元素时,底层会创建一个新的长度为10的数组
- 存满时,会扩容1.5倍
- 如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准
当添加第一个元素的时候
当添加大于10的元素时候
2.6 LinkedList集合
- 底层数据结构是双链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的。
- LinkedList本身多了很多直接操作首尾元素的特有API
特有方法 | 说明 |
---|---|
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void addLast(E e) | 将指定的元素追加到此列表的末尾 |
public E getFirst() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最后一个元素 |
底层源码:
iterator底层原理解析
2.7 泛型深入
泛型
:是]DK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查泛型的格式
:<数据类型>注意
:泛型只能支持引用数据类型
泛型的好处:
- 统一数据类型。
- 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来
结论:
如果没有给集合指定的类型,默认所有的数据类型都是Object类型
这个时候可以往集合里面添加任意的数据类型
带来的坏处是:我们在获取数据的时候,无法使用他的特有行为
泛型的细节:
- 泛型中不能写基本数据类型
- 指定泛型的具体类型后,传递数据时,可以传入该类类型或者
- 子类类型如果不写泛型,类型默认是object
2.7.1 泛型类
使用场景
:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类
此处E可以理解为变量,但是不是用来记录数据的,而是记录数据的类型,可以写成:T、E、K、V等
书写的方法
package 集合的进阶.MyArrayList;import java.util.Arrays;public class MyArrayList<E> {//创建一个Object数组Object[] obj = new Object[10];int size;//数组长度//E表示不确定要添加的数据类型,e表示添加的数据public boolean add(E e){obj[size] = e;//将数据存入size++;return true;}public E get(int index) {return (E)obj[index];}//方法重写,使得打印出来的list为String@Overridepublic String toString(){return Arrays.toString(obj);}
}
调用的方法:
package 集合的进阶.MyArrayList;public class Test {public static void main(String[] args) {//创建自己搭建的MyArrayListMyArrayList<String> list = new MyArrayList<>();list.add("sada");list.add("sada123");list.add("sadsada");System.out.println(list);System.out.println(list.get(1));}
}
2.7.2 泛型方法
方法中形参类型不确定时:
方案1:使用类名后面定义的泛型 所有方法都能用
方案2:在方法申明上定义自己的泛型 只有本方法能用
package 集合的进阶.LIstUtil;import java.util.ArrayList;public class listUtil {private listUtil(){}private static <E> void addAll(ArrayList list ,E e1,E e2){list.add(e1);list.add(e2);}
}
2.7.3 泛型接口
重点
:如何使用一个带泛型的接口
方式1
:实现类给出具体类型
方式2
:实现类延续泛型,创建对象时再确定
接口泛型
public class MyArrayList2<E> implements List<E> {//接所有方法的重写
}
测试:
package 集合的进阶.MyArrayList;public class Test2 {public static void main(String[] args) {MyArrayList2<String> list2 = new MyArrayList2<String>();list2.add("sadsad");//因为创建的是字符串类型,所以只能添加字符串}
}
2.7.4 泛型的继承和通配符
泛型不具备继承性,但是数据具备继承性
? extends E
: 表示可以传递E或者E所有的子类类型
? super E
:表示可以传递E或者E所有的父类类型
package 集合的进阶.MyArrayList;import java.util.ArrayList;public class MyArrayList4 {public static void main(String[] args) {//创建对象ArrayList<Ye> list1 = new ArrayList<>();ArrayList<Fu> list2 = new ArrayList<>();ArrayList<Zi> list3 = new ArrayList<>();ArrayList<Students> list4 = new ArrayList<>();methods(list1);methods(list2);methods(list3);
// methods(list4); //报错method2(list1);}private static void method2(ArrayList<? super Zi> list) {//创建表示可以传递Zi或者Zi所有的父类类型}private static void methods(ArrayList<? extends Ye> list) {//创建的是一个表示可以传递Ye或者Ye所有的子类类型}}
class Fu extends Ye{}
class Ye{}
class Zi extends Fu{}
class Students{}
但是数据具备继承性:
ArrayList<Ye> list1 = new ArrayList<>();
list1.add(new Ye());
list1.add(new Fu());
list1.add(new Zi());
相关文章:

Java基础学习(10)
Java基础学习 一、JDK8时间类1.1 Zoneld时区1.2 Instant时间戳1.3 ZonedDateTime1.4 DateTimeFormatter1.5 日历类时间表示1.6 工具类1.7 包装类JDK5提出的新特性Integer成员方法 二、集合进阶2.1 集合的体系结构2.1.1 Collection 2.2collection的遍历方式2.2.1 迭代器遍历2.2.…...

Tomcat多实例部署实验
引言 本文主要内容是tomcat的多实例配置实验。 一、实验准备 Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,互不影响。多实例与虚拟主机不同,虚拟主机的本质是在一个服务下有多个相对独立的目录,但是多实…...

无良公司把我从上家挖过来,白嫖了六个月,临近试用期结束才说不合适,催我赶紧找下家!...
职场套路多,一不小心就会掉坑,一位网友讲述了自己的遭遇: 今天被领导催促离职了,当时就是这个领导把他从别的公司挖过来。这家公司催得太急,为了投奔这里,他和上家的HR都闹翻了,上家总监挽留他&…...

忙碌中也要记得休息,这两款好玩的游戏推荐给你
第一款:古墓丽影9年度版 《古墓丽影9》(原名Tomb Raider)是由水晶动力开发,史克威尔艾尼克斯发行的动作冒险游戏。 它于 2013 年发布。续集是古墓丽影崛起和古墓丽影暗影。 本作的重点是新版劳拉(Lara Croft…...

四种方法可以实现判断字符串包含某个字符
小编介绍过js中使用indexOf() 方法判断字符串包含某个字是一个很好用的方法,但除了这个方法之外,JavaScript中还有四种方法可以实现判断字符串包含某个字符: 1、使用字符串search() 方法 search() 方法用于检索字符串中指定的子字符串&…...

ubuntu进程相关command
列出当前系统中所有正在运行的进程的详细信息 ps aux查看所有包含某关键字的进程 例:查看所有包含关键字click的进程 ps aux | grep click运行后显示如下信息: root 8998 0.0 0.0 10984 4052 ? S 4月23 0:00 sudo ./bin/click…...

7.参数校验
在controller和service进行前端传参校验,保证存到数据库的数据是正确的 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>这里无需…...

nginx简单介绍
文章目录 1. 下载并解压2. 80端口被占用,更改nginx默认的监听端口3. 访问nginx4. 在linux上安装nginx5. nginx常用命令6. nginx.conf 1. 下载并解压 官网下载 2. 80端口被占用,更改nginx默认的监听端口 更改conf/nginx.conf文件 3. 访问nginx ht…...

美创科技首届渠道高峰论坛| 两大分论坛亮点汇聚
4月22日,美创科技首届渠道高峰论坛在海南三亚隆重举行,本届高峰论坛以“新起点 新战略 共赢数安蓝海”为主题,全国各地200余家合作伙伴齐聚。当日下午,行业分论坛、技术分论坛两大论坛以及圆桌会议,多方视角、全方位共…...

QML中【预计符号】和【Unknown Component M300】的红色警告解决方法
问题描述: QML的项目中带中文,每次打开项目都在问题栏显示【预计符号】的红色警告,还有一种是【Unknown Component M300】的警告,代码能正常编译和运行。像我这样对代码追求优雅的强迫症患者看着很不爽,查了很多网上的…...

聊聊「低代码」的实践之路
区块链、低代码、元宇宙、AI智能; 01 【先来说说背景】 这个概念由来已久,但是在国内兴起,是最近几年; 低代码即「Low-Code」; 指提供可视化开发环境,可以用来创建和管理软件应用; 简单的说…...

(一)服务发现组件 Eureka
1、Eureka 简介 Eureka 是Spring Cloud Netflix 微服务套件中的一部分, 它基于Netflix Eureka 做了二次封装, 主要负责完成微服务架构中的服务治理功能。我们只需通过简单引入依赖和注解配置就能让Spring Boot 构建的微服务应用轻松地与Eureka 服务治理…...

学会笔记本电脑录屏快捷键,轻松实现录屏!
案例:笔记本电脑录屏有快捷键吗? 【我每次打开笔记本电脑录屏都要耗费比较长的时间,这样会影响到我录屏的效率。在这里想问一下,有没有快速打开电脑录屏的方法?】 在日常的工作、学习、娱乐中,我们经常需…...

( “树” 之 Trie) 208. 实现 Trie (前缀树) ——【Leetcode每日一题】
知识点回顾 : Trie,又称前缀树或字典树,用于判断字符串是否存在或者是否具有某种字符串前缀。 ❓208. 实现 Trie (前缀树) 难度:中等 Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构ÿ…...

算法训练Day40:343. 整数拆分 96.不同的二叉搜索树
文章目录 整数拆分题解(动态规划)贪心 不同的二叉搜索树题解 整数拆分 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (62.22%)11660--0 Tags 数学 | 动态规划 Companies 给定一个正整数 n ,将其拆分为…...

设计模式及代码
1、工厂方法模式(Factory Method Pattern): 定义一个用于创建对象的接口,让子类决定实例化哪一个类。应用场景:当一个类不知道它所必须创建的对象的类时;一个类希望由它的子类来指定它所创建的对象时。 抽…...

9.java程序员必知必会类库之加密库
前言 密码学在计算机领域源远流长,应用广泛。当前每时每刻,每一个连接到互联网的终端,手机,电脑,iPad都会和互联网有无数次的数据交互,如果这些数据都是明文传输那将是难以想象的。为了保护用户隐私&#…...

C技能树:for循环:九九乘法表
使用for循环,打印九九乘法表。下列四个选项中有一项无法实现该功能,请找出该错误选项。 #include <stdio.h> int main(int argc, char** argv) {int i 0;int j 0;(_____1_____)return 0; } int row 0; int col 0; for(i 0; i < 8…...

Win10老是蓝屏收集错误信息重启无效怎么办?
Win10老是蓝屏收集错误信息重启无效怎么办?有用户遇到了电脑开机蓝屏的情况,收集错误信息重启电脑之后,依然无法解决问题。那么这个问题要怎么去进行解决呢?接下来我们来看看以下具体的处理方法教学吧。 准备工作: 1、…...

Redis入门学习笔记【五】Redis在分布式环境下常见的应用场景
一、分布式锁 当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的操作或者访问。 与之对应有线 程锁,进程锁。 分布式锁可以避免不同进程重复相同的工作,减少资源浪费。 同时分布式锁可以避免破坏数据正 确性的发生, …...

Python ZIpFile 解惑:GBK 编码与乱码现象
文章目录 参考描述铺垫乱码现象编码与解码编码解码 字符集Unicode 字符集UTF-8CP437Zip 文件与 CP437 编码 GB2312GB2012GBK 单字节编码与多字节编码 溯源通用标志位与语言编码标志ZipFile 所支持的两种编码方式GBK 编码与 Zip 应用乱码现象产生的原因 解决 参考 项目描述维基…...

【LeetCode】213. 打家劫舍 II
213. 打家劫舍 II(中等) 思路 这道题是 198.打家劫舍 的拓展版,区别在于:本题的房间是环形排列,而198.题中的房间是单排排列。 将房间环形排列,意味着第一间房间和最后一间房间不能同时盗窃,因…...

从初识RabbitMQ到安装了解
一、同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,但是你却不…...

MySQL(六)-字符串函数的使用解析
字符串函数的使用解析 1 计算字符串字符数的函数和字符串长的函数2 合并字符串函数 CONCAT(s1,s2,...)、CONCAT_WS(xs1,s2,...)3 替换字符串函数INSERT(s1,x,len,s2)4 字母大小写转换函数5 获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)6 填充字符串的函数 LPAD(s1,len,s2)…...

Zookeeper集群搭建
搭建Zookeeper集群 1.1 搭建要求 真实的集群是需要部署在不同的服务器上的,但是在我们测试时同时启动很多个虚拟机内存会吃不消,所以我们通常会搭建伪集群,也就是把所有的服务都搭建在一台虚拟机上,用端口进行区分。 我们这里要…...

【计算机视觉 | 目标检测】OVD:Open-Vocabulary Object Detection 论文工作总结(共八篇)
文章目录 一、2D open-vocabulary object detection的发展和研究现状二、基于大规模外部图像数据集2.1 OVR-CNN:Open-Vocabulary Object Detection Using Captions,CVPR 20212.2 Open Vocabulary Object Detection with Pseudo Bounding-Box Labels&…...

C++入门基础知识[博客园长期更新......]
0.博客园链接 博客的最新内容都在博客园当中,所有内容均为原创(博客园、CSDN同步更新)。 C知识点集合 1.命名空间 在往后的C编程中,将会存在大量的变量和函数,因为有大量的变量和函数,所以C的库会非常多。那么在C语言编程中&a…...

( “树” 之 BST) 501. 二叉搜索树中的众数 ——【Leetcode每日一题】
二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点。 二叉查找树中序遍历有序。 ❓501. 二叉搜索树中的众数 难度:简单 给你一个含重复值的二叉搜索树(BST)的根节点 root…...

openharmony内核中不一样的双向链表
不一样的双向链表 链表初识别遍历双向链表参考链接 链表初识别 最近看openharmony的内核源码时看到一个有意思的双向链表,结构如下 typedef struct LOS_DL_LIST{struct LOS_DL_LIST *pstPrev; //前驱节点struct LOS_DL_LIST *pstNext; //后继节点 }LOS_DL_LIST;不…...

大文件删除不在回收站里怎么找回
在日常办公中,总会有一些新的文件产生,和用完后的文件清理掉。有时候不小心误删文件也是常有的事。但如果大文件删除不在回收站里怎么找回呢?遇到的小伙伴们请不要别急,只要按照下面的方法做就行了。 正常情况下删除会进入到回收站中&#x…...