Java
文章平均质量分 85
星空是梦想
广州程序员一枚~
展开
-
美团技术读后感系列——LruCache原理及实现过程
LruCache介绍LruCache采用的缓存算法为LRU(Least Recently Used),即最近最少使用算法。这一算法的核心思想是当缓存数据达到预设上限后,会优先淘汰近期最少使用的缓存对象。LruCache内部维护一个双向链表和一个映射表。链表按照使用顺序存储缓存数据,越早使用的数据越靠近链表尾部,越晚使用的数据越靠近链表头部;映射表通过Key-Value结构,提供高效的查找操作,通过键值可以判断某一数据是否缓存,如果缓存直接获取缓存数据所属的链表节点,进一步获取缓存数据。原创 2022-05-02 20:30:09 · 1449 阅读 · 0 评论 -
BitSet解决大数据量处理内存占用大的问题
一、背景 想象一个场景,如果我们有一个需求是要安排工作人员对CSDN发布的文章做人工审核,且每天的审核工作人员可能不一样(因为调班、请假等原因),那么我们就需要记录每天的工作排班,记录当天排班的审核人员账号,存储格式如图的account字段,以逗号分割,代表当天的审核人员的ID。然后我们每天都要对账号进行处理,判断某个工作人员的账号是否在当天的排班当中,来决定是给该工作人员分配审核任务。二、遇到的问题处理账号时,内存占用大 在安排当天的排班时,我们要从MySQL取出账号字符串“1,2,3,4,原创 2022-04-04 22:35:57 · 2576 阅读 · 2 评论 -
理解包装类 Integer 的底层实现,教你破解所有面试难题!
Integer 是最常用的包装类之一,面试官特别喜欢结合 equals() 和 == 来问问题。那么 Integer 究竟应该怎么学才算是掌握呢?应该掌握哪些知识点呢?简单介绍首先先聊一下什么是包装类。在Java中有 8 大基本数据类型,每个数据类型都有对应的包装类,包装类的作用就是将数据封装成类和对象,同时赋予了包装类很多实用的方法来操作这些数据,一句话总结就是,包装类提供了处理基本数据类...原创 2020-03-30 20:38:40 · 750 阅读 · 0 评论 -
ConcurrentHashMap 底层原理,你真的理解了吗?
ConcurrentHashMap 是 HashMap 的线程安全版本,与之前版本的ConcurrentHashMap实现来看,java 8中做了较大调整,本文仅分析java 8的实现,java 8 之前的实现暂不做分析。简单介绍为了更好的导入本文,首先展示一下ConcurrentHashMap的结构,请看下面的图片:和 HashMap 一样,ConcurrentHashMap 使用了一个...原创 2020-03-27 16:57:30 · 688 阅读 · 0 评论 -
学透 LinkedList 底层实现原理,狂虐面试官!
前言:面试时被问到 LinkedList 的底层实现,瞬间哑口无言,所以决定狠狠地啃一下Java源码,目标就是吊打面试官!好了,废话不多说。简单介绍原创 2020-03-26 11:01:40 · 868 阅读 · 2 评论 -
小学生也能看懂的ArrayList底层原理
简单介绍ArrayList是 Java 集合框架中比较常用的数据结构,底层基于数组实现,能够实现容量的动态变化。我们之所以使用它,与它能够自由添加、删除元素有关,使用者不用考虑数组的容量、遍历等问题,可以说是一个功能强大、使用简单的数组。那么ArrayList里面到底是怎么实现的呢?ArrayList的成员变量了解一个类,我们需要先了解它有哪些变量,通过这些成员变量我们能够大致了解它的实...原创 2020-03-25 21:16:05 · 250 阅读 · 0 评论 -
千万级测试String、StringBuffer和StringBuilder的速度
面试是经常被问到String、StringBuilder和StringBuffer三者的速度有什么区别,经过测试后,这三者的执行速度关系是:StringBuilder > StringBuffer > String,测试过程如下:public class TestStringTools { public static void main(String[] args) { ...原创 2020-03-25 10:18:28 · 604 阅读 · 0 评论 -
HashMap遍历有序性问题——map.entrySet()的无序性
在LeetCode刷题的时候,在一道返回 字符串中最早出现的只出现一次的字符下标的题目中,使用大HashMap的遍历方式,我选择了使用map.entrySet()获取节点集合的方式进行遍历。题目和代码如下:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)本来以为越早插入的数据...原创 2020-03-18 22:01:11 · 4220 阅读 · 2 评论 -
静态代码块、非静态代码块和构造方法
执行顺序:静态代码块 > 非静态代码块 > 构造方法示例:public class Test { { System.out.println("not static run"); } static { System.out.println("static run"); } public Test() { System.out.println("constru...原创 2019-12-07 11:28:24 · 238 阅读 · 0 评论 -
遍历hashmap 的四种方法
以下列出四种方法public static void main(String[] args) {Map<String,String> map=new HashMap<String,String>(); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3"); ...原创 2019-11-27 22:48:03 · 158 阅读 · 0 评论 -
openJDK之如何下载各个版本的openJDK源码
1、如果我们需要阅读openJDK的源码,那么需要下载,那么该去哪下载呢?2、现在JDK已经发展到版本10了,11已经处于计划中,如果需要特定版本的openJDK,它们的下载链接在哪呢?1.openJDK的项目链接:http://hg.openjdk.java.net/,如下图1所示2.下载openJDK源码以下载openJDK8为例。2.1 点击图1中的jdk8u,就得到如下图2所...原创 2019-11-15 13:11:11 · 897 阅读 · 0 评论 -
Java实现线程安全的几种方式
文章目录一、不可变二、互斥同步三、非阻塞同步1. CAS2. AtomicInteger3. ABA四、无同步方案1. 栈封闭2. 线程本地存储(Thread Local Storage)3. 可重入代码(Reentrant Code)多个线程不管以何种方式访问某个类,并且在主调代码中不需要进行同步,都能表现正确的行为。线程安全有以下几种实现方式:一、不可变不可变(Immutable)的对...原创 2019-11-11 22:23:20 · 2354 阅读 · 0 评论 -
Java内存模型三大特性
一、原子性Java 内存模型保证了 read、load、use、assign、store、write、lock 和 unlock 操作具有原子性,例如对一个 int 类型的变量执行 assign 赋值操作,这个操作就是原子性的。但是 Java 内存模型允许虚拟机将没有被 volatile 修饰的 64 位数据(long,double)的读写操作划分为两次 32 位的操作来进行,即 load、st...原创 2019-11-11 21:37:07 · 689 阅读 · 0 评论 -
主内存和工作内存交互
Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互操作。read:把一个变量的值从主内存传输到工作内存中load:在 read 之后执行,把 read 得到的值放入工作内存的变量副本中use:把工作内存中一个变量的值传递给执行引擎assign:把一个从执行引擎接收到的值赋给工作内存的变量store:把工作内存的一个变量的值传送到主内存中write:在 store 之后...原创 2019-11-11 20:37:42 · 335 阅读 · 0 评论 -
J.U.C - 其它组件
FutureTask可用于异步获取执行结果或取消执行任务的场景。当一个计算任务需要执行很长时间,那么就可用 FutureTask 来封装该任务,主线程在完成自己的任务之后再去获取结果。在介绍 Callable 时我们知道它可以有返回值,返回值通过 Future 进行封装。FutureTask 实现了 RunnableFuture 接口,该接口继承自 Runnable 和 Future 接口,这...原创 2019-11-11 20:29:39 · 136 阅读 · 0 评论 -
J.U.C - AQS
java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J.U.C 的核心。AbstractQueuedSynchronizer采用了出口协议的概念,位于java.util.concurrent包下的大部分状态依赖类都构建于它之上。一、CountDownLatch是一个同步工具类,它允许一个或多个线程等待,直到其他线程执行完之后再执行。它维护了一个计数器...原创 2019-11-11 20:19:12 · 160 阅读 · 0 评论 -
Java线程之间的协作
当多个线程可以一起工作去解决某个问题时,如果某些部分必须在其它部分之前完成,那么就需要对线程进行协调。join()在线程中调用另一个线程的 join() 方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。对于以下代码,虽然 b 线程先启动,但是因为在 b 线程中调用了 a 线程的 join() 方法,b 线程会等待 a 线程结束才继续执行,因此最后能够保证 a 线程的输出先于 b 线程...原创 2019-11-11 20:05:48 · 146 阅读 · 0 评论 -
Java的互斥同步机制
Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock。synchronized1.同步一个代码块public void func() { synchronized (this) { // ... }}它只作用于同一个对象,如果调用两个对象上...原创 2019-11-11 19:53:22 · 472 阅读 · 0 评论 -
理解Java多线程高并发Executor框架的使用
Java提供了丰富的多线程接口给我们使用,下面这张图展示的我理解的之所以要用多线程高并发处理任务的关系图:Executor框架和其扩展接口ExecutorService为我们提供了管理线程池的一些方法(如shutdown()、shutdownNow() 和submit(Runnable task) );Executors类给我们提供了很多创建线程池的静态方法:(newCachedThread...原创 2019-11-11 19:32:24 · 196 阅读 · 0 评论 -
Comparable和Comparator接口时干什么的?列出它们的区别
一、对Comparable 的解释Comparable是一个排序接口此接口给实现类提供了一个排序的方法,此接口有且只有一个方法public int compareTo(T o);compareTo方法接受任意类型的参数,来进行比较list或者数组实现了这个接口能够自动的进行排序,相关类的方法有Collections.sort(),Arrays.sort();SortedMap 接口的...原创 2019-11-09 21:30:36 · 1024 阅读 · 0 评论 -
如何通过反射创建对象
通过反射创建对象的两种方法:通过Class字节码对象newInstance();(默认通过无参构造创建)通过获取构造器getConstructor(Class<?>…parameterTypes);(通过有参的构造器,参数可以指定具体类型和多个数量)代码:假设我们有一个用户类Userpackage test.java.zxj.test_project; pub...原创 2019-11-09 20:12:20 · 3736 阅读 · 0 评论 -
extends 和super 泛型限定符-上界不存下界不取
Java的<? extends T>和<? super T>是泛型中的“通配符”和“边界”的概念。<? extends T>:是指 “上界通配符”<? super T>:是指 “下界通配符”为什么要用通配符和边界?使用泛型的过程中,经常出现一种很别扭的情况。比如按照题主的例子,我们有Fruit类,和它的派生类Apple类。cla...原创 2019-11-09 19:02:50 · 906 阅读 · 1 评论 -
volatile关键字和Java线程安全问题
一、java中的线程安全问题我们都知道,Java是一种夸平台的语言,因此Java这种语言在处理线程安全问题的时候,会有自己的处理机制,例如volatile关键字,synchronized关键字,并且这种机制适用于各种平台。Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不...原创 2019-11-05 20:23:15 · 183 阅读 · 0 评论 -
Hash类的键值对允不允许为空的问题
Hash家族嘛,高逼格,必须一次性两个值存储,就是所谓的键值对。但是呢,Hash家族内部分为了几个小家族,分别是HashMap,Hashtable,TreeMap。这几个家族呢,对键值对能不能存储null这种不是很安全的"买卖"有不一样的行动。其中的HashMap家族与Hashtable、TreeMap不同,认为没有风险就没有利润!于是乎,准许自己的键值对都可以为null!Hashtabl...原创 2019-04-21 07:10:23 · 1077 阅读 · 0 评论 -
重写equals()和hashcode()方法详解
本文将通过一个示例程序来深入讲解java的equals()方法1、示例程序: 1 package cn.galc.test; 2 3 public class TestEquals { 4 public static void main(String[] args) { 5 /** 6 * 这里使用构造方法Cat()在堆内存里面new出了...原创 2019-04-10 08:28:40 · 605 阅读 · 0 评论 -
浅谈String str = "" 和 new String()的区别
String a = “test”;String b = "test";这样a和b是不同的字符串变量,栈地址不同,但是这两个引用指向的堆地址是一样的。equals结果为false,==结果为false。String a = new String("test"); String b = new String("test");这样a和b也是不同的字符串变量,栈地址不同,而且两个引用指向的堆地址也不一样。equals结果为true,==结果为false。转载 2019-04-10 08:14:38 · 648 阅读 · 1 评论 -
Java中的可变参数方法
1、一个小例子:为了比较直观地说明Java的可变参数方法,我们举个例子://求若干个整型数中的最大值public int getMax(int... items){ //定义可变参数items int max = Integer.MIN_VALUE; //次数为int能表示的最小值,值为-2147483648 for(int item : items...原创 2019-04-13 11:22:53 · 2471 阅读 · 0 评论 -
Java的四种包访问权限
Java的四种包访问权限如下:privatedefaultprotectedpublic同一类√√√√同一包√√√不同包的子类√√不同包的非子类√原创 2019-04-09 13:44:08 · 683 阅读 · 0 评论 -
Calendar类和GregorianCalendar类
GregorianCalendar类是Calendar类的子类。Calendar类:Calendar类是一个抽象类(不能直接创建实例),Calendar类如果要创建实例,必须通过getInstance方法构造Calendar的子类对象Calendar.getInstance();注:该方法返回Calendar类的子类对象;为什么说『返回Calendar类的子类对象』?首先Calendar...原创 2019-03-23 10:10:27 · 1269 阅读 · 0 评论 -
Java基础知识
目录1、第一个java程序2、java的注释3、java的数据类型整数: 浮点数: char类型数: 布尔类型数:4、java的变量5、运算符6、字符串1、字符串拼接:2、检测字符串是否相等:3、空串和null串:4、不可变字符串:5、代码点和代码单元:6、字符串 API:7、构造字符串:7、...原创 2019-03-19 07:42:54 · 378 阅读 · 0 评论 -
Java包装器类及自动装箱(自动打包)
1、为什么需要包装类?Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。2、Java中常见的包装类?基本数据类型包装类byteB...原创 2019-03-21 21:28:05 · 208 阅读 · 0 评论 -
Java异常分类
Java的Throwable类:Java中所有异常和错误的父类,只有作为此类(或其一个子类)的实例,才能由Java虚拟机抛出,或者可以由Java throw语句抛出。Throwable有两个子类Error和Exception。1、Error :是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。2、Exception :是程序本身...原创 2019-03-21 20:47:24 · 135 阅读 · 0 评论 -
静态代码块 构造代码块 构造方法的执行顺序
今天我总结了一下java中静态代码块 构造代码块 构造方法的执行顺序及其注意问题执行顺序:静态代码块>构造代码块>构造方法体首先要知道静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载当时做了这么一个小案例(想必这个大多数学java的都做过,不知道是否都理解了)class Fu{ static { System.out.pr...转载 2019-04-21 21:20:27 · 1751 阅读 · 0 评论 -
java 基本数据类型及自动类型转换
1、Java的8种基本数据类型及其所占空间大小:基本数据类型所占空间boolean8bit/1bytebyte8bit/1bytechar16bit/2byteshort16bit/2bytefloat32bit/4byteint32bit/4bytelong64bit/8bytedouble64bit/8byte...转载 2019-04-21 21:43:07 · 1071 阅读 · 0 评论 -
java对象的浅克隆和深克隆
若克隆对象中存在引用类型的属性,深克隆会将此属性完全拷贝一份,而浅克隆仅仅是拷贝一份此属性的引用。深克隆有两种方式:clone方法的嵌套调用、序列化和反序列化。转载 2019-04-26 10:00:45 · 191 阅读 · 0 评论 -
java构建简单的HTTP服务器
java构建简单的HTTP服务器原创 2019-10-10 08:26:28 · 164 阅读 · 0 评论 -
Java 泛型方法
在java中,泛型类的定义非常简单,但是泛型方法就比较复杂了。尤其是我们见到的大多数泛型类中的成员方法也都使用了泛型,有的甚至泛型类中也包含着泛型方法,这样在初学者中非常容易将泛型方法理解错了。泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型 。/** * 泛型方法的基本介绍 * @param tClass 传入的泛型实参 * @return...转载 2019-07-22 00:06:03 · 323 阅读 · 0 评论 -
java实例变量,局部变量,类变量和final变量
实例变量: 定义在类中的变量是类的成员变量,可以不进行初始化, java 会自动进行初始化。(如果是引用类默认初始化为 null, 如果是基本类型,默认初始化为 0 )局部变量 :定义在方法中的变量,必须进行初始化,否则不通过编译。类变量 :(也叫作静态变量)是类中独立于方法之外的变量,用 static 修饰。final 修饰的变量: 也称为常量。原创 2019-05-13 07:50:29 · 792 阅读 · 0 评论 -
面向对象之多态(向上转型与向下转型)
面向对象之多态(向上转型与向下转型)转载 2019-05-06 21:57:55 · 283 阅读 · 0 评论 -
为什么用接口声明对象而不是用类声明对象?
Java 中到底是应该用接口类型 还是实现类的类类型去引用对象?转载 2019-05-06 22:00:15 · 2220 阅读 · 0 评论