Java
不好意思海底捞月
这个作者很懒,什么都没留下…
展开
-
Java序列化原理解析
Serialization (序列化)是一种将对象以一连串的字节描述的过程;反序列化 deserialization 是一种将这些字节重建成一个对象的过程。 Java 序列化 API 提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及 Java 序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。转载 2020-10-30 11:50:25 · 138 阅读 · 0 评论 -
Java对象的内存布局
Java对象的内存布局在介绍Java对象的内存布局之前先介绍一下Java中哪些数据是以对象的形式创建的Java的数据类型基本数据类型byte、short、int、long、float、double、char、boolean基本数据类型被创建时,在栈上给其划分一块内存,将数值直接存储在栈上引用数据类型类、接口、数组、枚举、注解等引用数据类型在创建时首先要在栈上给其引用分配一块内存,将对象的实例存储在堆内存上,栈上面的引用指向堆内存中对象的地址Java中在内存布局时主要考原创 2020-10-27 14:50:58 · 165 阅读 · 0 评论 -
Iterator(迭代器)模式
Iterator模式我们在日常开发中避免不了会使用各种容器,容器内存放大量的同类型的对象,比如Java中的ArrayList、LinkedList、HashMap等,这几种的遍历方法都是不一样的。Iterator模式为所有容器提供了一个统一的接口,在屏蔽容器的细节的情况下实现对容器内对象的遍历。原创 2020-10-26 13:31:28 · 109 阅读 · 0 评论 -
ThreadLocal介绍及源码分析
ThreadLocalThreadLocal介绍ThreadLocal提供给每个线程一个局部变量,它主要可以完成的功能就是线程间的隔离,即保证当前线程只能get到在当前线程set的值,其他线程get不到该线程set的值,该线程也get不到其他线程set的值。ThreadLocal通常是一个类中private static修饰的field下面以一个例子来解释一下ThreadLocal的作用。public class Demo { //初始化一个ThreadLocal实例 priv原创 2020-10-12 17:23:35 · 85 阅读 · 0 评论 -
CAS存在的问题及解决办法
CAS存在的问题及解决办法CAS原理见CAS介绍及底层原理ABA问题问题介绍:执行一次比较时,地址V对应的值是A,与预期值相同,但是在这期间A已经被其他线程改为B,又被一个线程改回A,那么CAS仍然会更新值。也就是说当你获得对象当前数据后,在准备修改为新值前,对象的值被其他线程连续修改了两次,而经过两次修改后,对象的值又恢复为旧值,这样当前线程无法正确判断这个对象是否修改过。解决办法:JDK1.5可以利用AtomicStampedReference类来解决这个问题,AtomicStamp原创 2020-10-09 22:11:44 · 1778 阅读 · 1 评论 -
CAS底层原理
CAS目录CAS介绍CAS过程CAS源码分析CAS存在问题及解决办法CAS使用时机原创 2020-10-09 21:49:47 · 297 阅读 · 0 评论 -
volitale关键字及底层原理
Volitale关键字 volatile是一个特征修饰符(type specifier),它是Java虚拟机提供最轻量级的同步机制,volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。Volitale的作用作用一 可见性volitale保证了被它修饰的变量对所有线程的可见性,这里的‘‘可见性’‘是指当一条线程修改了这个变量的值,其他线程是可以立刻得知修改后的新值。接下来从一个案例和JMM角度来分析volitale如何体现可见性的。先写一个原创 2020-10-09 18:27:16 · 877 阅读 · 0 评论 -
native关键字作用及底层实现
Native关键字在介绍Native关键字之前,首先要知道JNI,接下来先介绍一下JNIJNI(Java Native Interface)java本地接口JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支原创 2020-10-09 11:42:36 · 446 阅读 · 0 评论 -
反射(Reflection)
反射(Reflection)java是一种静态语言反射是java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。Class c = Class.forName("java.lang.String")加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以使用通过这个对象看到类的结构。这个对象就像一面镜子,透过这原创 2020-10-09 09:56:22 · 344 阅读 · 0 评论 -
注解(Annotation)
注解(Annotation)Annotation是从JDK1.5开始引入的新技术Annotation的作用不是程序本身,可以对程序作出解释可以被其他程序(如:编译器)读取Annotation的格式注解是以“@注解名”在代码中存在的,还可以添加一些参数值Annotation在哪里使用?可以附在package,class,method,field,type,parameter,constructor,local_variable等上面,相当于给他们添加了额外的辅助信息,原创 2020-10-09 09:49:40 · 101 阅读 · 0 评论 -
HashMap、TreeMap和HashTable异同及源码分析
Map特点:用于存储任意键值对(Key-Value)键:无序、无下标、不允许重复值:无序、无下标、允许重复方法:Modifier and TypeMethod and Descriptionvoidclear() 从该地图中删除所有的映射(可选操作)。default Vcompute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 尝试计算指定键的原创 2020-10-07 16:04:58 · 130 阅读 · 1 评论 -
Vector源码分析,Vector与ArrayList的异同点
Vector数组结构实现,查询快、增删慢JDK1.0版本,运行效率慢、线程安全,JDK1.2之后也实现了List接口Vector与ArrayList的共同点都是由数组结构实现的都可以初始化数组长度Vector与ArrayList的区别Vector是线程安全的(synchronized);ArrayList不是线程安全的Vector在创建对象时可以设置容量增量(capacityIncrement)大小,capacityIncrement默认为initialCapacity原创 2020-10-07 15:58:31 · 123 阅读 · 0 评论 -
HashSet和TreeSet源码分析
Set特点:无序、无下标、元素不可重复方法Modifier and TypeMethod and Descriptionbooleanadd(E e) 如果指定的元素不存在,则将其指定的元素添加(可选操作)。booleanaddAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合(如果尚未存在)(可选操作)。voidclear() 从此集合中删除所有元素(可选操作)。booleancon原创 2020-10-07 15:53:55 · 73 阅读 · 0 评论 -
HashMap源码分析,源码逐行解释(JDK1.8)
HashMapJDK1.2版本,线程不安全,运行效率快;允许使用null作为key和value存储结构:JDK1.8之前(数组+链表);JDK1.8之后(数组+链表+红黑树)源码分析:默认参数参数解释默认值DEFAULT_INITIAL_CAPACITY默认初始容量,必须是2的次幂1<<4MAXIMUM_CAPACITY最大容量1<<30DEFAULT_LOAD_FACTOR默认加载因子0.75fTREEI原创 2020-10-07 15:50:26 · 164 阅读 · 0 评论 -
Collections工具类方法介绍
Collections工具类JDK1.2注意Collections类里面的Synchronized相关方法Synchronized只对同一个对象的多线程起作用,同一个类不同的对象实例的synchronized方法是不相干扰的方法Modifier and TypeMethod and Descriptionstatic <T> booleanaddAll(Collection<? super T> c, T... elements) 将原创 2020-10-07 15:36:26 · 116 阅读 · 0 评论 -
LinkedList和ArrayList的区别,LinkedList源码分析带案例
LinkedList双向链表结构实现,增删快,查询慢ArrayList和LinkedList区别ArrayList必须开辟连续空间,LinkedList无需开辟连续空间ArrayList是由数组结构实现的,LinkedList是由双向链表结构实现的ArrayList查询快,增删慢,LinkedList增删快,查询慢源码分析默认参数参数解释默认值size元素个数0first链表第一个节点nulllast链表最后一个节点null原创 2020-10-07 15:34:32 · 89 阅读 · 0 评论 -
ArrayList源码分析带案例
ArrayList数组结构实现,查询快、增删慢JDK1.2版本加入,运行效率快、线程不安全源码分析默认参数参数解释默认值size当前数据个数0DEFAULT_CAPACITY默认容量10EMPTY_ELEMENTDATA初始数据{}DEFAULTCAPACITY_EMPTY_ELEMENTDATA初始容量及数据容量:0,数据:{}MAX_ARRAY_SIZE最大容量Integer.MAX_VALUE - 8原创 2020-10-07 15:28:49 · 78 阅读 · 0 评论 -
红黑树原理分析,hashmap源码分析前菜
红黑树定义红黑树是一种含有红黑节点并能自平衡的二叉查找树(左节点小于父节点,右节点大于父节点)性质每个节点要么是红色,要么是黑色根节点是黑色每个叶子节点(NIL,虚拟节点,value为null)是黑色每个红色节点的两个子节点一定都是黑色任意一节点到每个叶子节(NIIL)点的路径都包含数量相同的黑节点红黑树的平衡性红黑树并非完美平衡的二叉查找树,是完美黑色平衡的二叉查找树红黑树的自平衡每次只考虑CPGU三代即可,其余部分无需考虑祖父母G-Grandpa原创 2020-10-07 15:14:45 · 146 阅读 · 0 评论 -
重写equals和hashCode方法
重写equals()@Overridepublic boolean equals(Object o){ if(this == o) return true; if(o == null || getClass() != o.getClass()) return false; User user = (User) o; retrun Objects.equals(name, user.name) && age == user.age;}为什么不能使用原创 2020-10-05 10:08:45 · 183 阅读 · 1 评论