javaSE
java学习/梳理/笔记
南宫卷柏
此人不懒,但也还是什么都没有写
展开
-
【JVM】JVM类的加载机制(详解)
类从加载到卸载,整个生命周期统共分为7个阶段:其中,加载->验证->准备->解析->初始化,这5个过程就是类的加载过程,而且验证->准备->初始化这三个可以统称为连接过程;解析阶段有时候会在初始化之后再开始;那么,什么时候会触发类的加载?1⃣️ main()所在的主类;2⃣️ 在遇到new、要对某个类的静态变量进行get或set、或者调用它的静态方法时;3⃣️ 对某个类使用反射时;4⃣️ 已经在对某个类进行加载,并且进行到初始化阶段时,而它的父..原创 2022-04-26 23:47:12 · 287 阅读 · 0 评论 -
【Spring】Maven-Spring开发手册
一、Maven下载安装与配置maven下载:Maven官网1. 设置本地库Maven压缩包解压到本地目录;创建本地库文件夹并打开Maven目录下conf中的setting.xml进行配置;<!--设置本地库为刚才创建的本地库路径--><localRepository>/usr/local/maven-repository</localRepository>2. 设置国内镜像,加速下载jar包和依赖阿里云官网:阿里云Maven仓库<mirror原创 2022-04-01 00:33:25 · 891 阅读 · 0 评论 -
1.17 ConcurrentHashMap和Hashtable的区别
ConcurrentHashMap和Hashtable的区别从底层数据结构来看:ConcurrentHashMap在JDK1.8之前,底层使用分段数组(segment数组存放Entry数组)实现,1.8之后使用的是数组+链表/红黑树结构;而Hashtable一直使用数组+链表结构;从线程安全的实现方式来看:二者都是线程安全的,但是ConcurrentHashMap在JDK1.8之前使用分段锁的方法,一个ConcurrentHashMap有多个Segment,每个segment内存放多个Entry原创 2021-10-14 15:33:20 · 133 阅读 · 0 评论 -
1.16 HashSet和HashMap区别
1.16 HashSet和HashMap区别HashSet是单列集合,实现的是List,只能存放对象;而HashMap是双列集合,实现的是Map,能存放键值对;HashSet底层使用了HashMap,但只用到了HashMap的key;HashSet使用add添加元素,而HashMap使用put添加元素;HashMap使用key计算HashCode,而HashSet使用对象计算HashCode;HashSet使用拉链法equals到了相同的对象时,不允许再添加,没有替换操作;而HashMap找到了原创 2021-10-14 15:18:01 · 308 阅读 · 0 评论 -
1.14 HashMap的长度为什么是2的幂次方
1.14 HashMap的长度为什么是2的幂次方设计原理:JDK1.8之前,hash–>数组下标的过程很简单,hash%length,就可以将hash映射到数组上JDK1.8优化思路,已知位运算 a % 2 ^n = a & 2 ^n - 1(因为2 ^n -1刚好是一个低位掩码,a&小1位的低位掩码相当于截取了低一位的所有二进制数,起到了a%2 ^n效果)所以对于指定的值,将数组长度设置为大于等于该值的最小2 ^n,就可以用位运算优化;如何保证数组长度是2 ^n?在Has原创 2021-10-14 15:17:24 · 172 阅读 · 0 评论 -
1.13 HashMap和Hashtable的区别
1.13 HashMap和Hashtable的区别从底层数据结构来看:HashMap在JDK1.8之前采用数组+链表的方式,在JDK1.8时采用数组+链表/红黑树的结构;而Hashtable一直是数组+链表的结构;从线程安全上看:HashMap不是同步的,非线程安全;而Hashtable中有同步锁synchronized,线程安全;从效率上看:Hashtable因为实现线程安全,效率不如HashMap;从null值容忍度来看:HashMap最多容忍1条数据的key是null,多条数据的value是原创 2021-10-14 15:17:10 · 63 阅读 · 0 评论 -
1.12 HashMap的底层实现
1.12 HashMap的底层实现JDK1.8之前,使用数组+链表的形式,数组中每一个结点都是一个Entry,Entry中不仅包括自己的数据,还有一个next,构成了一个链表;当键值对想要进行put时,HashMap会先计算出key的HashCode,再经过扰动函数(高低位运算)将HashCode的高位信息保留,低位信息混合了原来的高地位,得到hash值,由于hash范围前后40亿,想要映射到长度相对短的数组里,通过hash&length-1,得到数组下标,然后去该位置看是否有数据,没有就直接存原创 2021-10-14 15:16:38 · 79 阅读 · 0 评论 -
1.11 ArrayList和Vector的区别
2.11 ArrayList和Vector的区别ArrayList非线程安全;Vector的所有方法都是同步的,线程安全;所以可想而知,ArrayList的效率要高于Vector;要在单线程环境使用List,选ArrayList;在多线程环境,选用Vector;...原创 2021-10-14 15:15:45 · 67 阅读 · 0 评论 -
1.15 HashMap多线程操作导致死循环问题及其在JDK1.8中的优化
1.15 HashMap多线程操作导致死循环问题如果多个线程使用同一个HashMap,可能会出现多个线程同时对HashMap进行扩容的场景;而扩容是新建一个数组,将链表中的元素从头结点遍历过去,每个进行rehash再放到新数组里,最后引用新数组;有一种情况会出现死循环:拿旧数组上某个链表上的两个连续结点A->B举例,假设A、B依次被线程1拿到了新数组(假设仍在同一个桶中),成了B->A的顺序;这时,线程2也对HashMap进行扩容,再次将A往新数组对应位置的链头添加,也就是A->ne原创 2021-10-14 15:17:40 · 539 阅读 · 0 评论 -
1.10 ArrayList和LinkedList异同
1.10 ArrayList和LinkedList异同相同点:都实现的是List接口,是单列集合;都是线程不安全的;不同点:ArrayList基于数组实现,而LinkedList基于双链表实现;ArrayList有索引,支持随机访问,而List无索引,不支持;ArrayList查找是O(1),增删是O(n),更擅长查找遍历;而LinkedList查找是O(n),增删是O(1),更擅长增删元素;ArrayList在空间上浪费在数组的后面会预留空间;而LinkedList的每个结点要多出用原创 2021-10-13 13:23:40 · 223 阅读 · 0 评论 -
1.9 接口与抽象类区别
1.9 接口与抽象类区别1.关于变量:抽象类可以有常量,也可以有一般变量;而接口里只能有变量;2.关于方法:抽象类不仅可以有抽象方法,还可以有一般方法;而接口里只能有抽象方法(1.8之后还可以有静态方法,接口名调用);抽象类的方法的访问权限默认为protected(1.8时,可以是default);而接口中方法的访问权限为public(1.8时,也可以default;1.9时可以private);接口中的方法不可以有方法体(1.8时,可以有带方法体的普通方法);...原创 2021-10-13 13:14:24 · 87 阅读 · 0 评论 -
1.8 获取键盘输入两种方式
1.8 获取键盘输入两种方式new 一个Scanner对象,构造方法传入System.in这个字节输入流;然后用这个Scanner对象调用nextInt,nextLine等方法;new 一个BufferedReader对象,构造方法传入一个用System.in构造的字符转换输入流InputStreamReader对象;再用这个字符缓冲输入流调用read、readLine方法;...原创 2021-10-13 12:57:23 · 113 阅读 · 0 评论 -
1.7 java中的异常处理
1.7 java中的异常处理有一个父类java.lang.Throwable类,主要有两个子类:Error错误类和Exception异常类;Error类:一般是程序无法处理的错误,JVM自身故障或者执行任务时出错,与开发者无关;例如Virtual Machine Error、OutOfMemoryError;Exception类:主要分为CheckedException和RuntimeExceptionCheckedException又称编译期异常,一般强制要求程序员处理;如IOExcepti原创 2021-10-13 12:44:19 · 113 阅读 · 0 评论 -
1.6 Object类的常用方法总结
1.6 Object类的常用方法总结public final native Class<?> getClass(); // 获取当前对象的Class对象,不允许重写,OS的方法,执行快;protected native Object clone();//将当前对象浅克隆,返回副本;//Object本身没有实现Cloneable接口,想要调用clone的自定义类必须实现并重写clone方法;public int hashCode(); //返回对象哈希值;public boolea原创 2021-10-13 12:29:36 · 82 阅读 · 0 评论 -
1.5 关于final关键字的一些总结
1.5 关于final关键字的一些总结1.final修饰类时,它的所有成员方法都会被隐式指定为final方法;该类此时无法被继承;2.final修饰变量时,该变量初始化后不可以被修改;如果是引用类型,它不可以再指向另一个对象;3.final修饰方法时,方法不能够被重写,但可以被重载;final不可以拿来修饰抽象方法,与抽象方法的意义相矛盾;private方法会被隐式地指定为final;...原创 2021-10-13 12:16:52 · 123 阅读 · 0 评论 -
1.4 ==与equals
1.4 ==与equals==对于基本类型是比较值,对于引用数据类型比较的是对象的内存地址;equals是在Object中定义的方法,实际上调用的就是 == 比较内存地址;所以如果引用型对象没有重写equals方法,它的作用就和 == 一样;如果重写了equals方法,就可以通过重写使equals实现内容比较的功能;例如String已经重写了equals方法;...原创 2021-10-13 11:27:43 · 59 阅读 · 0 评论 -
1.3 自动装箱与拆箱
1.3 自动装箱与拆箱装箱:将基本类型包装成相应的包装类Integer integer=new Integer(3);拆箱:将包装类转换回相应的基本类型int i=(int)integer;JDK1.5之后自动装箱:Integer integer=3;自动拆箱:int i=integer;...原创 2021-10-13 11:20:52 · 51 阅读 · 0 评论 -
1.2 String、StringBuffer和StringBuilder的区别是什么?String为什么不可变?
1.2 String、StringBuffer和StringBuilder的区别是什么?String为什么不可变?从底层数据结构来看:String是被final修饰的char[],所以它在确定内容后不可以改变;而StringBuffer和StringBuilder的char[]没有用final修饰,所以它们创建的字符串是可变的;从线程安全来看:String不可以改变,所以是线程安全的;StringBuffer对方法和调用的方法加了sychronized同步锁,所以也是线程安全的;而StringBuffe原创 2021-10-13 11:14:08 · 299 阅读 · 2 评论 -
1.1 重载和重写的区别
1.1 重载和重写的区别重载:发生在同一个类中,方法之间的方法名相同,参数列表不同,返回类型和访问权限可以不同;重写:发生在子父类之间,子类重写父类方法,方法名和参数列表必须相同,返回类型范围不能大于父类被重写方法的返回类型(相同或子孙类),访问权限不能小于父类被重写方法的访问权限(private<friendly<protected<public);另外,被final修饰的方法,能够被重载,却不能被继承;private方法也是(本质上被隐式地用final修饰了);...原创 2021-10-13 11:01:53 · 98 阅读 · 0 评论 -
用两个线程玩猜数字游戏
用两个线程玩猜数字游戏,第一个线程负责随机给出1到100之间的一个整数,第二个线程负责猜出这个数。原创 2021-04-02 18:15:33 · 504 阅读 · 0 评论