杂谈
Java琐碎
博_采_众_长
理论与实践并行!
展开
-
Java -- 反汇编:HSDIS、JITWatch
大多数情况下,通过诸如javap等反编译工具来查看源码的字节码已经能够满足我们的日常需求,但是不排除在有些特定场景下,我们需要通过反汇编来查看相应的汇编指令。本文我们就来介绍两个很好用的工具——HSDIS、JITWatchHSDISHSDIS(HotSpot disassembler),一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件,其实际上就是一个动态库。这里我们直接从网上下载与我们系统对应的编译后文件,然后直接将其放置到JDK的bin目录下即可然后在IDE中配置相关VM Option转载 2020-12-09 10:51:32 · 349 阅读 · 0 评论 -
Java -- CountDownLatch、CyclicBarrier、Semaphore
CoutDownLatch和CyclicBarrier都用于实现多线程之间的相互等待,但二者的关注点不同。CountDownLatch主要用于线程等待其他子线程任务均执行完毕后再执行接下来的业务逻辑单元,而CyclicBarrier主要用于一组线程互相等待大家都达到某个状态后,再同时执行接下来的业务逻辑单元。此外,CountDownLatch是不可以重用的,而CyclicBarrier是可以重用的Semaphore和Java中的锁功能类似,主要用于控制资源的并发访问...原创 2020-11-30 17:48:16 · 119 阅读 · 0 评论 -
Java -- 锁
文章目录1. 乐观锁2. 悲观锁3. 自旋锁3.1 自旋锁的优缺点3.2 自旋锁的时间阈值4. synchronized1. 乐观锁 乐观锁采用乐观的思想处理数据,在每次读取数据时都认为别人不会修改该数据,所以不会上锁,但在更新时会判断在此期间别人有没有更新数据,通常采用在写时先读出当前版本号然后加锁的方法 具体过程原创 2020-11-30 17:33:04 · 188 阅读 · 0 评论 -
为什么使用low + (high - low) / 2而不使用(high + low) / 2呢?
为什么使用low + (high - low) / 2而不使用(high + low) / 2呢?目的是防止溢出!为什么这样就防止溢出了呢?看下面的例子。high = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824 low = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824然后我们将这两个数值相加,看结果是什么。high + low = 1000 0000 0000 0000 0转载 2020-11-28 18:14:05 · 987 阅读 · 0 评论 -
Java -- Bitmap位图
文章目录1. 数据结构的定义2. 查询方法的实现3. 修改方法的实现 在Java中使用byte[]字节数组来储存bit,1byte = 8bit。对于bit中的第i位,该bit为1则表示true,即数据存在:为0则表示false,即数据不存在。其具体实现分为数据结构的定义、查询方法和修改方法的实现1. 数据结构的定义  原创 2020-11-28 17:51:14 · 520 阅读 · 0 评论 -
Java并发编程实战 -- this引用逸出
《java并发编程实战》中介绍了“发布与逸出”,首先介绍下发布,然后重点介绍this引用逸出。一、发布“发布”一个对象是指,使对象能够在当前作用域之外的代码中使用。例如:①将一个指向该对象的引用保存到其他代码可以访问的地方②在某一个非私有的方法中返回该引用③将引用传递到其他类的方法中下面我们来看几个具体的例子:①将对象的引用保存到一个公有的静态变量中,可以使任何类和线程都能看到该对象import转载 2020-11-23 20:12:04 · 238 阅读 · 0 评论 -
Java -- 类内部定义接口
Java类内部可以定义接口,作用可以看作是对类功能的进一步补充,类里面包含两部分:一部分是自己的固定的,一部分是可以变化的,而这可变的部分就编程了一个接口。另一个作用是避免命名冲突。举????类Fruits内部存在接口Applepublic class Fruits { public interface Apple { public String info(); }}转载 2020-11-23 20:02:12 · 1646 阅读 · 0 评论 -
成功解决idea中:Error:java: Compilation failed: internal java compiler error
Information:java: javacTask: 源发行版 8 需要目标发行版 1.8Information:java: Errors occurred while compiling module 'neu-crawler'Information:javac 1.8.0_181 was used to compile java sourcesInformation:Module "neu-crawler" was fully rebuilt due to project configurat转载 2020-11-17 19:10:09 · 220 阅读 · 0 评论 -
Java -- 成员内部类不能含有static成员(汇总)
文章目录1、为什么内部类中有static成员时内部类也必须声明为static2、JVM的类加载规则 :3、成员内部类中为什么不能有静态方法和属性4、静态内部类(public static class)和普通内部类(public class)的区别5、Java中普通内部类为何不能有static属性 却可以有常量6、java内部类有什么好处?为什么需要内部类?静态内部类局部内部类匿名内部类7、Java静态内部类(static class)1、为什么内部类中有static成员时内部类也必须声明为static&原创 2020-11-15 14:14:51 · 5034 阅读 · 11 评论 -
Java并发关键字 -- final
文章目录final的简介final的具体使用场景变量final成员变量final局部变量方法类final关键字举例多线程中你真的了解final吗final域重排序规则final域为基本类型final域为引用类型final的实现原理为什么final引用不能从构造函数中“溢出”final的简介final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一个final类型的类。即使能够知道final具体的使用方法,final在多线程中存在的重排序问题很容易忽略,希望转载 2020-11-15 10:26:10 · 190 阅读 · 0 评论 -
Java中的不变性(Immutable)和final有关吗
一 概述 Java中满足同步需求的另一种方法是使用不可变的对象(Immutable Object)。因为如果对象的状态不会改变,那么并发同步过程中就不会存在并发问题。 final关键字可以用来修饰变量,方法,类。final定义的引用是不可变的,但是引用的对象是可变的 。final定义的值类型是无法修改的。 二 Java中的不变性Immutable 如果某个对象在被创建之后其状态就不能被修改...转载 2020-11-15 09:28:23 · 236 阅读 · 0 评论 -
DevOps简介
原文: https://www.cnblogs.com/liufei1983/p/7152013.html DevOps 是一个完整的面向IT运维的工作流,以 IT 自动化以及持续集成(CI)、持续部署(CD)为基础,来优化程式开发、测试、系统运维等所有环节。 DevOps的概念 DevOps一词的来自于Development和Operations的组合,突出重视软件开发人员和运维人...转载 2020-10-29 17:05:25 · 274 阅读 · 0 评论 -
Java的自动装箱和拆箱
基本类型和包装类型Java是一种强类型的语言,这就意味着必须为每一个变量声明一种类型。 在Java中,一共有8种基本数据类型,且每个基本数据类型都含有对应的包装类型,对应关系如下表: 基本类型包装类型byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublebooleanBooleancharCharacter1、为什么要有基本类型? 首先,基本类型不是一个Object,数值直接保存在栈中,不会在堆中开辟内存,也不存在Java对象的内存布局:转载 2020-11-07 21:24:54 · 102 阅读 · 0 评论 -
hashCode和identityHashCode 的关系
文章目录1:首先看一下JDK API的观点1 - 1:hashCode方法相关1 - 2:identityHashCode()方法相关2:此例的核心程序,对应的观点在注释中已经有所说明,请自己也动手实验一下看看!3:User简单的自定义类,比较简单,没什么可讲的,关键是默认继承Object类,且没有重写hashCode()方法,不过重写了toString()方法4:运行结果如下所示,不同的运行环境结果可能存在差异(win7+jdk7):5:上面的代码和注释已经抛出了我的观点,代码相对简单,可能还有一些繁琐,转载 2020-11-03 10:23:21 · 106 阅读 · 0 评论 -
Java 字符串参数传递和修改(个人见解)
参考博文:https://blog.csdn.net/baidu_28997655/arti原创 2020-11-03 09:49:09 · 1673 阅读 · 0 评论 -
java中hashCode和identityHashCode的区别【从源码上区分(含equals方法)】
在java中,所有类都是从基类Object类中派生出的,所以首先我们先来看看在Object类中的hashCode()方法(后面有总结,想直接看结论的可以直接跳到后面) Object类中的hashCode方法和equals方法 先来看看源码: * <ul> * <li>Whenever it is invoked on the same obje...转载 2020-11-03 09:41:58 · 243 阅读 · 0 评论 -
Java -- 父类和子类拥有同名的成员变量的情况
Java – 父类和子类拥有同名的成员变量取值情况结论:当子类的成员变量与父类同名时,若对该成员变量进行操作的方法继承于父类,则改变和获取的是父类的成员变量。若对该成员变量进行操作的方法为子类所独有,或override父类,则改变和获取的是子类自己的成员变量。...原创 2020-10-28 15:13:45 · 2653 阅读 · 2 评论 -
Java -- 父类和子类拥有同名变量
Java – 父类和子类拥有同名变量 请仔细观察系列两段程序的不同之处:一个Son类重写print方法,另一个则没有重写。分析该问题必须从字节码的角度入手,否则根本不可能看清事情的本质。成员变量(非静态的)的赋值过程:默认初始化显示初始化原创 2020-10-28 10:15:14 · 4253 阅读 · 0 评论 -
Java -- 全量编译和增量编译
Java – 全量编译和增量编译参考博文在了解全量编译之前先来了解一下增量编译: 增量编译–对用户源程序局部修改后进行的重新编译的工作只限于修改的部分及与之相关部分的内容。相关部分的确定由编译系统确定,对用户是透明的。增量编译对软件开发,尤其是在调试期,可以大大缩短编译时间, 提高编译效率,这也是增量编译的优势所在。 举例:Eclipse理解了增量编译之后,全量编译也就不难了: 全量编译–对用户源程序局部修改后进行的重新编译的工作涉及全部源代码,并不只限于局部修改及其相关部分。换句话说,无原创 2020-10-28 11:11:41 · 3289 阅读 · 0 评论 -
什么是Java程序的主类? 应用程序和小程序的主类有何不同?
什么是Java程序的主类 ⼀个程序中可以有多个类,但只能有⼀个类是主类。应用程序和小程序的主类有何不同?在Java应用程序中,这个类是指包含main()方法的类。在Java小程序中,这个主类是一个继承子系统类JApplet或Applet的子类。应用程序的主类不一定要求是public类但小程序的主类必须是public类。主类是Java程序执行的入口点。简单说应用程序是从主线程启动(也就是 main() 方法)。原创 2020-10-14 15:50:22 · 1509 阅读 · 2 评论 -
白嫖Oracle账号
Oracle账号Oracle账号不能找回密码,总是报错,因此申请一个 大家一起下载资料。 账号 1 :amador.sun@foxmail.com密码:1211WaN!账号 2 :amador.sun@qq.com密码:1211WaN!---------------(20.09.28更新)-----------------------账号 3 :hellooracle123@qq.com密码:1211WaN!账号 4 :javacno.1@qq.com密码:1211WaN!转载 2020-10-01 11:52:36 · 841 阅读 · 0 评论 -
Java8 HashMap之tableSizeFor
Java8对许多内置的容器进行了优化与拓展,其中对HashMap的改变尤其大。之后将进行总结。 最近在看HashMap的源码时,发现了里面好多很不错的算法,相比Java7从性能上提高了许多。其中tableSizeFor就是一个例子。tableSizeFor的功能(不考虑大于最大容量的情况)是返回大于输入参数且最近的2的整数次幂的数。比如10,则返回16。该算法源码如下:static final int tableSizeFor(int cap) { int n = cap - ...转载 2020-10-23 21:05:00 · 192 阅读 · 0 评论 -
Java几种常量池区分(字符串常量池、class常量池和运行时常量池)
在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念。1.全局字符串池(string pool也有叫做string literal pool) 全局字符串池里的内转载 2020-10-23 20:31:43 · 1832 阅读 · 11 评论 -
Java中反射是否能够改变String的值?
转载连接:https://blog.csdn.net/guohengcook/article/details/81264746我们知道java的字符串类型String被设计成不可变的。那么我们还有办法改变它的值吗?先来看一下,截取自jdk1.8.0_151的java.lang.String类的声明:public final class String implements java.io.Serializable, Comparable<String>, CharSequence转载 2020-10-23 18:14:56 · 492 阅读 · 2 评论 -
强、软、弱、虚引用的区别和使用(The Best)
Java提供了四种级别的应用类型:强引用、软引用、弱引用及虚引用。那么这四种引用类型有什么区别呢?首先我们通过一张图来看看四种引用在Java中的表示:FinalReference由于FinalReference是包内可见,Finalizer是其唯一的扩展类。在外部是无法直接使用这两个类的,因为FinalReference引用类型是为JVM提供的,JVM会对那些实现了 Object 中 finalize() 方法的类实例化一个对应的FinalReference,提供 对象被 GC 前需要执行 fin转载 2020-10-17 21:14:59 · 149 阅读 · 0 评论 -
强引用、软引用、弱引用、虚引用总结
总结:强引用:普通new对象的引用 User user = new User(); jvm宁愿抛出OutOfMemory异常也不会去回收该对象软引用: SoftReference引用的装饰的对象,该对象的强引用应该赋值空 这里配合ReferenceQueue使用(也可以不配合),因为SoftReference本身也是new了一个对象 当他把别人的问题解决掉以后,也需要把自己的问题解决,所以当jvm把软引用 对象回收后,就会把自己的对象引用放到这个队列中,我们可以通过队列的poll() 方法查看,如果...转载 2020-10-17 20:58:20 · 72 阅读 · 0 评论 -
Java中的强引用,软引用,弱引用,虚引用有什么用?
每一种语言都有着自己操作内存元素的方式,C语言通过指针,而java就是通过引用。作为一门面向对象的语言,在java中世事万物皆对象。但是我们操作的标识符实际上是对象的一个引用(reference)。今天我们来分析一下java中的四种引用。一、引用的历史在Java中,我们的垃圾回收机制回收垃圾对象的时候就会依据对象的引用。比如说通过不同的垃圾回收算法,这里有两种:引用计数法和可达性分析法1、引用计数法:为每个对象添加一个引用计数器,每当有一个引用指向它时,计数器就加1,当引用失效时,计数器就减1,当计数器为0转载 2020-10-17 12:12:08 · 470 阅读 · 0 评论 -
你不可不知的Java引用类型之——虚引用
0|1定义虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个。一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获得一个对象实例。0|1说明虚引用,正如其名,对一个对象而言,这个引用形同虚设,有和没有一样。如果一个对象与GC Roots之间仅存在虚引用,则称这个对象为虚可达(phantom reachable)对象。当试图通过虚引用的get()方法取得强引用时,总是会返回null,并且,虚引...转载 2020-10-17 11:17:29 · 118 阅读 · 0 评论 -
Java -- 虚引用(PhantomReference)
“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。 虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时...转载 2020-10-17 10:44:04 · 531 阅读 · 0 评论 -
浅谈对JIT编译器的理解
浅谈对JIT编译器的理解。 1. 什么是Just In Time编译器?Hot Spot 编译当 JVM 执行代码时,它并不立即开始编译代码。这主要有两个原因:首先,如果这段代码本身在将来只会被执行一次,那么从本质上看,编译就是在浪费精力。因为将代码翻译成 java 字节码相对于编译这段代码并执行代码来说,要快很多。当 然,如果一段代码频繁的调用方法,或是一个循环,也就是这段代码被多次执行,那么编译就非常值得了。因此,编译器具有的这种权衡能力会首先执行解释后的代 码,然后再去分辨哪些方法会转载 2020-10-16 09:09:58 · 267 阅读 · 0 评论 -
Java 重载 - 重写
Java 重载 - 重写区别点重载方法重写方法发生范围同一个类子类中参数列表必须修改一定不能修改返回类型可修改一定不能修改异常可修改可以减少或删除,一定不能抛出新的或者更广的异常访问修饰符可修改一定不能做更严格的限制(可以降低限制)发生阶段编译器运行期...原创 2020-10-14 16:11:02 · 86 阅读 · 0 评论 -
Java发展历程
1991年4月,Sun公司成立了Green项目小组,专攻智能家电的嵌入式控制系统。由James Gosling博士领导的绿色计划(Green Project)开始启动,此计划的目的是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构。这个计划的产品就是Java语言的前身:Oak(橡树)。Oak当时在消费品市场上并不算成功,但随着1995年互联网潮流的兴起,Oak迅速找到了最适合自己发展的市场定位并蜕变成为Java语言。 1995年5月23日,Oak语言改名为Java,并且在Su.转载 2020-10-10 14:54:26 · 186 阅读 · 1 评论 -
详解编译型语言和解释型语言的区别
我们常用的高级语言有很多种,比较出名的有C\C++、Python、PHP、Go、Pascal等。而这些语言根据运行的方式不同,大体分为两种:编译型语言和解释型语言。 其中,编译型语言包括C\C++、Pascal、Go等。这里说的编译是指在应用源程序执行之前,就将程序源代码编译成汇编语言,然后进一步根据软硬件环境"翻译"成目标文件。一般称完成编译工作的工具为编译器。而解释型语言,在程序运行时才被“翻译”为机器语言。但是执行一次“翻译”一次,所以执行效率较低。解释器的工作就是解释型语言中,负责“..转载 2020-10-08 15:56:36 · 1434 阅读 · 0 评论 -
编译VS解释 动态VS静态 --语言
编译型和解释型 我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了。但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在...转载 2020-10-08 15:54:07 · 253 阅读 · 0 评论 -
编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别
最近在研究Python和Erlang。反复提到动态类型语言、动态语言、解释型语言这些概念。这些概念很生涩,在这里做一个总结。 编译型语言和解释型语言1、编译型语言需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语...转载 2020-10-08 15:31:14 · 201 阅读 · 0 评论 -
超线程和多线程的区别
关于线程,多线程,并发,并行等操作系统的基础知识,可以回顾我之前的博客 操作系统学习之一常用术语 物理CPU: 物理CPU就是插在主机上的真实的CPU硬件,在Linux下可以数不同的physical id 来确认主机的物理CPU个数。 核心数: 我们常常会听说多核处理器,其中的核指的就是核心数。在Linux下可以通过cores来确认主机的物理CPU的核心数。 逻辑CPU: 逻辑CPU跟超线程技术有联系,假如物...转载 2020-09-26 15:16:28 · 617 阅读 · 0 评论 -
多线程就一定比单线程快吗?
为什么要使用多线程?在探讨文章题目之前,我们先来思考这样一个问题,你为什么要使用多线程?我相信很多人在遇到这个问题时会不假思索的回答出答案,因为并发快,那为什么并发快呢?对于多核 CPU 来说,每个物理核心都能独立执行任务,这种条件下,使用并发技术(准确的来说这里可以称之为并行,因为多核)当然合情合理。但是我们来想想对于单核的 CPU ,为什么操作系统还要引入多线程技术呢?或者说是我们的程序为何要利用多线程技术呢? 设想一下这样的一个场景,我们现在的程序是单线程的,而且代码中充斥着大量的读取文件内容的转载 2020-09-26 12:55:42 · 1182 阅读 · 0 评论 -
关于.getClass()和.class的区别
一直在想.class和.getClass()的区别,思索良久,有点思绪,然后有网上搜了搜,找到了如下的一篇文章,与大家分享。 原来为就是涉及到java的反射~~~~~ Java反射学习 所谓反射,可以理解为在运行时期 获取对象类型信息的操作。传统的编程方法 要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性转载 2020-08-12 00:57:26 · 659 阅读 · 0 评论 -
为何不能直接在java类内使用输出函数
因为,class内只能放:成员变量、成员方法、构造方法、内部类。想要用System.out.println也可以。得用一个大括号将它裹住,这样相当于说明它是一个省略了头部声明的方法块。 ...转载 2020-08-08 09:21:48 · 412 阅读 · 0 评论