Java
ting说你跳
Android Developer.
展开
-
==,equals()和hashCode()
参考文章: 1.浅谈Java中的hashcode方法==1.基本数据类型之间的比较,用==,其实比较的就是它们的值。 2.引用数据类型之间的比较,用==,比较的是它们在内存中的地址。equals()很多情况下,我们对两个引用数据类型比较判断它们是否一样,经常会用equals()。我们来看一下Object中的equals(): public boolean equals(Object o)原创 2017-06-08 15:51:25 · 214 阅读 · 0 评论 -
Java修饰符
Java语言提供了很多修饰符,主要分为以下两类:访问修饰符非访问修饰符修饰符用来定义类、方法或者变量,通常放在语句的最前端。访问修饰符类 名称 说明 备注 public 可以被所有类访问(使用) public类必须定义在和类名同名的文件中 无访问修饰符(默认) 可以被同一个包中的类访问(使用) 默认的访问权限,可以定义在其他文件中接口 名称 说明原创 2017-09-17 15:01:25 · 291 阅读 · 0 评论 -
Java transient关键字使用小记
哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transient关键字的使用,涨下姿势~~~好了,废话不多说,下面开始:transient的作用及使用方法我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为转载 2017-09-17 19:03:09 · 299 阅读 · 0 评论 -
Java线程池源码分析(基于JDK1.8)
前言线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调优和监控,有以下好处: 1、降低资源消耗; 2、提高响应速度; 3、提高线程的可管理性。源码分析构造方法首先来看ThreadPoolExecutor类的四种构造方法: public ThreadPoolExecutor(int var1, int var2, long原创 2017-09-03 10:23:53 · 475 阅读 · 0 评论 -
Java官方(Oracle/Sun)发布的JDK和OpenJDK的关系
最近一阶段,通过AndroidStudio一直在看Android和Java的源码。发现Android SDK下有Java源码,JDK1.8下也有Java源码,但是内容大同小异。 看JDK源码的时候,还会提醒内容反编译自二进制文件,如下: 然后在网上找到了R大的解释,来自R大的知乎回答:在Oracle参与过HotSpot VM的研发。这个我有发言权。Oracle JDK与OpenJDK里的原创 2017-09-03 10:45:29 · 7521 阅读 · 0 评论 -
Java中的静态内部类和非静态内部类
参考:Oracle官方文档Nested Classes引言Java语法中允许一个类嵌套在另一个类中,我们把嵌套在其他类中的类称为内部类。而内部类又分为两种,静态内部类(static nested classes)和非静态内部类(inner classes)。 例如这样的关系://外部类class OuterClass { //静态内部类 static class StaticNes原创 2017-08-09 11:43:29 · 1957 阅读 · 1 评论 -
Java集合框架
转载自:兰亭风雨的【Java集合源码剖析】Java集合框架Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)。 Java集合类的整体框架如下: 从转载 2017-06-09 10:54:13 · 266 阅读 · 0 评论 -
Java线程的生命周期和状态控制
线程的生命周期新建状态用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新建状态。处于新生状态的线程有自己的内存空间,通过调用start()进入就绪状态。注意:不能对已经启动的线程再次调用start(),否则会出现java.lang.IllegalThreadStateException异常。就绪状态处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪原创 2017-09-12 17:05:53 · 554 阅读 · 0 评论 -
Unsafe与CAS
Unsafe简单讲一下这个类。Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作。这个类尽管里面的方法都是public的,但是并没有办法使用它们,JDK API文档也没有提供任何关于这个类的方法的解释。总而言之,对于Unsafe类的使用都是受限制的,只有授信的代码才能获得该类的实例,转载 2017-10-30 14:45:22 · 431 阅读 · 0 评论 -
ReentrantLock实现原理分析
类图ReentrantLock相关类图:AbstractOwnableSynchronizer类保持和获取独占线程。AbstractQueuedSynchronizer,继承自AbstractOwnableSynchronizer,简称AQS,基于FIFO(First Input First Output)队列的实现。以虚拟队列的方式管理线程的锁获取与锁释放,以及各种情况下的线程中断。提供了默认原创 2017-10-30 16:52:57 · 827 阅读 · 0 评论 -
Java集合之ConcurrentModificationException(并发修改异常)分析
前言今天写LeetCode遇到一道题,我想利用作为方法参数的一个集合作为返回的值,来达到节省空间的目的:public List<Interval> merge(List<Interval> intervals) {}意思就是,我想对集合intervals进行修改,然后返回值就传修改后的intervals。然后顺势就联想到了并发修改异常,之前只是知道个概念,并没有仔细思考过。今天就来分析一下Concu原创 2017-10-24 15:27:13 · 483 阅读 · 0 评论 -
Java注解
概述注解(Annotation)是JDK1.5之后增加的一个新特性。注解作为程序的元数据嵌入到程序中。注解可以被解析工具或编译工具解析,此处注意注解不同于注释(comment)。注解仅仅是元数据,和业务逻辑无关,所以当你查看注解类时,发现里面没有任何逻辑处理。注解的引入意义很大,有很多非常有名的框架,比如Hibernate、Spring、Android Support Annotations、JUn原创 2017-08-13 19:14:05 · 476 阅读 · 0 评论 -
Java类加载(深入理解Java虚拟机学习笔记)
概述类加载的生命周期七个阶段:加载、验证、准备、解析、初始化、使用和卸载。 类加载的过程五个阶段:加载、验证、准备、解析、初始化。 在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶原创 2017-07-17 14:45:39 · 733 阅读 · 1 评论 -
Java反射
引言首先我们了解一下JVM,什么是JVM,Java的虚拟机,Java之所以能跨平台就是因为这个东西,你可以理解成一个进程,程序,它就是用来跑你的代码的。下面是JVM的内存模型图: 假如你写了一段代码:Person p = new Person (),然后点击了编译器的运行按钮。首先Java文件会Java编译器编译为.class文件,然后JVM会启动,类加载器把.class文件中的静态存储结构转原创 2017-08-11 11:31:06 · 473 阅读 · 0 评论 -
LeakCanary源码分析
概述LeakCanary是用来检测 Java 和 Android 内存泄露的工具。LeakCanary的原理非常简单。正常情况下一个Activity在onDestroy之后就要销毁,LeakCanary做的就是在一个Activity onDestroy之后将它放在一个WeakReference中,然后将这个WeakReference关联到一个ReferenceQueue,查看Referen...原创 2018-07-07 19:30:35 · 346 阅读 · 0 评论 -
String,StringBuffer和StringBuilder
类的继承关系String、StringBuffer、StringBuilder 都实现了 CharSequence 接口。下面是类关系图:数据结构它们内部都是用一个char类型的数组实现,虽然它们都与字符串相关,但是其处理机制不同。1.String:是不可改变的量,创建后就不能再修改了。可以看到String源码中对char数组的定义: private final char[] value;注意原创 2017-09-21 14:46:47 · 312 阅读 · 0 评论 -
Java的动态绑定和静态绑定
引言在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码呢?这就涉及到程序绑定这个概念。程序绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对Java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。静态绑定在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。针对Java,可以简单地理解为程序编译期的绑定。这里特别说明一点,Java当中的方原创 2017-09-14 17:05:16 · 10992 阅读 · 12 评论 -
LinkedHashMap原理分析
参考文章:【Java集合源码剖析】LinkedHashmap源码剖析LinkedHashMap概述LinkedHashMap是HashMap的子类,与HashMap有着同样的存储结构,同样允许key和value为null,但它加入了一个双向链表的头结点,将所有put到LinkedHashmap的节点串成了一个双向循环链表,因此它保留了节点插入的顺序,可以使节点的输出顺序与输入顺序相同。LinkedH原创 2017-06-13 14:24:32 · 413 阅读 · 0 评论 -
Java之枚举的原理
转载自:Java 枚举型为什么是静态的,以及是怎么实现的?中的一个回答Java枚举型是静态常量,隐式地用static final修饰过。 确切地说,Java枚举型是“静态常量”,这里面包含了两层意思: 1.枚举型中的实例隐式地用static final修饰过。 2.枚举型作为某个类中的成员字段也隐式地用static final修饰过。public class Traffic { pub转载 2017-08-09 17:42:51 · 279 阅读 · 0 评论 -
Java动态代理之实践
动态代理实现方式Java中的动态代理给我们提供一种动态生成类的方式,有很好的灵活性,这种技术一般会出现在一些第三方框架中,来降低接入方的使用成本。以下为常用的实现动态代理的几种方式:1.JDK自带的Proxy方式 优点:JDK亲儿子,无依赖,使用简单。 缺点:代理类必须继承至少一个接口,无法继承已有父类。2.asm方式,基于class字节码的操作 优点:很底层到操作,性能高,对性能要求苛刻的建原创 2017-08-15 11:43:05 · 423 阅读 · 0 评论 -
ArrayList和LinkedList的比较
前言ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构。下面来分析它们的源码,比较一下两者之间的不同。以下分析基于Oracle JDK1.8。ArrayList构造方法无参构造: private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = new Object[0]; public原创 2017-09-04 11:07:24 · 206 阅读 · 0 评论 -
Java动态代理
相关概念代理在某些情况下,我们不希望或是不能直接访问对象 A,而是通过访问一个中介对象 B,由 B 去访问 A 达成目的,这种方式我们就称为代理。这里对象 A 所属类我们称为委托类,也称为被代理类,对象 B 所属类称为代理类。 代理的优点有: 1.隐藏委托类的实现。 2.解耦,不改变委托类代码情况下做一些额外处理,比如添加初始判断及其他公共操作。代理模式根据程序运行前代理类是否已经存在,可以将转载 2017-08-14 18:49:46 · 421 阅读 · 0 评论 -
聊聊并发--原子操作的实现原理
引言原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Inter处理器和Java里是如何实现原子操作的。术语定义 术语名称 英文 解释 缓存行 Cache line 缓存的最小操作单位 比较并交换 Compare an转载 2017-09-05 11:27:27 · 390 阅读 · 0 评论 -
Java中的类加载顺序
参考文章:Java类初始化顺序今天来研究一下Java中类的加载顺序。一般情况:Demo1首先看父类:public class Father { static { System.out.println("这是 Father 的静态代码块"); } { System.out.println("这是 Father 的代码块"); } pub原创 2017-08-08 22:26:38 · 276 阅读 · 0 评论 -
Java关键字synchronized
参考:Java中synchronized的用法引言synchronized是Java中的关键字,Java中的每一个对象都可以作为锁。1.对于同步方法块,锁是synchronized括号里配置的对象。 2.对于同步方法,锁是当前实例对象。 3.对于静态同步方法,锁是当前对象的Class对象。 修饰代码块Demo1:class SyncThread implements Runnable {原创 2017-08-08 11:39:41 · 488 阅读 · 2 评论 -
HashMap原理分析
参考文章: 1.深入解析hashcode,hashMap源码 2.【Java集合源码剖析】HashMap源码剖析 3.Java 8系列之重新认识HashMapHashMap概述HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表(JDK1.8中将链表改成了二叉树)解决冲突问题,容量不足(超过了阀值)时会自动增长。 HashMap是非线程安全的,只是用于单线原创 2017-06-09 14:02:12 · 641 阅读 · 2 评论 -
HashMap和Hashtable的区别
HashMap和Hashtable的区别主要就两点:1、HashMap是非线程安全的,HashTable是线程安全的。查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized 关键字,而HashMap的源代码中则连 synchronized 的影子都没有,当然,注释除外。因为线程安全的问题,HashMap原创 2017-09-06 11:47:53 · 176 阅读 · 0 评论 -
全面理解Java泛型
为什么需要泛型首先,我们看下下面这段简短的代码: public static void main(String[] args) { List list = new ArrayList(); list.add(&quot;abcdf&quot;); list.add(&quot;pldpl&quot;); list.add(100); for (int i原创 2017-08-24 14:24:20 · 303 阅读 · 0 评论 -
ConcurrentHashMap源码分析(基于JDK1.8)
前言并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,转载 2017-09-06 17:29:16 · 355 阅读 · 0 评论 -
聊聊并发-Java中的Copy-On-Write容器
前言Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet转载 2017-09-07 10:57:42 · 188 阅读 · 0 评论 -
查看Java字节码的方法
其实利用JDK自带的反编译工具即可。使用命令行直接使用命令行javap -c 字节码的名字,图示如下:利用编辑器(这里指Intellij idea/Android Studio)在Settings中找到Tools>External Tools,然后点击绿色的加号,如下:然后依次配置下图划红线处的四个地方,工具的名字,反编译工具的路径,还有参数和工作目录:1.工具的名字当然自己定。2.反编译工具的路径原创 2017-09-15 10:07:28 · 1280 阅读 · 0 评论 -
RxJava2源码分析
本文基于RxJava2.2.1版本分析。简介官方介绍: RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences. It exten...原创 2018-09-02 21:31:42 · 476 阅读 · 1 评论