java
文章平均质量分 94
渔溪大王
锐气藏于胸,和气浮于脸,才气见于事,义气施于人。
展开
-
重写了equals()真的就一定要重写hashCode()吗?
目录1、结论2、使用哈希表相关容器存储自定义对象时,为什么重写了equals()就一定要重写hashCode()?为什么重写了equals()就一定要重写hashCode()?其实这个问题之前自己也没有完全想清楚,反正八股文嘛,背就完了呗!但是随着工作的这两年以来,不断丰富的人生阅历以及不断增加的代码量,让我对很多事物的认知也悄悄地发生一些改变,作为一个自认为有点追求的人,自己拿来恰饭的东西还是要尽量做到知其然并知其所以然。首先先来看看万物之祖Object类中的equals()和hashC原创 2021-07-29 16:44:35 · 431 阅读 · 0 评论 -
码出高效读书笔记:类的加载过程
1、什么是机器码和字节码?Java是如何实现一次编译,到处执行的?Q1:什么是机器码?A1:在计算机的世界中,0和1是计算仅能识别的信号,经过0和1的不同组合产生了数字上的操作,同时通过不同的组合也产生了各种字符。同样,可以通过不同的组合产生不同的机器指令。在不同的时代,不同的厂商,机器指令组成的集合是不同的。但毕竟CPU是底层基础硬件,指令集通常以扩展兼容的方式向前不断演进。而机器码是离...原创 2019-01-08 13:19:15 · 245 阅读 · 0 评论 -
ArrayList源码分析
1、ArrayList简介ArrayList是基于数组实现的List类。 ArrayList是容量可以改变的非线程安全集合,当多个线程访问同一个ArrayList时,程序需要手动控制保证该集合的同步性。 ArrayList的特点是遍历速度快,插入和删除操作速度慢。2、ArrayList源码分析package Test;import java.util.*;public cl...原创 2019-01-14 12:06:31 · 132 阅读 · 0 评论 -
码出高效读书笔记:集合与泛型
集合与泛型的联合使用,可以把泛型的功能发挥到极致,很多程序员不清楚List、List<Object>、List<?>三者的区别,更加不能区分<? extends T>与<? super T>的使用场景。List<?>是一个泛型,在没有赋值之前,表示它可以接受任何类型的集合赋值,赋值之后就不能再随便往里添加元素了,下面的代码很好地说明了...原创 2019-01-14 17:33:41 · 451 阅读 · 0 评论 -
码出高效读书笔记:异常与日志
1、区分throws和throw(1)throws定义一个方法时,可以用throws关键字声明,使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。 throws关键字格式:public 返回值类型 方法名称(参数列表,,,)throws 异常类{}。 请看下面一段代码:package Test;public class iTest { ...原创 2019-01-09 11:48:53 · 335 阅读 · 0 评论 -
线程池类ThreadPoolExecutor解析
1、使用线程池的好处线程使应用能够更加充分合理地协调利用CPU、内存、网络、I/O等系统资源。线程的创建需要开辟虚拟机栈、程序计数器、本地方法栈等线程私有的内存空间。在线程销毁时需要回收这些资源。频繁地创建和销毁线程会浪费大量的系统资源,增加并发编程风险。另外,在服务器负载过大的时候,如何让新线程等待或者友好地拒绝服务?这都是线程自身无法解决的。所以需要通过线程池协调多个线程,并实现类似主次线...原创 2019-01-25 18:37:23 · 434 阅读 · 3 评论 -
码出高效读书笔记:Comparable与Comparator、hashCode与equals
1、Comparable和ComparatorJava中两个对象相比较的方法通常用在元素排序里,常用的两个接口分别是Comparable和Comparator。前者Comparable是自己和自己比,可以看作是自营性质的比较器。从词根上分析,Comparable以-able结尾,表示它有自身具备某种能力的性质,表明Comparable对象本身是可以与同类型进行比较的,它的比较方法是comp...原创 2019-01-15 19:38:17 · 367 阅读 · 0 评论 -
码出高效读书笔记:ConcurrentHashMap
考虑到线程并发安全性,ConcurrentHashMap是比HashMap更加推荐的一种哈希式集合。JDK8对ConcurrentHashMap进行了脱胎换骨的改造,使用了大量的lock-free技术来减轻因锁的竞争而对性能造成的影响,涉及了volatile、CAS、锁、链表、红黑树等众多知识点。CAS:Compare And Swap,它是解决轻微冲突的多线程并发场景下使用锁造成性能损耗的一...原创 2019-02-01 11:47:52 · 239 阅读 · 0 评论 -
线程安全和锁
1、进程与线程的概念先来复习一下操作系统中所讲的进程、线程这两个概念:进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。 线程:是进程的一个执行单元,是进程内可调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。2、并发与并行的概念并发:指的是某个时间段内,多任务交替处理的能力。在某段执行时间内,每个CPU不可能...原创 2019-01-22 18:28:09 · 1226 阅读 · 2 评论 -
码出高效读书笔记:线程同步
1、什么是同步Q1:什么是原子性操作?A1:众所周知在物理世界中,原子是最小的粒子,是不可分割的。所谓原子性操作就是指不可分割的一系列操作指令,在执行完毕之前不会被其他操作中断,要么全部执行,要么全部不执行。举个例子,i++就不是原子性操作,因为它分为三步:取i的值、i+1、赋值,即ILOAD---->IINC---->ISTORE。而i=1就是最简单的原子性操作。回归正题...原创 2019-01-23 11:40:40 · 192 阅读 · 0 评论 -
常见的几种Java设计模式
目录1、什么是设计模式?设计模式有什么用?2、设计模式应该遵循的面向对象设计原则3、设计模式的六大原则4、设计模式的四种类型(包括J2EE设计模式)5、几种常见的设计模式5.1、工厂模式5.2、抽象工厂模式5.3、单例模式5.4、适配器模式5.5、装饰器模式5.6、代理模式5.7、策略模式5.8、观察者模式1、什么是设计模式?设计模式有什么用...原创 2019-02-05 21:14:49 · 1210 阅读 · 0 评论 -
使用SimpleDateFormat进行日期格式转换时遇到的问题
最近写代码的时候,使用了SimpleDateFormat对Date进行格式转换,刚开始我是这样写的:SimpleDateFormat sdf = new SimpleDateFormat("HH:MM:SS");这样写乍一看似乎没有什么毛病,但是实质上隐藏了很大的问题。仔细看一看构造参数中的"HH:MM:SS",当时我并不知道H、M、S的大小写分别代表了不同的意思,所以导致时间格式并没有...原创 2019-08-02 16:27:23 · 5026 阅读 · 0 评论 -
码出高效读书笔记:数据结构概要
1、数据结构1.1数据结构定义数据结构是指逻辑意义上的数据组织方式及其相应的处理方式。逻辑意义:比如说,二叉树在磁盘中的存储真的是树形排列的吗?并非如此,树的存储可能是基于物理上的顺序存储方式,可以理解为一个格子一个格子连续地放,设想有7个节点的二叉树,第一个格子放根节点,第二个格子放左子树的根节点;并且根据引用知道左叶子在后续的哪个格子里;第三个格子放右子树根节点,依此类推。此外,树...原创 2019-01-13 11:17:15 · 129 阅读 · 0 评论 -
码出高效读书笔记:Java对象序列化
Q:什么是序列化?A:内存中的数据对象只有转换为二进制流才能进行数据持久化和网络传输。将数据对象转换成二进制流的过程被称为对象的序列化(Serialization)。反之,将二进制流恢复为数据对象的过程称为反序列化(Deserialization)。常见的序列化方式有以下三种:(1)Java原生序列化。Java类通过实现Serialization接口来实现该类对象的序列化,这个接口非常...原创 2019-01-03 13:54:18 · 140 阅读 · 0 评论 -
HashMap详解
更正一下:之前对于hashmap初始容量这一块的知识,我在理解上出了问题,初始容量应该指的是哈希表中能存放的元素的数量,而并非是hashmap实例创建时哈希表中数组的长度。目录1、HashMap简介1.1、HashMap的继承关系1.2、HashMap的数据结构2、HashMap源码分析(使用的是JDK1.7版本的源码)2.1、HashMap的四种构造函数2.2、Has...原创 2019-01-18 11:08:09 · 513 阅读 · 0 评论 -
JAVA基础回顾(二:集合框架)
1.为什么要使用集合1.在开发中我们经常要集中保存多个数据,可以使用数组,但是使用数组的前提是我们必须知道我们要保存的数据的数量,数组 的长度一旦被定义就不可以再做改变2.java集合相当于是一个长度可以变化的数组,是用于保存动态增长的数据的一个很好的选择3.java集合因为是用来保存数据的,所以我们也称集合类为容器类,所有的集合类都位于java.util包下4.后来为了处理多线...原创 2018-10-08 21:11:38 · 136 阅读 · 0 评论 -
深入理解Java虚拟机第二章读书笔记:Java内存模型
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域。这些区域都有自己的用途,以及创建和销毁的时间。有的会随着虚拟机进程的启动而存在,有的区域则依赖用户进程的启动和结束而建立或销毁。Java虚拟机所管理的内存区域主要有以下几个运行时数据区域。1.程序计数器(线程私有内存)程序计数器是每个线程都有的一个内存区域。学过操作系统的都知道,一个CPU在同一时刻只能执...原创 2018-12-04 17:17:47 · 167 阅读 · 0 评论 -
深入理解Java虚拟机第二章读书笔记:HotSpot虚拟机在Java堆上的对象分配
1.对象的创建Step1:检查虚拟机在遇到一个new指令时,先检查这个指令的参数是否能在常量池中定位到一个类的符号引用。然后进行类加载检查。(涉及到类的加载机制)Step2:为对象分配内存空间在进行完类加载检查以后,开始为对象分配内存空间,大致有如下两种分配方式:指针碰撞(要求堆中的内存绝对规整),Serial、ParNew等带Compact过程的收集器 空闲列表(适用于堆中...原创 2018-12-05 14:45:29 · 127 阅读 · 0 评论 -
深入理解Java虚拟机第三章读书笔记:垃圾回收算法
更正之前写这篇笔记的时候我对标记-清除算法的理解好像有些偏差,最近复习笔记的时候发现之前描述的那个过程好像容易造成误解,因为是个人学习笔记,我就不在正文中修改了,方便自己以后回看。我重新总结一下标记-清除算法的过程:如果对象通过可达性分析后发现没有与GC Roots相连的引用链,那么它会被进行第一次标记,并且进行一次筛选(筛选的条件是有没有必要执行finalize()方法,这一部分下文...原创 2018-12-06 18:02:19 · 107 阅读 · 0 评论 -
深入理解Java虚拟机第三章读书笔记:内存分配与回收策略
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存 回收分配给对象的内存对象的内存分配,从大体上讲,就是在堆内存中进行分配,对象主要是分配在新生代的Eden区上,如果启动了本地线程分配缓冲(TLAB),则将按线程优先在TLAB上分配。少数情况也会直接分配在老年代中,分配的规则不是百分之百固定的,细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中...原创 2018-12-14 20:27:55 · 183 阅读 · 0 评论 -
深入理解Java虚拟机第三章读书笔记:HotSpot虚拟机中的各个垃圾收集器
1.前言垃圾收集算法是内存回收的方法论,那么垃圾收集器就是垃圾回收的具体实现。书中提到的HotSpot虚拟机所实现的所有垃圾收集器如图所示,有连线的两个垃圾收集器表示这两种垃圾收集器可以搭配使用,垃圾收集器所处的区域表明它适用的区域,图中横线上方是新生代区域,下方是老年代区域在垃圾收集器的上下文语境中,并发和并行的解释如下:并行:多条垃圾收集线程同时工作,但是用户线程还处在停滞等待...原创 2018-12-10 21:58:51 · 102 阅读 · 0 评论 -
码出高效读书笔记:重新总结类的构造方法及静态代码块
构造方法是方法名与类名相同的特殊方法,在新建对象时调用,可以通过不同的构造方法对对象进行不同的初始化创建,构造方法的特征如下:构造方法名称必须与类名相同 构造方法没有返回值类型,即使是void也不能有。它返回对象的地址,并赋值给引用变量。 构造方法不能被继承,不能被覆写,不能被直接调用。调用的途径有三种,一是通过new关键字,二是在子类的构造方法中通过super调用父类的构造方法,三是通过...原创 2019-01-03 16:06:55 · 124 阅读 · 0 评论 -
码出高效读书笔记:Override和Overload
1、Override(覆写)如果父类定义的方法达不到子类的期望,那么子类可以重新实现方法覆盖父类的实现。因为有些子类是延迟加载的,甚至是网络加载的,所以最终的实现需要在运行期判断,这就是所谓的动态绑定。动态绑定是多态性得以实现的重要因素,元空间有一个方法表保存着每个可以实例化类的方法信息,JVM可以通过方法表快速地激活实例方法。如果某个类覆写了父类的某个方法,则方法表中的方法指向引用会指向...原创 2019-01-05 10:38:40 · 228 阅读 · 0 评论 -
码出高效学习笔记:泛型
1、泛型能够解决的问题Q:什么是泛型?泛型有什么用?A:泛型的本质是类型参数化,解决不确定具体对象类型的问题。在面向对象编程语言中,允许程序员在强类型校验下定义某些可变部分,以达到代码复用的目的。PS:泛型其实就是一种编写代码时的语法检查,可以避免类型强制转换带来的风险。Java在引入泛型前,表示可变类型,往往存在类型安全的风险。举一个生活中的例子:微波炉最主要的功能是加热食物,即...原创 2019-01-05 17:16:32 · 225 阅读 · 0 评论 -
码出高效读书笔记:基本数据类型、包装类型及字符串
1、基本数据类型基本数据类型是指不可再分的原子数据类型,内存中直接存储此类型的值,通过内存地址即可直接访问到数据,并且此内存区域只能存放这种类型的值。一般来说Java有8中数据类型,分别为byte、char、short、int、long、float、double、boolean,但是码出高效中多给出了一种基本数据类型,即refvar,这是一种面向对象世界中的引用变量,也叫作引用句柄。前...原创 2019-01-06 11:47:55 · 544 阅读 · 0 评论 -
码出高效读书笔记:重新思考接口和抽象类以及内部类
1、接口和抽象类正如面向对象四大特征:抽象、继承、封装、多态所述,定义类的过程就是抽象和封装的过程。而接口和抽象类则是对实体类进行更高层次的抽象,仅定义公共行为和特征。两者的共同点是都不能被实例化,但可以通过定义引用变量指向实例对象。下表示接口和抽象类的语法区别: 语法维度 抽象类 接口 定义关键字 abstract interface 子类继承或实...原创 2019-01-02 12:01:00 · 167 阅读 · 0 评论 -
JAVA基础回顾(一)
1.面向对象和面向过程的区别面向过程:优点:性能要高于面向对象,面向对象中的类在调用的时候需要实例化,中间需要加载的资源比较多(单片机、嵌入式开发、linux一般使用面向过程的思想进行开发)缺点:不易维护,不易复用,不易扩展面向对象:优点:易于维护,易于复用,易于扩展,因为封装、继承、多态等特性的存在,所以能够设计出耦合度很低的系统,并使系统更加灵活缺点:性能比面向对象低...原创 2018-10-08 10:25:51 · 107 阅读 · 0 评论