
Java
努力不停努力
我要成为自己眼中最耀眼的一束光
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
java LRU缓存实现
LRU缓存实现LinkedHashMap源码剖析继承LinkedHashMapLinkedHashMap源码剖析继承LinkedHashMap可以通过继承 LinkedHashMap 实现 LRU 缓存结构。代码如下:public class LRUCache<K, V> extends LinkedHashMap<K, V> { private final int MAX_ENTRIES; public LRUCache (int maxEntries)原创 2021-03-29 15:03:13 · 154 阅读 · 1 评论 -
Java Map 按值 (value) 排序
可以使用 LinkedHashMap 和 List,之所以使用 LinkedHashMap 是因为 LinkedHashMap 是有序的,这里的有序是指 LinkedHashMap 会维护 entry 插入的顺序。LinkedHashMap<String, Integer> map = new LinkedHashMap<>();/** * 在此处对LinkedHashMap进行赋值操作 */Set<Map.Entry<String, Integer>&g原创 2021-03-27 14:03:54 · 696 阅读 · 0 评论 -
Spring单例模式
Spring单例模式的核心使用注册表实现。如下: /** Cache of singleton objects: bean name --> bean instance */ /** 已经在缓存里的单例对象实例,使用ConcurrentHashMap存储。 */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); /** Cache of singlet原创 2021-03-08 13:44:38 · 362 阅读 · 0 评论 -
线程创建,并发,信号量,可重入锁 加例题(Leetcode1116)详解
例题:Leetcode1116. Print Zero Even Odd 无锁并发信号量可重入锁(ReentrantLock)和条件变量(Condition)例题三个条件变量的解法例题一个条件变量的解法(使用signalAll())线程创建无锁并发class ZeroEvenOdd { private int n; // volatile变量用来控制各个方法的输出顺序 private volatile int state; public ZeroEvenOdd(int原创 2021-03-05 18:11:56 · 321 阅读 · 0 评论 -
Java并发相关知识
原文链接守护线程是程序运行时在后台提供服务的线程(级别较低),不属于 程序中不可或缺的部分。当所有非守护线程结束时,程序也就终止,不管守护线程有没有结束,程序都会终止,同时会杀死所有守护线程。main() 属于非守护线程。在线程 启动之前 使用 setDaemon() 方法可以将一个线程设置为守护线程。public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thre原创 2021-03-04 18:13:34 · 210 阅读 · 1 评论 -
volatile关键字
一个volatile变量,它将具备两项特性:保证此变量对所有线程的可见性。当一个线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。由于Java里面的运算操作符并非原子操作,导致volatile变量的运算在并发下一样是不安全的。禁止指令重排序优化,普通的变量仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码中的执行顺序一致。具体见《深入理解Java虚拟机第三版》第12章...原创 2021-03-03 14:31:52 · 103 阅读 · 2 评论 -
i++和++i
参考链接参考链接总结:i++和++i都不是原子操作。原创 2021-03-02 23:51:28 · 143 阅读 · 0 评论 -
单例模式的实现
注意:Singleton的构造函数不应该是public的,而应该是private的。但是为了方便我们实验,所以才用public。参考链接:为什么推荐用枚举实现单例模式transient关键字的使用需要先弄清楚加载与类加载的区别,类初始化和类实例化的区别,还有 volatile 关键字:《深入理解Java虚拟机第三版》第七章(类加载)、第十二章(volatile); 饿汉式实现:懒汉式实现静态内部类方法双重锁实现枚举方法实现(被《Effective Java》强烈推荐)饿汉式原创 2021-03-02 21:57:24 · 155 阅读 · 0 评论 -
Java方法句柄
使用方法句柄可以在孙子类直接调用祖父类的函数。public class Test3 { class GrandFather { void thinking() throws NoSuchFieldException { System.out.println("i am grandfather"); } } class Father extends GrandFather { void thinking()原创 2021-03-01 12:16:40 · 322 阅读 · 0 评论 -
Java虚拟机:静态分派和动态分派
参考资料《深入理解java虚拟机(第3版)》目录静态分派和重载重载方法匹配优先级动态分派与重写字段永远不会参与多态静态分派是多分派,动态分派是单分派静态分派和重载public class StaticDispatch { static abstract class Human { } static class Man extends Human { } static class Woman extends Human{ } publi原创 2021-02-28 15:52:12 · 289 阅读 · 2 评论 -
java 基本型和包装类型
原题链接基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true; int a = 220; Integer b = 220; System.out.println(a==b);//true两个Integer类型进行“==”比较, 如果其值在-128至127 ,那么返回true,否则返回false, -128<= x<=127的整数,将会直接缓存在Inte原创 2021-02-24 14:55:21 · 102 阅读 · 0 评论 -
java变量初始化
类变量(静态变量),在方法区分配,属于类本身的属性。有默认值,引用类型的默认值是null,基本数据类型,int就是0,char就是’\u0000‘等。成员变量,在堆上分配,属于某个实例。有默认值,引用类型的默认值是null,基本数据类型,int就是0,char就是’\u0000‘等。局部变量,在栈上分配,就是在栈的局部变量表中。随着栈帧的出栈而消失。第一次调用前,必须先初始化。没有默认值。注意,类变量和成员变量一旦被final修饰,必须在声明的时候就显式初始化,这个时候默认值无效。final修饰局部变原创 2021-02-24 14:40:49 · 132 阅读 · 0 评论 -
Java Math.round()
具体规则应该是原数加0.5然后向下取整。System.out.println(Math.round(7.5) + " " + Math.round(-7.5)); // 8 -7System.out.println(Math.round(7.5) + " " + Math.round(-7.6)); // 8 -8System.out.println(Math.round(7.5) + " " + Math.round(-7.4)); // 8 -7...原创 2020-12-22 22:15:27 · 155 阅读 · 0 评论 -
java泛型:泛型数组
一段很有趣的代码//List<String>[] lsa = new List<String>[10]; // Not really allowed. List<?>[] lsa = new List<?>[10]; // OK, array of unbounded wildcard type. Object o = lsa; Object[] oa = (Object[]) o; List<Integer> l原创 2020-12-02 23:43:33 · 121 阅读 · 0 评论 -
java== 和 equals的区别
== 比较的是变量(栈)内存中存放的对象的 (堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。若类没有重写equals()方法,则默认调用Object的equals()方法,如下:String类等重写了equals()方法,String的equals()比较的是String的内容。...原创 2020-11-11 23:11:56 · 96 阅读 · 0 评论 -
Java:当需要创建链表并返回头结点的时候
创建链表,或者改变已有链表的时候,如果我们只声明了一个结点,这个结点需要不断地往链表尾部移动,最后我们无法返回该结点作为头结点。此时,我们可以用下面这个方法来解决这个问题。(注意看注释部分)可以参考leetcode算法题23. 合并K个排序链表中的分治算法解法,将会遇到这个问题,可以用这个方法来解决。class ListNode { int val; ListNode nex...原创 2020-04-29 15:41:40 · 1097 阅读 · 0 评论 -
.class.getResource() 和 .class.getClassLoader().getResource() 的区别
转载文章总结:.class.getResource() 和 .getClassLoader().getResource() 的区别,就是在加载资源文件的时候,加载方式的不同。.class.getResource("/") == .class.getClassLoader().getResource("")两者都是从ClassPath根下任意路径获取资源。.class.getResourc...原创 2020-04-25 15:14:45 · 427 阅读 · 0 评论 -
关于.getClass()和.class的区别
转载转载 2020-04-22 14:37:44 · 170 阅读 · 0 评论 -
JAVA基础疑点难点笔记
JAVA疑点难点笔记泛型反射泛型public List fuck(T …) …<T>是申明T为泛型,以区别于类名,List<T>才为返回类型反射Class类中的getDeclaredField()函数是可以获取一个类的所有字段.Class类中的getField()函数只能获取类的public 字段Field类中的setAccessible(true)...原创 2020-04-03 20:26:55 · 205 阅读 · 0 评论