![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
文章平均质量分 72
以精通java语言为目标,认真对待每一篇文章
程序员徐小白
程序员徐小白,专注于Java后端研发领域。
同名微信公众号,我会第一时间在上面分享我的学习笔记,还有各种学习资料。
展开
-
【Java】简述断言(assert)的使用以及使用场景
前言说到 Java 的断言,我第一次听到这个名词的时候,还是在上大学的测试课,老师第一堂课就让我们学习了断言assert,然而因为那个老师是教安卓的,我忘记有没有使用断言框架了,反正那时用着没感觉它是 Java 的东西,后面又很少接触测试的东西,就几乎没有碰过断言assert了。那么为什么现在我会写关于断言assert的内容呢?我当然不是为了水文章啦,肯定是为了学习 Java 的冷门小知识!接下来,我从以下四个方面来介绍assert:什么是断言断言的使用场景如何开启断言断言如何使用第一原创 2022-03-08 09:00:00 · 23718 阅读 · 8 评论 -
【Java】java的原生clone只是一个浅拷贝!
浅拷贝和深拷贝这里会涉及到浅拷贝和深拷贝,我之前的文章(Java的传值方式中)也有提到然而像基本类型的数据,例如int、long这些,它们之间用==作比较都是true,因为它们在内存中都是作为常量来存储的。==是在比地址,而.equls可以在重写之后比较对象数据的差别.clone这里写一个clone方法的实例,首先是实现Object自带的clone方法,用这个方法创建一个对象,然后在这个clone上做一些修改,解决浅拷贝的问题。代码实现clone方法的类:PrototypeEntity/**原创 2021-06-21 11:56:51 · 257 阅读 · 0 评论 -
【Java】学会了自定义类加载器,以后的每一个类都要自己加载进内存
一、需要自定义类加载器的情况需要要加密源代码。如果想要对源代码进行加密,则可以考虑自己定义类加载器,在编译成.class文件之后,对.class文件进行加密操做,在加载到内存时,再调用自定义的类加载器进行解密源代码的来源具有局限性。当源代码的来源不是从硬盘中得来时(网络传输),则可以考虑自定义一个类加载器了,就可以自定义类的来源了二、自定义类加载器让我们来实现自定义类加载器吧,我们要关注的类只有一个loadClass,要关注的方法有三个,loadClass、findClass、defineCla原创 2020-05-27 18:03:12 · 481 阅读 · 0 评论 -
【Java】带你解读字节码(下)
6.父类(super_class)当前类的父类表示指定在常量池的位置00040x0004=4#407 0015 这个又指向#21#2101 0010 6a61 7661 2f6c 616e 672f 4f62 6a65 6374 acsii码表查询结果:java/lang/Object这里可以看出,这个类继承了Object类,所有类都继承这个类,所以我们没写,它也继承了。7.接口(interfaces)当前类实现的接口接口数量(interfaces_count)0000原创 2020-05-27 13:11:49 · 283 阅读 · 0 评论 -
【Java】一篇文章让你了解字节码是什么
1. 先来说一下什么是机械码机械码就是cpu能够直接读取并运行的代码,它是用**二进制编码**表示的,也叫做机械指令码。在编写这种代码时,需要**主动地去控制cpu**的一切资源,而且需要记住全部指令所做的动作,十分的麻烦,当然这也是计算机的底层代码,处理开发计算机的专业人员之外,已经很少人去研究了。 2.字节码字节码是一种**中间状态**的**二进制文件**,是由源码编译过来的,可读性没有源码的高。cpu并不能直接读取字节码,在java中,字节码**需要经过JVM转译**成机械码之后,cpu原创 2020-05-15 22:29:34 · 3537 阅读 · 4 评论 -
【Java】带你解读字节码(上)
三、java字节码的组成1.基本数据类型数据类型含义u1无符号单字节整数u2无符号2字节整数u4无符号4字节整数u8无符号8字节整数1Byte=8bit,在十六进制中,需要用两位数来表示1Byte。一个十六进制数需要4bit来表示。2.java字节码的格式类型数量名称含义u41magic魔数u21minor_version副版本号u21major_version主版本号u21cons原创 2020-05-27 13:11:01 · 461 阅读 · 0 评论 -
【Java】 以后遇到lambda别再一头问号啦
Lambda表达式为什么会有Lambda表达式要说Lambda表达式,就一定要先说一下匿名类了,像使用Thread时,要创建一个Runnable接口的实现类放入Thread的构造方法中,一般情况下都是采用内部类的形式来创建的例如Thread thread1=new Thread(new Runnable(){@Override public void run(){ c=1; a=d; }});这不是很乱嘛,于是就诞生了lambda表达式,lam原创 2021-05-26 13:29:24 · 142 阅读 · 0 评论 -
【Java】带你了解一个对象从出生到死亡
对象的生命周期Java对象在JVM中的运行周期大致上分为七个阶段,创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)用了那么久的Java对象,怎么可能不把它的生命周期搞清楚嘞?下面我将对每个阶段进行介绍创建阶段一个对象想要进入创建阶段,前提是它的类文件必须已经加载到内存中,并且创建了Class对象,这样才能根据类信息进行创建创建的过程:原创 2021-05-26 13:20:22 · 294 阅读 · 0 评论 -
【Java】很少人知道,Java居然有四种对象引用方式
一、为什么会有四种引用01在一开始当一个对象不被引用(就是没有属性/变量引用,例如Object ob=new Object();ob=null;)时,就会被JVM自动回收,在没有等于null之前就是强引用。打个比方,就像你去餐厅吃饭,你站在位置上就是引用了这个位置,服务员(JVM)就不会过来收走你的餐具,当你走了,服务员就会收走你的餐具02随着Java的发展,需求也越来越多样化了,有些人希望当一个对象不被引用时也不要被收走,而是在内存保存一段时间,于是软引用就诞生了。接着上面的例子,餐厅的老板(原创 2021-05-26 13:15:30 · 144 阅读 · 2 评论 -
【Java】简简单单的类初始化,面试题必考,建议反复阅读
类初始化过程需要类加载并初始化的时机一个类要创建一个实例main方法所在的类子类要初始化时,需先加载并初始化父类类初始化的过程一个类初始化就是执行<clinit>()方法(cl...原创 2021-03-27 23:58:00 · 115 阅读 · 0 评论 -
【Java】NIO不简单呐,Channel、Buffer、Selector
重要的一个接口和两个抽象类在NIO中,有一个接口和两个抽象类是我们需要重点了解的,Channel,Buffer,Selector1.ChannelChannel跟stream差不多,但是Channel是双向的(可以通过transferTo()或transferFrom()来改变数据的流向)接口源码public interface Channel extends Closeable { //Channel接口只有两个抽象方法 //需要实现功能:检查是否开启 public boolean原创 2020-05-28 22:25:47 · 247 阅读 · 0 评论 -
【Java】看完本篇文章,你就能自定义注解了
在Java中的注解是以@开头的,它会在编译,类加载,运行时被读取,然后由注解处理器来进行处理,注解仅仅是存放元数据,不会修改修饰对象的代码产生直接影响注解和类、接口、数组、枚举等关键字平起平坐,同样重要2.来源在注解还没有出现之前,一般使用XML文件来存储元数据的,配置文件的信息还有SQL语句都可以算是元数据,这就使元数据和代码耦合度十分的低,如果项目十分大的话,就会造成维护困难,于是就诞生了注解,让元数据和代码紧密结合,极大的降低了编程的复杂度,在后来,注解功能就不仅仅局限与绑定元数据了注解是真原创 2020-05-26 08:47:03 · 178 阅读 · 0 评论 -
【Java】毫不夸张地说,反射机制是Java的精髓
JVM有一个运行时数据区,这个运行时数据区分为方法区,堆区和栈区,我们能够通过反射机制获取的class信息就是存储在方法区中的,这里的class信息是通过.java文件编译成.class文件,然后由类加载器装载运行时数据区时,在方法区中就会产生对应的class实例。我们可以通过反射机制从方法区中**获取相应的class实例,然后就可以获取到对应类型的函数、属性、父类、接口等 Class 内部信息**反射机制的**原理就是直接读取存在方法区中的class实例**,至于读取信息的步骤则是严格按照.clas原创 2020-05-25 10:58:28 · 297 阅读 · 0 评论 -
【Java】线程池凭什么可以提高运行效率?到底有多少种线程池?
**一个线程池包含了一个或多个线程**,这几个**线程都由线程池统一管理**。一般情况下,线程池在**刚接到任务时**就会**创建一个线程**去执行任务,当线程数量**达到线程池规定的线程数量**时,就**不会再进行创建**了,而是把任务添加到工作队列中,线程池中空闲的线程就会去执行队列中的任务举个例子,线程池就是包头工,他的手底下会有几个工人(线程)一旦包头共接到了工作,就会轮流分配给工人,等工人做完了工作再来接下一个原创 2020-05-23 11:01:04 · 597 阅读 · 0 评论 -
【Java】一篇文章教会你——线程、指令重排、线程内存模型
> 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是**系统进行资源分配和调度的基本单位**,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。> ——百度百科进程就是在操作系统上拥有资源并且能够独立运行的一个独立单位,**每个进程都有各自独立的一块内存空间**,内存空间中包含着每个进程的代码和数据空间,**进程之间的切换会有较大的开销**。原创 2020-05-22 08:41:26 · 234 阅读 · 0 评论 -
【Java】 简单讲述一下上转型和下转型的概念
1.上转型假如现在有两个类,一个是父类,一个是继承了父类的子类把**子类的对象交给父类去引用**,就是上转型 特点上转型得来的父类对象只能使用父类中存在的方法,如果子类重写了这个方法,那就是调用子类的方法 2.下转型假如父类的对象是子类上转型而来的,将这个**父类对象强转成子类对象**,就是下转型 特点就是相当于重新new了一个子类对象,不是上转型得来的对象不能下转型原创 2020-05-21 10:29:27 · 784 阅读 · 0 评论 -
【Java】NIO和BIO有什么区别?回答:天壤之别
NIO是java1.4中引入的,被称为**new I/O**,也有说是**non-blocking I/O**。我个人认为,non-blocking I/O是包含在new I/O里面的,而我们大多数讲的NIO都是网络编程里的概念,但是我们今天主要讲的是数据处理的这一块的内容。原创 2020-05-21 10:28:27 · 6332 阅读 · 0 评论 -
【Java】一篇文章让你会用Java的io流
JavaIO流,是一种计算机用语。主要是用于处理数据的传输。——百度百科流是指数据的流动,io流就是输入输出的流动。在java中对数据的操作是用流的方式来实现的,数据不可能一瞬间就全部地从一个设备传到另一个设备,所以只能采用一点一点流动的方式。输入流就是将其他地方的数据读取到程序中,输出流就是将程序中的数据写入到其他地方。二、io流的分类1.原创 2020-05-18 18:07:32 · 209 阅读 · 0 评论 -
【Java】简单列举一下抽象类和接口的区别
文章目录一、区别二、使用场景接口抽象类三、总结一、区别抽象类(abstract)接口(interface)实现×√继承√×能实例化××实现或继承使用的关键字extendsimplements实现或继承的类叫做子类类可以多继承或多实现×√方法声明√√方法实现√×方法的标识符punlic、private、protectedpublic实现抽象方法√√变量普通变量静态不可修改常量原创 2020-05-18 12:45:27 · 239 阅读 · 0 评论 -
【Java】深入了解枚举类的来源和本质
一、什么是枚举类1.概念枚举的意思就是一个一个的列举出来。而枚举类就是起到了把对象一个一个列举出来的作用,枚举类是java5中提出的新概念,但是到现在也有很多人不懂这个枚举类,这些人也包括我,以下是我对枚举类的学习总结。2.为什么会有枚举类枚举类出现之前列举对象一般都是使用sta原创 2020-05-18 12:45:02 · 277 阅读 · 0 评论 -
【Java】从interface出发学习集合
文章目录一、什么是集合1.广义上的概念2.在java中的概念一、什么是集合1.广义上的概念集合,简称集,是数学中一个基本概念,也是集合论的主要研究对象。集合论的基本理论创立于19世纪,关于集合的最简单的说法就是在朴素集合论(最原始的集合论)中的定义,即集合是“确定的一堆东西”,集合里的“东西”则称为元素。现代的集合一般被定义为:由一个或多个确定的元素所构成的整体——百度百科集合就是包含了一堆确定的元素的整体。2.在java中的概念集合是一种存放对象的数据结构。...原创 2020-05-14 23:04:36 · 221 阅读 · 0 评论 -
【Java】&&与&和||与|
文章目录一、这四个符号是什么二、在什么情况下会使用这四个符号一、这四个符号是什么&&和||是逻辑运算符&和|是位运算符&&是断路与,||是断路或(后面解释)&是按位与,|是按位或(后面解释)二、在什么情况下会使用这四个符号&&和||这两个是逻辑运算符,一般在做条件判断时会用到。boolean a=false;boolean b=true;if(a&&b){这里一旦判断到false,就不会再往下判断原创 2020-05-11 21:33:42 · 235 阅读 · 0 评论 -
【Java】 带你了解Java的传值方式
结论我先把结论放在前头,在java中,传递的对象如果是基础类型的话,就会直接将值传递过去,传递的对象是需要new的话,就是将对象的地址传递过去。这个也困扰了我很久,c语言里还有指针可以区分,而java中就没有指针了,就很难区分了。分析直接上代码package test;/** * @author xxj * 检验java的传值方式 */public class TransmitValue { private int a=0; private MyClass m=原创 2020-05-09 17:27:43 · 433 阅读 · 0 评论