![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java基础
文章平均质量分 58
大叶子不小
这个作者很懒,什么都没留下…
展开
-
详细总结Java堆栈内存、堆外内存、零拷贝浅析与代码实现
一、堆栈内存堆栈内存,顾名思义,指的是堆内存以及栈内存,其中,堆内存是由JavaGC进行管理的内存区域,而栈内存则是线程内存。关于栈内存,这里不去细说。以Hotspot为例,堆内存的简要结构如下图所...原创 2022-10-24 11:25:56 · 396 阅读 · 0 评论 -
Arrays.copyOf() 用法:
Arrays.copyOf() 用法:Arrays的copyOf()方法传回的数组是新的数组对象,改变传回数组中的元素值,不会影响原来的数组。copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值,例如:代码块:import java.util.Arrays;public class ArrayDemo {public static void main(String[] args) { int[] arr1 = {1, 2,原创 2021-02-09 20:21:03 · 533 阅读 · 0 评论 -
Java复制数组的方法
java数组拷贝主要有四种方法,分别是循环赋值,System.arraycopy(),Arrays.copyOf()(或者Arrays.copyOfRange)和clone()方法。下面分别介绍一下这几种拷贝。一、循环拷贝(速度相对比较慢) 循环拷贝其实没什么好说的啦,就是用一个for循环进行元素的逐个拷贝,进行深拷贝或者浅复制这个大家可以自己把握。二、System.arraycopy(浅拷贝) 这个是系统提供的拷贝方式,也是我们推荐使用的拷贝方式,它是浅拷贝,也就是说对于非基本类型而原创 2021-02-09 20:20:27 · 406 阅读 · 0 评论 -
java System.arrayCopy 参数意义,使用
放假前看点小知识点下面是 System.arrayCopy的源代码声明 :public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)代码解释: Object src : 原数组 int srcPos : 从元数据的起始位置开始 Object dest : 目标数组 int destPos : 目标数组的开始起始位置 int length : 要cop.原创 2021-02-09 20:19:48 · 267 阅读 · 0 评论 -
form表单提交和JSON区别
form表单是“键值对”的数据格式,例如:a=1&b=2&c=3而json格式则与之不同,如下:{"a":1,"b":2,"c":3}传递的数据比较简单,那么两种方式基本上没什么大区别(当然后台接收数据的方式肯定是不同的),但是如果数据比较复杂,比如包含数组、对象等时,就只有json才能胜任了。此外,如果数据是通过表单提交的,那么当然使用默认的form即可,因为它会自动构建数据结构,无需手工拼接;而如果是通过ajax发送数据,则最好使用json,因为可以通过简单的方法把对象转换为.原创 2021-02-09 14:43:31 · 6739 阅读 · 2 评论 -
关于System.nanoTime()的一点理解
在查日志的时候,里边有个时间记得是nanotime,之前看过一次,再看一次,记下来事情起源最近在研究Java中的Random实现的时候,发现Random的种子有用到System.nanoTime() public Random() { this(seedUniquifier()^System.nanoTime()); } 以前在学Java的时候,就听别人说过,Java中的随机数都是伪随机数,是通过随机种子通过复杂的计算得到的,而Java中的种子和时间...原创 2021-01-18 19:17:15 · 932 阅读 · 3 评论 -
根据函数System.currentTimeMillis()返回的毫秒数得到日期
//计算自1970年1月1日 ,根据函数System.currentTimeMillis()返回的毫秒数得到日期class ch0533 {public static void main(String[] args) { long ms=System.currentTimeMillis(); System.out.println(formatTime(ms)); }public static String formatTime(long ms) { int.原创 2021-01-18 19:06:22 · 770 阅读 · 0 评论 -
Java中为什么静态方法不能被重写?为什么静态方法不能隐藏实例方法?
问题描述 Java中为什么静态方法不能被重写?为什么静态方法不能隐藏实例方法?诸如此类。前期准备 首先理解重写的意思,重写就是子类中对父类的实例方法进行重新定义功能,且返回类型、方法名以及参数列表保持一致,且对重写方法的调用主要看实际类型。实际类型如果实现了该方法则直接调用该方法,如果没有实现,则在继承关系中从低到高搜索有无实现。那么问题又来了,为什么只能对实例方法才能重写?我头好晕,这两个问题在这互相推脱责任。 理解三个概念:静态类型,实际类型,方法接受者。Person stud原创 2021-01-06 19:44:45 · 689 阅读 · 0 评论 -
为什么说ArrayList,LinkedList是线程不安全的,以及CopyOnWriteArrayList和vector为什么安全
概要介绍首先说一下什么是线程不安全:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。 如图,List接口下面有两个实现,一个是ArrayList,另外一个是vector。 从源码的角度来看,因为Vector的方法前加了,synchronized 关键字,也就是同步的意思,sun公司希望Vect.原创 2020-12-22 17:10:07 · 3123 阅读 · 0 评论 -
volatile对单例模式(双重校验锁)的一个优化细节
不知道大家有没有关注过一个细节,那就是在双重校验锁中的getInstance方法中,定义了一个局部变量来接收Singleton的单例对象。代码实现如下:publicclassSingleton{privatestaticvolatileSingletoninstance=null;privateSingleton(){}publicstaticSingletongetInstance(){Singleton...原创 2020-06-27 11:21:45 · 400 阅读 · 1 评论 -
重新认识final关键字-----为什么单例中要加private static final
饿汉式的话不加final应该问题不大(因为不涉及到并发的问题)下面这个例子一定要给obj加上final=========================================================关于final重排序的问题:最近看书碰到的问题下面是引用这里假设一个线程A执行writer ()方法,随后另一个线程B执行reader ()方法。下面我们通过这两个线程的交互来说明这两个规则。写final域的重排序规则写final域的重排序规则禁止把..原创 2020-12-08 10:00:55 · 522 阅读 · 0 评论 -
深入理解SPI机制
一、什么是SPISPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。我们先通过一个很简单的例子来看下它是怎么用的。1、小栗子首先,我们需要定义一个接口,SPIServicepackage com.viewscenes.netsupervisor.spi;原创 2020-12-04 16:48:00 · 294 阅读 · 0 评论 -
为什么子类中不能访问另一个包中父类中的protected方法?
前言 其实这个问题问法是错的,在子类中是可以访问另一个包中父类中的protected方法,能问出这样的问题,多半是在不同包的子类中创建了父类对象,通过父类对象去调用protected方法,结果发现编译不通过,所以才会萌生这样的疑问。 正确的访问方式: 1. super.method() //protected 2. 创建子类对象instance,通过instance.method()访问表面理解为什么子类中不能访问另一个包中父类中的protected方法? 一般我们原创 2020-12-04 11:29:04 · 1681 阅读 · 3 评论 -
Java中static(静态变量/方法)的优缺点
static关键字声明的变量或方法称为静态变量/方法静态static变量/方法在类加载的过程中被初始化,在内存中只存在一份,所以可以把它当作是全局变量/方法。优点属于类级别的,不需要创建对象就可以直接使用. 全局唯一,内存中唯一,静态变量可以唯一标识某些状态. 在类加载时候初始化,常驻在内存中,调用快捷方便.应用场景:1. 静态方法最适合工具类中方法的定义;比如文件操作,日期处理方法等.2. 静态方法适合入口方法的定义;如单例模式,因为从外部拿不到构造函数,所有定义一个静态的方法获.原创 2020-11-25 17:45:59 · 2019 阅读 · 1 评论 -
Java中static class使用方式
java允许在一个类里面定义静态类。如内部类(nested class)。在java中,不能用static修饰顶级类(top level class)。只有内部类可以为static。 静态内部类和非静态内部类之间区别:1. 内部静态类不需要有指向外部类的引用。但非静态内部类需要。2. 静态类只能访问外部类的静态成员,非静态内部类能够访问外部类的静态和非静态成员。3. 非静态内部类不能脱离外部类实体被创建,非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。/* 下面程.原创 2020-11-25 17:41:29 · 239 阅读 · 0 评论 -
Java—内部类(三)—内部类的继承
内部类的继承内部类和其他普通类一样,同样可以被继承,这样给本来就十分灵活的内部类增加了更好的结构性和代码复用性。只是内部类的继承和普通类有一些不同之处,是在使用时需要多加注意的。因为内部类在创建时需要外部类的引用,所以在内部类的继承上也需要外部类的协助。接下来看示例代码。class WithInner{ class Inner{ }}public class test3 extends WithInner.Inner{ test3(WithInner wi){原创 2020-11-25 17:33:43 · 1305 阅读 · 0 评论 -
Java—内部类(二)—实现闭包与回调
前言:Java的闭包与回调我也是第二次接触这个概念,之前在自学Android的时候绘制View很多地方都用到了监听器回调,一直不是很明白,现在回头巩固Java的基础总算的弄明白,尽量用我自己理解的语言来和大家分享,希望对不懂的朋友可以有一定的帮助,大神也可以给我一点指点。概念:我觉得在理解一个事物之前,需要对这个事物在我们的大脑里有一个初步的概念,然后再对这个概念补充上细节,这是我在理解一些陌生事物的时候的一个方法,也可以说是类比理解法吧。先说闭包~一.闭包闭包,故名思意就是,把一个包关起原创 2020-11-25 17:32:57 · 176 阅读 · 0 评论 -
Java—内部类(一)
内部类 可以是private局部内部类匿名内部类======================内部类定义:就是将类的定义放在另一个类的内部。一. 内部类的创建创建就直接将内部类的定义放在另一个类的内部就可以了。代码如下:package Test_1;public class Outer { class Inner{ } public Inner getInner(){ return new Inner(); } ...原创 2020-11-25 17:32:11 · 139 阅读 · 0 评论 -
java异常体系
1 异常的继承体系结构16301c82ebcc2b92.jpegThrowable 类是 Java 语言中所有错误或异常的超类。 只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。 Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。 最后,它还可以包含 cause(原因):另一个导致此 throwable 抛出的 t原创 2020-11-24 08:50:19 · 530 阅读 · 0 评论 -
Enum和EnumMap的使用
在实际应用中,有的变量只有几种可能取值。如人的性别只有两种可能取值,星期只有七种可能取值。在 Java语言中对这样取值比较特殊的变量可以定义为枚举类型。所谓枚举是指将变量的值一一列举出来,变量只限于列举出来的值的范围内取值。枚举是一个特殊的类,可以定义自己的变量,自己的方法,构造方法,甚至可以实现一个接口等等,只是它的实例是事先定义好的,限定了范围,可以使用的实例只能在限定范围内取得。enum Car{ //枚举实例,限定枚举实例范围 lamborghini(888888,"兰博基原创 2020-11-19 11:45:25 · 5911 阅读 · 0 评论 -
Velocity基本常用语法
Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。作为一个比较完善的模板引擎,Velocity的功能是比较强大的,但强大的同时也增加了应用复杂性。一、基本语法1、"#"用来标识Velocity的脚本语句,包括#set、#if 、#else、#end、#foreach、#end、#iinclude、#parse、#macro等;如:#if($info.imgs)&l原创 2020-11-12 11:16:09 · 1922 阅读 · 0 评论 -
java xml解析工:dom4j , jdom , jaxb , stax, sax的具适用场景比较
工作中会遇到各种xml的读和写,在此总结一下各自的使用场景。1,dom4j,最常用的xml读写工具。功能强大,jdom的升级版,复杂的xml读写的首选,但是一次加载,占内存。最喜欢的就是它的Xpath功能。2,jdom,dom,解析xml时,一次性加载进内存,大文件容易OOM,缺点即优点,却方便修改,适用于文件不大,需要反复修改的xml文件,jdom2.0内部可选sax方式解析,也挺好用。3,stax,sax 都不用一次性加载进内存,流式处理,边解析边处理stax当xml 文档非常大,.原创 2020-11-10 11:08:04 · 867 阅读 · 0 评论 -
ThreadLocal用法详解和原理
一、用法ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。1、ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。2、ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。3、ThreadLocal.remov...原创 2019-06-12 09:09:52 · 195 阅读 · 0 评论 -
quartz的基本使用
创建要被定执行的任务类 这一步也很简单,只需要创建一个实现了org.quartz.Job接口的类,并实现这个接口的唯一一个方法execute(JobExecutionContext arg0) throws JobExecutionException即可。如:package com.fync.quartz;import java.text.SimpleDateFormat;import java.util.Date;import org.quartz.Job;import or.原创 2020-11-09 16:58:15 · 175 阅读 · 0 评论 -
RandomAccessFile类——高效快捷地读写文件
个人总结:getFilePointer()和seek()方法是一个相同的指针代码里的read()和write都会使这个指针移动====================================================================RandomAceessFile类RandomAccessFile类是一个专门读写文件的类,封装了基本的IO流,在读写文件内容方面比常规IO流更方便、更灵活。但也仅限于读写文件,无法像IO流一样,可以传输内存和网络中的数据。R原创 2020-11-09 14:53:32 · 985 阅读 · 0 评论 -
OutputStreamWriter类
1、概述 转换流 java.io.OutputStreamWriter,是Writer的子类,是从字符流到字节流的桥梁。 它使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。 2、继承父类的共性成员方法 该类继承 Writer 类,继承了父类的共性成员方法 1 2 3 4 5 6 7 void write(int c) 写入单个字符。 void .原创 2020-11-09 11:23:30 · 648 阅读 · 0 评论 -
JAVA基础知识之InputStreamReader流
BufferedReader reader = null;PrintWriter writer = null;try { reader = new BufferedReader(new InputStreamReader(client.getInputStream(), Constant.CHARSET));String reqMsg = reader.readLine();logger.info("shadow recive client message:" + reqMsg);.原创 2020-11-09 11:03:29 · 554 阅读 · 0 评论 -
【java】Observer和Observable详解
1.必要性1.1 观察者模式是oo设计中经常用到的模式之一,大家在解决实际需求时,观察者模式往往都会用到,而javase中已经提供了Observer接口和Observable类让你简单快速的实现观察者模式,因此有必要去了解Observer和Observable;2.观察者模式概述2.1 角色:被观察对象,观察者2.2 关系:1).被观察对象:观察者 = 1:n2).被观察对象状态发生变化,会通知所有观察者,观察者将做出相应的反应2.3 详细说明:参见【设计模式】观察者模式3.源码原创 2020-11-02 10:21:41 · 1455 阅读 · 2 评论 -
StringBuffer与StringBuilder的区别,及实现原理
区别1、StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,2、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。3、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全而StringBuffer则每次都需要判断锁,效率相对更低实现原理StringBuffer类继承自A...原创 2020-10-26 09:38:18 · 1352 阅读 · 0 评论 -
Java 动态代理与class字节码动态修改技术
代理分两种技术,一种是jdk代理(机制就是反射,只对接口操作),一种就是字节码操作技术。前者不能算技术,后者算是新的技术。未来将有大的动作或者较为广泛的应用和变革,它可以实现代码自我的编码(人工智能,代码智能)。先看看jvm class技术:字节码改写:(一)jdk 动态代理:1.定义业务逻辑 public interface Service { //目标方法 public abstract void add(); } ..原创 2020-10-19 18:26:50 · 1025 阅读 · 0 评论 -
泛型
java中的泛型:类型限定的意思本质:把对象/集合里边元素的类型推迟到创建集合的时候指定本质2:类型参数化完整写法是两边都加泛型类型右边可以不写泛型:因为在1.7的时候会有泛型推断右边加泛型,左边没加,等于没用泛型桥接,泛型擦除// 最初的代码public class Node<T> {public T data;public void setData(T data) {this.data = data; }}public class MyNode extends原创 2020-10-19 07:39:44 · 133 阅读 · 0 评论 -
代理模式的实际运用--(以mybatis拦截器实现原理为例)
之前在写mybatis拦截器的时候,因为不懂原理,琢磨了很久,不知道怎么写,在网上找了很多资料,才知道mybatis的拦截器主要还是通过代理实现的,而且我在之前的博文中刚好学习了代理模式。更精细的是,在mybatis对代理的应用上,不管是封装易用性,减少代码耦合度上,都可以让我之前写的代理模式demo进一步改进,也让我加深了对代理模式的理解。静态代理需要自己写代理类,比较麻烦,代理的东西一多就很不方便,动态代理只要简单的实现InvocationHandler接口,让jvm自己在运行时生成所需的代理类.原创 2020-10-14 16:17:14 · 212 阅读 · 0 评论 -
Proxy.newProxyInstance的秘密
在我们用Proxy.newProxyInstance实现动态代理的时候,有三个参数,第一个便是classloader,这一篇文章就是简单看一下Proxy.newProxyInstance是如何实现动态代理的,因为我们后面可以以此为参考,实现自己的动态代理工具。public static Object newProxyInstance(ClassLoader loader, Class<?>[] interf转载 2020-10-14 15:08:11 · 7324 阅读 · 0 评论 -
Java 反射机制(包括组成、结构、示例说明等内容)
第1部分 Java 反射机制介绍Java 反射机制。通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”。这里“类的部分已经的信息”,可以是“类名”或“类的对象”等信息。“类的全部信息”就是指“类的属性,方法,继承关系和Annotation注解”等内容。举个简单的例子:假设对于类ReflectionTest.java,我们知道的唯一信息是它的类名是“com.skywang.Reflection”。这时,我们想要知道ReflectionTest.java的其它信息(原创 2020-10-14 11:06:08 · 100 阅读 · 0 评论 -
Synchronized和Lock区别
0、synchronized实现原理Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法块,锁是括号里面的对象 当一个线程访问同步代码块时,它首先是需要得到锁,当退出或者抛出异常时必须要释放锁,那么它是如何来实现这个机制的呢?我们先看一段简单的代码:package cn.alibab.javap;public class SynchronizedTest { publi原创 2020-10-03 00:03:40 · 249 阅读 · 0 评论 -
线程生命周期的几种状态
目录线程生命周期的几种状态操作系统通用线程状态Java语言线程状态如何查看线程处在什么状态程序中调用getState()方法jstack 命令查看Arthas灵魂追问线程生命周期的几种状态刚接触线程生命周期时,我总是记不住,也理解不了他们的状态,可以说是比较混乱,更别说它们之间是如何进行状态转换的了。原因是我把操作系统通用线程状态和编程语言封装后的线程状态概念混淆在一起了操作系统通用线程状态个人觉得通用线程状态更符合我们的思考习惯。其状态总共...原创 2020-10-02 23:33:37 · 520 阅读 · 0 评论 -
Arrays.sort和Collections.sort排序方法跟踪源码发现
从源码上看,基本类型的排序都是使用了DualPivotQuicksort的排序方法。DualPivotQuicksort是快排的一种优化。 当参数类型为对象数组时,使用的TimSort。双轴快排:***快速排序***使用的是分治思想,将原问题分成若干个子问题进行递归解决。选择一个元素作为轴(pivot),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比轴元素小,另外一部分的所有数据都比轴元素大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据原创 2020-09-16 09:34:38 · 182 阅读 · 0 评论 -
Java中的Collections#sort方法的时间复杂度是多少
参考:https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#sort%28java.util.List%29https://stackoverflow.com/questions/4254122/what-is-the-time-complexity-of-java-util-collections-sort-method这取决于您使用的Java版本.但是最后,Big-O时间复杂度仍然是O(N * log(N)).对于原创 2020-09-14 14:26:37 · 2953 阅读 · 0 评论 -
Comparator比较器顺序问题,Collections.sort()源码分析
提示:分析过程是个人的一些理解,如有不对的地方,还请大家见谅,指出错误,共同学习。源码分析过程中由于我写的注释比较啰嗦、比较多,导致文中源代码不清晰,还请一遍参照源代码,一遍参照本文进行阅读。原理先将集合中的部分元素排列好顺序。 然后再将剩余的元素用二分法插入到已排好序(二分法的使用是建立在已排好序的前提下)的元素中去。然后得到排好序的集合。测试代码:package com.abchina.sort;import java.util.*;/** * @author : yewang原创 2020-09-14 11:25:45 · 695 阅读 · 0 评论 -
值引用传递应用引发的思考,求大佬答疑
看这篇文章引发的思考:IDEA使用-Debug回到上一步思考一:首先这篇文章涉及到的对java值传递和引用传递的区别。找到了之前的测试代码:public class ChangeTest { private String str = "original"; private char[] chars = {'a','a','a'}; String[] stringss = {"aa","bb"}; int ii =1; Integer ccc = 0;原创 2020-09-14 08:28:55 · 121 阅读 · 0 评论