![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 71
淡淡的宁静
非宁静无以致远,非淡泊无以明志
展开
-
java.lang.ref.FinalizerReference引发的内存泄漏
这和GC的机制有关:实现了object的finalize()的类在创建时会新建一个FinalizerReference,这个对象是强引用类型,封装了override finalize()的对象,下面直接叫原对象。原对象没有被其他对象引用时(FinalizeReference除外),执行GC不会马上被清除掉,而是放入一个静态链表中(ReferenceQueue),有一个守护线程专门去维护这个链原创 2017-01-04 21:18:16 · 15718 阅读 · 2 评论 -
Java中GregorianCalendar的基本使用
使用默认时区即东八区: int ONE_SECOND = 1000; int ONE_MINUTE = 60*ONE_SECOND; int ONE_HOUR = 60*ONE_MINUTE; long ONE_DAY = 24*ONE_HOUR; long ONE_WEEK = 7*ONE_DAY...原创 2019-04-08 14:32:22 · 8712 阅读 · 0 评论 -
JVM常见面试题
1. 内存模型以及分区,需要详细到每个区放什么。栈区:栈分为java虚拟机栈和本地方法栈重点是Java虚拟机栈,它是线程私有的,生命周期与线程相同。每个方法执行都会创建一个栈帧,用于存放局部变量表,操作栈,动态链接,方法出口等。每个方法从被调用,直到被执行完。对应着一个栈帧在虚拟机中从入栈到出栈的过程。通常说的栈就是指局部变量表部分,存放编译期间可知的8种基本数据类型,及对象引...转载 2019-04-15 23:54:22 · 99 阅读 · 0 评论 -
JVM垃圾回收
两种对象存活判定算法:1.引用计数法:每个对象分配一个引用计数器,在引用数为0时,则可以回收。但是无法解决对象字段互相引用的情况,所以目前商用虚拟机中的垃圾回收器不使用此算法。2.可达性分析算法:首先枚举虚拟机运行时数据区中所有GC ROOT(虚拟机栈、本地方法栈中的引用,常量池的引用,静态变量引用可以作为GC ROOT);然后从GC ROOT开始分析引用链,如果对象不在引用链中,则表示G...原创 2019-04-18 12:35:16 · 166 阅读 · 0 评论 -
指令重排导致懒汉式单例模式失效
指令重排导致单例模式失效我们都知道一个经典的懒加载方式的单例模式:public class Singleton {private static Singleton instance = null;private Singleton() { }public static Singleton getInstance() {if(instance == null) {synch...转载 2019-04-24 19:29:30 · 841 阅读 · 0 评论 -
this引用逃逸(使用内部类获取未外部类未初始化完的变量),多态父类使用子类未初始化完的变量
1,this引用逃逸并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了。这是危及到线程安全的,因为其他线程有可能通过这个逸出的引用访问到“初始化了一半”的对象(partially-constructed object)。这样就会出现某些线程中看到该对象的状态是没初始化完的状态,而在另外一些线程看到的却是已经初始化完的状态,...转载 2019-04-24 23:43:32 · 347 阅读 · 0 评论 -
细说匿名内部类引用方法局部变量时为什么需要声明为final
一、前言 在研究公司某个项目的源码,看到前人使用了挺多内部类,内部类平时我用的比较多的是匿名内部类,平时用的多的是匿名内部类,其他形式的用的比较少,然后我就有个疑惑:到底内部类是基于什么样的考虑,才让java设计者搞这么一套实现?还有,平时在什么情境下会考虑使用内部类呢?这个我将在另外一篇博文进行介绍,详情参见:xxxxxx,本篇博文是在查阅内部类相关资料时,看到很多博文在解释为什么匿名内部...转载 2019-04-25 00:16:21 · 341 阅读 · 0 评论 -
final修饰的变量就是常量?final修饰局部变量在栈还是堆还是常量池中?
概念 常量池 常量池的好处 Class类文件中的常量池 常量池 运行时常量池 包装类常量池对象池 Java中装箱和拆箱 赋值时 方法调用时 方法运算时 参考概念什么是常量?对于这个问题,可能很多人都可以脱口而出 : 用final修饰的变量是常量 ,或者是在编译时期定义好的字符串。(字符串常量)但是这种说法是不严谨的,因为准确来说 : 常量是...转载 2019-04-25 00:17:49 · 14250 阅读 · 6 评论 -
HttpURLConnection的一些使用问题
1.getOutputStream和getInputStream返回的流都是用于输出或者输入报文实体的,而不是报文头部。2.请求行根据设置的请求方法和URL中的信息自动拼接,首部字段通过setRequestProperty()设置,会在connect()被调用时,输出并被缓冲起来3.通过OutputStream输出的实体,会被缓冲起来,所以content-length会自动计算,还有首部字...原创 2019-05-06 21:46:36 · 2848 阅读 · 0 评论 -
JDK中设计模式
本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图。首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助。一、设计模式是什么(1)反复出现问题的解决方案(2)增强软件的灵活性(3)适应软件不断变化二、学习JDK中设计模式的好处(1)借鉴优秀代码的设计,有助于提高代码设计能力(2)JDK的设计中体现了大多数设计模式,是学习设计模式的较好...转载 2019-05-15 21:14:28 · 115 阅读 · 0 评论 -
ArrayMap适用性小结
在Android源码中,不少地方都用了SparseArray和ArrayMap而不是HashMap。因为HashMap主要是速度优势,在有大量数据需要查询,并需要在极短时间内完成时且内存比较充裕,选择HashMap。但是在如手机这些嵌入式设备,内存是很有限的,所以需要一些以时间换空间的算法去实现的数据结构,而SparseArray和ArrayMap就是这种数据结构,算法原理非常相似,就是Spars...原创 2019-05-23 23:35:25 · 376 阅读 · 0 评论 -
OOm是否可以try catch
只有在一种情况下,这样做是可行的:在try语句中声明了很大的对象,导致OOM,并且可以确认OOM是由try语句中的对象声明导致的,那么在catch语句中,可以释放掉这些对象,解决OOM的问题,继续执行剩余语句。但是这通常不是合适的做法。Java中管理内存除了显式地catch OOM之外还有更多有效的方法:比如SoftReference, WeakReference, 硬盘缓存等。在J...转载 2019-06-08 21:06:43 · 4009 阅读 · 0 评论 -
Java类加载的加载,验证,准备,解析,初始化小结
一个类包括加载,验证,准备,解析,初始化,使用,卸载七个生命周期。加载阶段:1.获取Class文件的二进制字节流2.将二进制字节流对应的静态数据结构转换为方法区中的运行时数据结构(在放入方法区之前先进行文件格式验证)3.生成一个Class对象作为方法区中的运行时数据结构的入口(该对象放在方法区而不是堆中)验证阶段:1.文件格式验证:验证class文件二进制字节流是否符合Cl...原创 2019-06-09 00:35:30 · 1144 阅读 · 0 评论 -
Java内存模型
可见性:指一个线程修改了共享变量,其他线程可以马上看到这个修改。主存与工作内存Java内存模型中,有cpu,工作内存(高速缓存或寄存器),主存(RAM),主存即Java运行时数据结构(Java堆,java栈,方法区,本地方法区,本地方法栈),每个cpu对应一个工作内存。cpu执行指令时,需要某个操作数时,会从工作内存的变量副本中读取数据(use指令)。当cpu执行指令时,需要输出一...原创 2019-06-10 17:44:48 · 129 阅读 · 0 评论 -
类爆炸~设计模式、面向对象
以下是我对类爆炸的概念和类爆炸的产生的理解:类爆炸不是指类的具体数量的多少,而是指在实现一个功能时,类本来可以不用这么多,但是却设计成这么多,使得维护成本过高,明显高于设计的效用。类爆炸的产生原因我的理解可总结为以下几点1.我认为产生类爆炸主要是对于设计模式或者说面向对象原则的过度使用造成的,无论是面向拓展开放,面向修改封闭其他的一些面向对象设计原则的过度使用都是造成类爆炸的原因2...原创 2019-06-24 23:25:41 · 3925 阅读 · 1 评论 -
字符串怎样写会被写入常量池
String str1 = "iloveu"; final String str3 = "finalString"; /*final */String str5 = new String("newfinalString"); public void demo2(){ //TODO: 测试字符串怎样写会被写入常量池 String str2 ...原创 2019-07-07 11:53:28 · 487 阅读 · 0 评论 -
一次性搞清楚unicode、codepoint、代码点、UTF
最近在处理字符过滤,重新研究了下字符、unicode和代码点的相关知识,首先要说一下编码的基本知识unicodeunicode unicode是计算机科学领域里的一项业界标准,包括字符集、编码方案等。计算机采用八比特一个字节,一个字节最大整数是255,还要表示中文一个字也是不够的,至少需要两个字节,为了统一所有的文字编码,unicode为每种语言中的每个字符设定了统一并且唯一的二进制编...转载 2019-09-09 14:50:59 · 921 阅读 · 0 评论 -
Java用户级线程和核心级线程的区别是什么
以上内容转自:https://blog.csdn.net/qq_34173549/article/details/79564161#commentsedit下面是本人的理解小结:我的理解是每个进程持有多个轻型进程(即内核级线程),而java中Thread创建的线程是用户级线程。假设进程分配到了x个内核线程,而java进程中创建了y个用户级线程。那y个用户级线程将轮流关联到x个内核...转载 2019-03-28 14:23:02 · 2532 阅读 · 1 评论 -
Java并发之AQS详解(AbstractQueuedSynchronizer)
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大...转载 2019-04-10 23:08:31 · 123 阅读 · 0 评论 -
Java 序列化机制 -- 控制序列化的兼容性
serialVersionUID表示序列化版本简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastEx...转载 2019-03-27 12:21:07 · 906 阅读 · 0 评论 -
Java内存管理及内存泄漏分析总结
Android内存管理模型Android中的进程(1) native进程:采用C/C++实现,不包含dalvik实例的linux进程,/system/bin/目录下面的程序文件运行后都是以native进程形式存在的。如图 3,/system/bin/surfaceflinger、/system/bin/rild、procrank等就是native进程。(2) ...原创 2017-01-05 20:37:58 · 992 阅读 · 0 评论 -
Android SQLite数据库的使用小结
查询语句:select语句:WHERE 子句用于规定选择的标准。WHERE 子句如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。语法SELECT 列名称 FROM 表名称 WHERE 列 运算符 值下面的运算符可在 WHERE 子句中使用:操作符描述=等于不等于原创 2017-02-17 19:45:07 · 524 阅读 · 0 评论 -
Java反射机制的使用
AmigoEditText reflectEditTextFromAmigoSearchView(){ AmigoEditText amigoEditText = null; if(mAmigoSearchView != null){ Class amigoSearchViewClass = (Class )mAmigoSear原创 2016-12-15 22:05:01 · 430 阅读 · 0 评论 -
Class对象-单例
出处http://blog.csdn.net/typename/article/details/7212512java中把生成Class对象和实例对象弄混了,更何况生成Class对象和生成instance都有多种方式。所以只有弄清其中的原理,才可以深入理解。首先要生成Class对象,然后再生成Instance。那Class对象的生成方式有哪些呢,以及其中是如何秘密生成的呢?Clas转载 2017-08-09 20:58:36 · 786 阅读 · 0 评论 -
java并发编程之一
synchronized关键字synchronized(lock){ }:锁是lock对象的monitor。即使用的是loc的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的原创 2017-08-16 14:41:51 · 249 阅读 · 0 评论 -
java并发编程之五
Executor框架 Executor框架的类与接口 Executor框架的使用的示意图介绍ThreadPoolExcutor、ScheduledT原创 2017-09-04 22:30:40 · 218 阅读 · 0 评论 -
java并发编程之二
重入锁ReentrantLock支持同一线程重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此以外,该锁还支持获取锁时的公平和非公平性选择。不支持重进入的锁在实现tryAcquire()方法时没有考虑占有锁的线程再次获取锁的场景,而在调用tryAcquire()方法时返回false,导致该线程被阻塞。而synchronized关键字是支持重进入的锁,比如一个synchro原创 2017-08-17 22:47:23 · 214 阅读 · 0 评论 -
java并发编程之三
LockSupport工具LockSupport定义了一组公共静态方法,这些方法提供了最基本的的线程阻塞和唤醒功能。其他类实现阻塞和唤醒都会调用它。Condition接口类似java对象的等待/通知功能。回忆一下synchronized关键字的使用,利用java对象,实现锁的获取和释放synchronized(object){try{object.await();/原创 2017-08-31 21:43:23 · 246 阅读 · 0 评论 -
java并发编程之四
java并发框架之容器ConcurrentHashMapConcurrentHashMap比HashTable高效。HashTable的get方法和put使用同一把锁,使用的是synchronized同步方法。这样导致在别的线程访问put方法时,访问get方法的线程也会阻塞。而ConcurrentHashMap的get方法是不用加锁的。get是没有put那么大风险的,get只需保证原创 2017-09-03 16:08:39 · 231 阅读 · 0 评论 -
类加载器,ClassLoader
命名空间:•不同的类加载器具有不同的命名空间•同一命名空间内,类的名称具有惟一性•同一命名空间内,类之间可以直接交互•不同命名空间之间,除非显示的提供交互的机制,是不能交互的 类加载器:•启动类加载器(Bootstrap classloader)•扩展类加载器(Extended classloader)•系统类加载器(Application classloade...转载 2018-09-18 10:46:56 · 157 阅读 · 0 评论 -
Java按位取反运算符“~”
关于学习java中的按位取反(~)的问题2013年07月16日 00:21:51 daokai1993 阅读数:1468 标签: 新手 之前不知道按位取反到底是怎么计算的百度谷歌的半天 也没有什么具体的计算防暑 后来自己琢磨了一会儿 发现了一点按位取反的技巧 在此分享一下负数的取反 就是在原码的基础上取反码 然后在取补码(补码=反码+1)当反码的最后一位数已经为1的...转载 2018-12-13 10:04:50 · 2063 阅读 · 1 评论 -
Java并发编程:深入剖析ThreadLocal
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ Java并发编程:深入剖析ThreadLocal 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后...转载 2019-02-22 12:17:16 · 89 阅读 · 0 评论 -
Java容器(持续更新中)
ConcurrentModificationException在使用List.subList()取得subList后,可以使用subList修改List中的元素,但是如果List中做了修改操作,那么就不能再操作subList了(查询操作也不行),否则将报ConcurrentModificationException。因为List中有个modCount的字段,List每次有修改操作,modCou...原创 2019-03-13 00:14:29 · 144 阅读 · 0 评论 -
Java BitSet
适用于操作整型数据。每个数据由一位bit表示,也就是说每一个整型只需一个bit的控件,这个比collection等容器是有天大的优势啊。而且插入和查询都非常方便,因为bit的index和整型数值相等,如:存储127,那么BitSet中的第127位bit就被置为1。查找127是否在BitSet中,只需使用MASK进行与操作即可。但是可以想象到,BitSet中至少需要有多少位bit,决定于存储在B...原创 2019-03-25 13:47:22 · 1136 阅读 · 0 评论 -
Java的格式化输出
System.out的print和println方法,可以向控制台输出不同类型的数据,可以满足程序调试信息的输出要求。在实际应用中,输出数据时,要求数据必须按照一定的格式输出,如数据精度要求,小数点后保留2位有效数字、按照规定的格式输出日期、按照表格方式输出数据等要求。System.out的printf方法可以对数据进行格式化输出,printf方法在Java API 文档中声明如下:voi...转载 2019-03-26 18:09:53 · 3150 阅读 · 0 评论 -
单元测试--Mockito之spy
目录spy和mock的相同点和区别:Shadow和spy的异同点:使用场景一:使用场景二:使用场景三:使用场景四:典型错误示例:spy对象和被spy对象的关系spy和mock的相同点和区别:1.得到的对象同样可以进行“监管”,即验证和打桩。2.如果不对spy对象的methodA打桩,那么调用spy对象的methodA时,会调用真实方法。3.如...原创 2019-09-18 11:15:27 · 31023 阅读 · 5 评论