
Java基础
木棉上的光
公众号:不止于Java
Github:https://github.com/cyxpdc?tab=repositories
邮箱:1142439493@qq.com
展开
-
JDK序列化原理总结
参考:https://juejin.im/entry/5bf622436fb9a04a0b21cbe7JDK序列化方式中,使用ObjectInputStream#readObject进行反序列化,使用ObjectInputStream#writeObject进行序列化,反序列化稍微复杂点,朋友们可以结合文字看源码ObjectInputStream#readObject:A 判断子类是否重写了...原创 2020-01-16 12:09:05 · 985 阅读 · 0 评论 -
关于枚举
来源:Java编程的逻辑枚举基本实现原理枚举类型实际上会被Java编译器转换为一个对应的final类,这个类继承了Java API中的java.lang.Enum类。Enum类有两个实例变量String name和int ordinal,在构造方法中需要传递,name(), toString(), ordinal(), compareTo(), equals()方法都是由Enum类根据其实...原创 2019-07-26 21:09:45 · 158 阅读 · 0 评论 -
关于异常解析
来源:Java编程的逻辑异常throw关键字可以与return关键字进行对比,return代表正常退出,throw代表异常退出,return的返回位置是确定的,就是上一级调用者,而throw后执行哪行代码则经常是不确定的,由异常处理机制动态确定。体系:Throwable是所有异常的基类,它有两个子类Error和Exception。Error表示系统错误或资源耗尽,由Java系统自己使用...原创 2019-07-26 22:48:06 · 393 阅读 · 0 评论 -
包装类的总体解析
包装类Java 1.5以后引入了自动装箱和拆箱技术,可以直接将基本类型赋值给引用类型,反之亦可,这是Java编译器提供的能力,背后,它会替换为调用对应的valueOf()/xxxValue()1 重写的Object方法equals、hashcode、toString1.1 equals除了Float和Double,equals方法代码都是比较值,如Long:public boolean...原创 2019-07-27 12:11:27 · 235 阅读 · 0 评论 -
Integer相关方法的源码解析
来源:Java编程的逻辑7.1 位翻转Integer有两个静态方法,可以按位进行翻转:public static int reverse(int i)//会补齐32位后进行翻转,得到的结果会忽略掉首部的0public static int reverseBytes(int i)位翻转就是将int当做二进制,左边的位与右边的位进行互换,reverse是按位进行互换,reverseByte...原创 2019-07-27 15:22:51 · 251 阅读 · 0 评论 -
HashMap源码解析(JDK1.8)
来源:https://mp.weixin.qq.com/s/I6KFAO1n9IQznieUZL95YAhttps://mp.weixin.qq.com/s/MVOqN8mbUtaU0ClUmS4qKwJava编程的逻辑HashMap1 Map接口定义public interface Map<K,V> { int size(); boolean isEmp...原创 2019-08-01 14:58:01 · 208 阅读 · 0 评论 -
String相关源码解析
来源:Java编程的逻辑1 Unicode基础Unicode给世界上每个字符分配了一个编号(还分配了一些属性,如类型),编号范围从0x000000到0x10FFFF。编号范围在0x0000到0xFFFF之间的字符,为常用字符集,称BMP(Basic Multilingual Plane)字符。编号范围在0x10000到0x10FFFF之间的字符叫做增补字符(supplementary ch...原创 2019-07-27 17:39:49 · 193 阅读 · 0 评论 -
StringBuilder源码解析
参考:Java编程的逻辑StringBuilder如果字符串修改操作比较频繁,应该采用StringBuilder和StringBuffer类,这两个类的方法基本是完全一样的,它们的实现代码也几乎一样,唯一的不同就在于,StringBuffer是线程安全的,而StringBuilder不是。线程安全是有成本的,影响性能,而字符串对象及操作,大部分情况下,没有线程安全的问题,适合使用String...原创 2019-07-27 23:08:22 · 340 阅读 · 0 评论 -
Arrays源码解析
参考:Java编程的逻辑Arrays类Arrays包含一些对数组操作的静态方法数组排序 - 自定义比较器sort可以接受一个比较器作为参数public static <T> void sort(T[] a, Comparator<? super T> c)public static <T> void sort(T[] a, int fromIndex...原创 2019-07-28 09:25:26 · 384 阅读 · 0 评论 -
HashSet源码解析
来源:Java编程的逻辑1 实现原理1.1 内部组成HashSet内部是用HashMap实现的,它内部有一个HashMap实例变量,如下所示:private transient HashMap<E,Object> map;我们知道,Map有键和值,HashSet相当于只有键,值都是相同的固定值,这个值的定义为:private static final Object PR...原创 2019-08-01 16:44:00 · 120 阅读 · 0 评论 -
关于日期和时间的解析
日期和时间1 基本概念时区我们都知道,同一时刻,世界上各个地区的时间可能是不一样的,具体时间与时区有关,一共有24个时区,英国格林尼治是0时区,北京是东八区,也就是说格林尼治凌晨1点,北京是早上9点。0时区的时间也称为GMT+0时间,GMT是格林尼治标准时间,北京的时间就是GMT+8:00。时刻和Epoch Time (纪元时)所有计算机系统内部都用一个整数表示时刻,这个整数是距离格林尼...原创 2019-07-28 13:25:57 · 1920 阅读 · 0 评论 -
随机的原理及其应用
来源:Java编程的逻辑1 Math.randomJava中,对随机最基本的支持是Math类中的静态方法random,它生成一个0到1的随机数,类型为double,包括0但不包括1Math.random()实现相关代码:private static Random randomNumberGenerator;private static synchronized Random initR...原创 2019-07-28 16:15:24 · 2782 阅读 · 0 评论 -
TreeMap源码解析
参考:Java编程的逻辑1 前导知识排序二叉树找到一个节点的后继节点的算法:1.如果该节点有右孩子,则后继为右子树中最小的节点。2.如果该节点没有右孩子,则后继为父节点或某个祖先节点,从当前节点往上找,如果它是父亲节点的右孩子,则继续找父节点,直到它不是右孩子或父节点为空,第一个非右孩子节点的父亲节点就是后继节点,如果找不到这样的祖先节点,则后继为空,遍历结束。例子:绿色箭头代表当前节...原创 2019-08-01 19:39:27 · 156 阅读 · 0 评论 -
TreeSet源码解析
来源:Java编程的逻辑1 实现原理1.1 构造方法TreeSet的基本构造方法有两个:public TreeSet() { this(new TreeMap<E,Object>());}public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(co...原创 2019-08-01 21:42:34 · 362 阅读 · 0 评论 -
Object的clone()为什么使用protected修饰?
使用protected修饰clone方法是为了安全考虑。因为Object类中的clone方法是浅拷贝,如果是对象,它拷贝的只是这个对象的一个引用,而这个引用仍然指向那个对象,当我们改变这个引用的属性时,原来的对象也会跟着改变,这样其他引用也会跟着改变;这不是我们希望看到的,但是Object类肯定做不到深拷贝,因为它不知道自定义的类里有哪些引用类型;所以把修饰符定义为protected,这样想...原创 2019-09-08 23:57:57 · 866 阅读 · 0 评论 -
Collections源码解析
集合类关系:1 相关方法1.1 针对List接口的二分查找//一个要求List的每个元素实现Comparable接口,另一个不需要,但要求提供Comparator。public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)public st...原创 2019-08-04 16:46:27 · 243 阅读 · 0 评论 -
关于内部类的总结
来源:Java编程的逻辑静态内部类语法静态内部类与静态变量和静态方法定义的位置一样,也带有static关键字,只是它定义的是类,示例代码如下:public class Outer { private static int shared = 100; public static class StaticInner { public void inne...原创 2019-07-26 15:58:16 · 151 阅读 · 0 评论 -
关于类本身的知识总结
来源:Java编程的逻辑私有构造方法的使用场景1.不能创建类的实例,类只能被静态访问,如Math和Arrays类,它们的构造方法就是私有的。2.能创建类的实例,但只能被类的的静态方法调用。有一种常用的场景,即类的对象有但是只能有一个,即单例模式,在这个场景中,对象是通过静态方法获取的,而静态方法调用私有构造方法创建一个对象,如果对象已经创建过了,就重用这个对象。3.只是用来被其他多个构造方...原创 2019-07-26 15:56:46 · 255 阅读 · 0 评论 -
NIO原理解析
NIO核心图如下:将所有通道注册到Selector上,通过Buffer来执行对数据的操作1.缓冲区Buffer1.1 设计原理类图:可以看到,除了boolean,其他七个基本类型都有MappedByteBuffer:能够实现内存与磁盘的同步更新本质上是一个数组,不过做了一些封装;任何时候访问NIO中的数据,都是将它放到缓冲区中,而BIO中则是直接读取到Stream中相关属性、方...原创 2019-05-12 16:43:20 · 502 阅读 · 0 评论 -
数组和基本类型的区别
来源:Java编程的逻辑数组和基本类型的区别一个基本类型变量,内存中只会有一块对应的内存空间。但数组有两块,一块用于存储数组内容本身,另一块用于存储内容的位置。用一个例子来说明,有一个int变量a,和一个int数组变量arr,其代码,变量对应的内存地址和内存内容如下所示:代码内存地址内存数据int a = 100;1000100int[] arr = {1,...原创 2019-07-24 12:28:16 · 1925 阅读 · 0 评论 -
关于小数计算的精确度问题
来源:Java编程的逻辑计算机之所以叫"计算"机就是因为发明它主要是用来计算的,"计算"当然是它的特长,在大家的印象中,计算一定是非常准确的。但实际上,即使在一些非常基本的小数运算中,计算的结果也是不精确的。比如:float f = 0.1f*0.1f;System.out.println(f);这个结果看上去,不言而喻,应该是0.01,但实际上,屏幕输出却是0.010000001,后...原创 2019-07-24 12:30:32 · 4679 阅读 · 0 评论 -
关于乱码和char的注意点
来源:Java编程的逻辑乱码乱码出现的一个重要原因是解析二进制的方式不对,通过切换查看编码的方式就可以解决乱码。但如果怎么改变查看方式都不对的话,那很有可能就不仅仅是解析二进制的方式不对,而是文本在错误解析的基础上还进行了编码转换。我们举个例子来说明:两个字 “老马”,本来的编码格式是GB18030,编码是(16进制): C0 CF C2 ED。这个二进制形式被错误当成了Win...原创 2019-07-24 12:31:40 · 1291 阅读 · 0 评论 -
条件执行和循环的本质
来源:Java编程的逻辑程序最终都是一条条的指令,CPU有一个指令指示器,指向下一条要执行的指令,CPU根据指示器的指示加载指令并且执行。指令大部分是具体的操作和运算,在执行这些操作时,执行完一个操作后,指令指示器会自动指向挨着的下一个指令。但有一些特殊的指令,称为跳转指令,这些指令会修改指令指示器的值,让CPU跳到一个指定的地方执行。跳转有两种,一种是条件跳转,另一种是无条件跳转。条件跳转检...原创 2019-07-24 12:53:42 · 2205 阅读 · 0 评论 -
数组作为参数传递、内存栈
来源:Java编程的逻辑数组作为参数传递数组作为参数与基本类型是不一样的,基本类型不会对调用者中的变量造成任何影响,但数组不是,在函数内修改数组中的元素会修改调用者中的数组内容。看个例子:public static void reset(int[] arr){ for(int i=0;i<arr.length;i++){ arr[i] = i; }}...原创 2019-07-24 16:45:04 · 758 阅读 · 0 评论 -
泛型相关知识详解
来源:Java编程的逻辑1 基本原理前言:Java有Java编译器和Java虚拟机,编译器将Java源代码转换为.class文件,虚拟机加载并运行.class文件对于泛型类,Java编译器会将泛型代码转换为普通的非泛型代码,即类型参数T擦除,替换为Object;使用的时候会插入必要的强制类型转换。Java虚拟机实际执行的时候,它是不知道泛型这回事的,它只知道普通的类及代码;比如List&...原创 2019-07-30 11:03:49 · 325 阅读 · 0 评论 -
PriorityQueue源码分析
来源:Java编程的逻辑1 前导将新的头部与两个孩子节点中较小的比较,如果不大于该孩子节点,则满足堆的性质,结束,否则与较小的孩子进行交换,交换后,再与较小的孩子比较和交换,一直到没有孩子,或者不大于两个孩子节点。这个过程我们般称为siftdown与父节点比较,如果大于等于父节点,则满足堆的性质,结束,否则与父节点进行交换,然后再与父节点比较和交换,直到父节点为空或者大于等于父节点;称之为...原创 2019-08-02 17:31:13 · 264 阅读 · 0 评论 -
ArrayList原理解析
来源:Java编程的逻辑JDK源码1 基本原理1.1 内部组成内部有一个数组elementData,一般会有一些预留的空间,有一个整数size记录实际的元素个数,如下所示:private transient Object[] elementData;private int size;各种public方法内部操作的基本都是这个数组和这个整数;elementData会随着实际元素个...原创 2019-07-30 16:41:30 · 261 阅读 · 0 评论 -
ArrayDeque源码解析
来源:Java编程的逻辑基于动态扩展的循环数组实现的双端队列一般而言,由于需要移动元素,数组的插入和删除效率比较低,但ArrayDeque的效率却非常高,因为内部是循环数组2 实现原理2.1 Deque接口此接口扩展了Queue接口,可以看做一个先进先出的队列,还可以看做栈2.2 内部组成主要有如下实例变量:transient Object[] elements;transie...原创 2019-08-02 22:44:21 · 292 阅读 · 1 评论 -
LinkedHashMap和LinkedHashSet源码解析
参考:Java编程的逻辑https://blog.youkuaiyun.com/blingfeng/article/details/79974169LinkedHashMap(JDK1.8)public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>是HashMap的子类,但可以...原创 2019-08-03 10:50:32 · 585 阅读 · 0 评论 -
LinkedList原理解析
来源:Java编程的逻辑JDK源码1 构造方法LinkedList的构造方法与ArrayList类似,有两个,一个是默认构造方法,另外一个可以接受一个已有的Collection,如下所示:public LinkedList()public LinkedList(Collection<? extends E> c)2 接口实现了List、Deque和Queue接口2....原创 2019-07-30 20:45:33 · 174 阅读 · 0 评论 -
EnumMap源码解析
来源:Java编程的逻辑如果需要一个Map的实现类,并且键的类型为枚举类型,可以使用HashMap,但应该使用一个专门的实现类EnumMap因为枚举类型有两个特征,一是它可能的值是有限的且预先定义的,二是枚举值都有一个顺序,这两个特征使得可以更为高效的实现Map接口EnumMap是保证顺序的,输出按照键在枚举中的顺序内部基于数组实现1 实现原理1.1 内部组成private fin...原创 2019-08-03 11:57:43 · 191 阅读 · 0 评论 -
EnumSet源码解析
来源:Java编程的逻辑EnumSetEnumSet的实现与EnumMap没有任何关系,而是用极为精简和高效的位向量实现的;位向量是计算机程序中解决问题的一种常用方式1 实现原理1.1 内部组成final Class<E> elementType;//类型信息final Enum[] universe;//枚举类的所有枚举值EnumSet自身没有记录元素个数的变量,...原创 2019-08-03 14:43:58 · 199 阅读 · 0 评论 -
框架里的Java内部类
在看框架源码的时候,时常可以看到内部类,为什么不单独做成一个类,达到解耦的目的,而要做为内部类呢?因为Java内部类有以下四大作用:1.内部类可以使用private和protected修饰,达到安全、隐藏的目的2.内部类可以访问外部类所有字段;3.可以间接实现多重继承,而不会有C++的危害;4.可以避免 实现的接口和扩展的类中有同名方法 的区分问题。符合以上作用之一,即可使用下面...原创 2019-05-01 22:53:11 · 277 阅读 · 0 评论