java
- 线程
- String的方法
- 工具类
- 关键字
- Java类的三大特性总结
- 什么是java的多态
- java集合
- 多线程并发和并行的区别
- Integer和int的区别?在什么时候用Integer和什么时候用int
- 重构和重写和重载
- Double为什么会丢失精度?解决方法?
- Object的9个方法
- 线程、进程
- java IO
- 输入网址到网页显示的过程
- 如何提升服务器的响应速度
- 比较hashTable、hashMap、ConcurrentHashMap的查询速度
- 重载和重写
- List、map、set存取元素时,各有什么特点?
- 简述HashMap的实现原理
- 用Java实现简单的Map遍历示例
- 一条sql执行过长的时间,你如何优化,从哪些方面
- 随便说几个单例模式,并写一种线程安全的
- 扫描指定文件夹下所有以.txt结尾的文件,输出其绝对路径
- Java中抽象类和接口各自的使用场景
- spring依赖注入的方式有
- 数组是对象吗?是
- tomcat配置-修改tomcat默认的8080端口
- 数组属于一种原生类吗?
- finally中能够使用break和return吗
- 锁有哪些类型?
- 单例模式有哪些
- session的生命周期
- 关于==在Strin中的等值判断
- 算法
- Redis相关
- 消息队列
线程
-
join
join()方法的作用就是让主线程等待子线程执行结束之后再运行主线程,其中子线程强占cpu资源
https://blog.csdn.net/xiaozhu0301/article/details/111579801 -
CountDownLatch
允许一个或多个线程去等待其他线程完成操作,对线程的执行进行顺序规划
https://blog.csdn.net/hbtj_1216/article/details/109655995
原子操作类
内部使用cas+自旋锁的方式,是乐观锁,比传统的同步悲观锁更加有效率(reentrantLock和synchronized)
AtomicInteger
AtomicReference
锁的类型
自旋锁
- 是一种乐观锁,基于CAS实现
- 轻量级锁
java cas自旋锁_java教程:线程锁之自旋锁
原子包Atomic就是自旋锁的应用
偏向锁
- synchronize偏向锁底层实现原理
- 用于只有一个线程使用资源的情况,当有另一个线程争夺资源的时候就会转入轻量级锁
轻量级锁
使用cas+自旋锁,线程进行不断地自旋,当竞争线程过多时自旋次数会变多,当超过一定限度时就会转入重量级锁,否则将会过度的消耗系统资源
重量级锁
- 悲观锁,阻塞同步,互斥锁
- 适用于同步代码块的竞争很激烈(线程的竞争很激烈)的情况
- 系统开销很大,因为要从用户态转为内核态,所以适用于竞争激烈的情况
- 注意:
synchronized关键字并非一开始就加上重量级锁,也是从偏向锁,轻量级锁,重量级锁依次变化的过程
重量级锁 synchronized
偏向锁、轻量级锁、重量级锁的理解 及适用场景
可重入锁
公平锁
- 不根据阻塞队列中线程的顺序而被唤醒,获得锁
- 等待时间最长的线程先运行,即先进先出
非公平锁
- 根据先进先出的队列规则被唤醒,获得锁
常用的实现锁的方式
ReentrantLock
- 是一个实现了Lock接口的类
- ReenTrantLock可以选择非公平锁 false和公平锁 true
- 是可重入锁
- 默认为非公平锁
- 需要手动的释放和获取锁
- 不要将获取锁的过程写在try块中,因为如果获取锁时发生了异常,异常抛出的同时也会导致锁无故释放
源码分析
- 实现可重入
Sync为ReentranLock的一个抽象静态内部类,继承了AQS(AbstractQueuedSynchronizer),而AQS中的state变量用于实现可重入 - 实现公平与非公平
Sync有两个具体的实现类:NofairSync和FailSync用于实现公平与非公平
使用
- Java中ReentrantLock的使用
- lock()与lockInterruptibly()的区别
- Lock的lockInterruptibly()方法
- ReentrantLock的lock(), tryLock(), lockInterruptibly() 及使用场景示例
ReentantLock比synchronized增加了三大功能
1、等待可中断:等待可中断是指当持有锁的线程长期不释放锁,那么正在等待的线程可以选择放弃等待,转而处理其它事情。可中断的特性对于处理执行时间非常长的同步块有很好的帮助。
2、公平锁:公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来获得锁,可以理解为操作系统中的先来先服务。synchrnized是非公平锁,任何一个等待锁的线程都有可能获得锁,ReentrantLock默认情况下也是非公平的,但是可以通过构造函数来设定使用公平锁。
3、锁可以绑定多个条件:锁可以绑定多个条件是指ReentrantLock可以绑定多个Condition对象,而在synchronized中,锁对象的wait()、notify()、notifyAll()方法可以实现一个隐含的条件,如果要和多个条件进行关联时,就不得不多添加锁,而ReentrantLock则无需这样做,只需要多次调用newCondition()方法就可以实现。
Condition
- 和ReentrantLock搭配使用,可以有多个condition,常用于多个线程的交替执行,即进程间的相互通信
复制private static void alternateTask() {
ReentrantLock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Thread thread1 = new Thread(() -> {
try {
lock.lock();
for (int i = 65; i < 91; i++) {
System.out.println("----------thread1------- " + (char) i);
condition1.signal();
condition2.await();
}
condition1.signalAll();
} catch (Exception e) {
} finally {
lock.unlock();
}
});
Thread thread2 = new Thread(() -> {
try {
lock.lock();
for (int i = 0; i < 26; i++) {
System.out.println("----------thread2------- " + i);
condition2.signal();
condition1.await();
}
condition2.signalAll();
} catch (Exception e) {
} finally {
lock.unlock();
}
});
thread1.start();
thread2.start();
}
synchronized
- 独占锁
- 可重入
- 非公平锁
- ReentrantLock.Condition是在粒度和性能上都优于Object的notify()、wait()、notifyAll()线程通信的方式。
String的方法
String.format()
- 有点像c语言的printf,用于格式的转换
str = String.format("Hello %s%c","world",'!');
https://blog.csdn.net/wujian_csdn_csdn/article/details/113844887
String.indexOf()
String.valueOf(Object)
- 再toString的基础上对Object是否为null进行判断,如果为null则直接返回为null的字符串
toString()
-
将value转换为String,可以为Object或者基本类型
-
如果value为null,则报错空指针异常
-
null值可以被强制转换为任意类型
工具类
System
System.arraycopy(Object src,int srcPos, Object dest, int destPos, int length)
- src:被拷贝的数组
- srcPos:从被拷贝的数组的哪个位置开始拷贝
- dest:目标数组(想要获取拷贝数据的数组)
- destPos:被覆盖的数据的起始位置,即从哪个位置粘贴拷贝到的数据
- length:被覆盖的数据的长度,
int arr1[] = {0,1,2,3,4,5};
int arr2[] = {0,10,20,30,40,50,60,70,80};
System.arraycopy(arr1,0,arr2,1,arr1.length);
System.out.println(arr2);
Arrays.stream(arr2).forEach(System.out::println);
Collections
Collections.unmodifiableList(list)
将一个List变为不可变列表
Arrays
Objects
关键字
transient
- 变量被transient修饰后,变量不再是对象持久化的一部分,该变量内容在序列化后无法被访问,即序列化后的值为空
- transient只能修饰变量,不能修饰方法和类
- 注:static修饰的变量也不可被序列化
- Java中transient关键字的详细总结
Java类的三大特性总结
什么是java的多态
java集合
java集合超详解
多线程并发和并行的区别
Integer和int的区别?在什么时候用Integer和什么时候用int
- 通常在泛型的时候才用Integer,其他时候用处不多
- 绝大部分时候用int,需要以对象的形式存储数字时用Integer
(https://bbs.csdn.net/topics/330058628?page=2)
(https://blog.csdn.net/u012110719/article/details/46367365)
重构和重写和重载
Double为什么会丢失精度?解决方法?
(https://cloud.tencent.com/developer/article/1468551)
double的问题是从小数点转换到二进制丢失精度,
BigDecimal在处理的时候把十进制小数扩大N倍让它在整数上进行计算,并保留相应的精度信息
Object的9个方法
(https://blog.csdn.net/qq_33098049/article/details/82664061)
线程、进程
进程与线程的概念、区别和联系
java多线程同步方法
java多线程同步5种方法
Java并发编程:Synchronized及其实现原理
java使用多线程的几种方式和对比
线程的生命周期相关
JAVA面试题 线程的生命周期包括哪几个阶段?
Java线程生命周期以及方法详解
volatile关键字实现变量在线程间的同步功能,当一个线程更改了变量的值,volatile保证该值立刻被同步到主存中,在获取该变量值时也从主存中进行刷新。
sycnalized关键字实现函数及类的同步,volatile实现变量的同步
线程池
java的sleep、wait、yield、方法
Java线程sleep,yield,join,wait方法详解
Java中Wait、Sleep和Yield方法的区别
死锁产生的四个必要条件
锁升级过程
java IO
输入网址到网页显示的过程
(https://blog.csdn.net/u014527697/article/details/79340386)
Dns解析–>端口分析–>tcp请求–>服务器处理请求–>服务器响应–>浏览器解析—>链接关闭
如何提升服务器的响应速度
比较hashTable、hashMap、ConcurrentHashMap的查询速度
ConcurrentHashMap和HashTable都是线程安全的,ConcurrentHashMap的查询效率要高于HashTable
hashMap是线程不安全的
重载和重写
静态方法能够发生重载,不能重写
重载是在一个类进行的
List、map、set存取元素时,各有什么特点?
https://blog.csdn.net/zhong8888888800/article/details/105884109
简述HashMap的实现原理
https://blog.csdn.net/weixin_45302751/article/details/108337701
https://www.cnblogs.com/xwdreamer/archive/2012/05/14/2499339.html
用Java实现简单的Map遍历示例
一条sql执行过长的时间,你如何优化,从哪些方面
https://www.cnblogs.com/waitmoon/p/13799887.html
http://www.javashuo.com/article/p-dzxmtkyl-hx.html
随便说几个单例模式,并写一种线程安全的
https://blog.csdn.net/LZ15932161597/article/details/91876527
扫描指定文件夹下所有以.txt结尾的文件,输出其绝对路径
https://blog.csdn.net/ademen/article/details/84086707
Java中抽象类和接口各自的使用场景
https://blog.csdn.net/cjhc666/article/details/61926719
https://www.cnblogs.com/weiweiwei/p/13995174.html
spring依赖注入的方式有
https://blog.csdn.net/baidu_32739019/article/details/83657760
数组是对象吗?是
https://www.cnblogs.com/syxy/p/12347062.html
tomcat配置-修改tomcat默认的8080端口
https://blog.csdn.net/HRM108/article/details/78658894
数组属于一种原生类吗?
数组是一种对象不属于原生类
原生类有8种, int double boolean float byte short long char
finally中能够使用break和return吗
finally块中不允许使用return,continue或break的原因
锁有哪些类型?
https://blog.csdn.net/qq_22985751/article/details/79567157
单例模式有哪些
https://blog.csdn.net/LZ15932161597/article/details/91876527
session的生命周期
默认为30分钟
https://www.cnblogs.com/lukelook/p/11095113.html
关于==在Strin中的等值判断
String a="abc";
String b = "a"+new String("bc");
String c = "abc";
System.out.println(ac);
System.out.println(ab);
System.out.println(a.equals(b));
结果为:
true
false
true
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档