
java基础
文章平均质量分 85
qijingwang
初心易得,始终难守
展开
-
简单说一说Java中的CopyOnWriteArrayList
Java中的CopyOnWriteArrayList原创 2022-06-13 19:09:47 · 321 阅读 · 0 评论 -
Java方法签名
方法签名的意义对于同名不同类、同类不同名的方法,方法签名的意义并不是很大,但是对于重载方法来说,方法签名的意义就十分巨大了。由于重载方法之间的方法名是相同的,那么我们势必要从构成方法的其他几个要素中找到另一个要素与方法名组成能够唯一标示方法的签名,方法体当然不予考虑。那么就是形参列表和返回值了,但是由于对于调用方法的人来说,方法的形参数据类型列表的重要程度要远远高于返回值,所以方法签名就由方法名+形参列表构成,也就是说,方法名和形参数据类型列表可以唯一的确定一个方法,与方法的返回值一点关系都没有,这是原创 2021-08-03 20:46:11 · 9010 阅读 · 1 评论 -
Java中几种常量池的区分
在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念。1.全局字符串池(string pool也有叫做string literal pool)全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,原创 2021-07-16 20:27:09 · 338 阅读 · 0 评论 -
java内存分配详解
对于java程序员来说,在虚拟机的自动内存管理机制下,不需要显式的对new出来的对象进行free和delete操作。但是了解java是如何进行内存分配的,对我们排查错误具有极大的帮助。今天笔者按照所看的书上的内容和自己的理解来简单的谈一下java的内存分配问题。关于java运行时的数据区域,主要涉及以下几个: 程序计数器:它主要存储的是当期线程所执行的字节码的行号等信息,然后字节码解释器根据计数器中存储的内容来选取下一条需要执行的字节码指。因此,可以看出,每条线程都有一个独立的程序计数器,它是线程原创 2021-07-16 20:17:42 · 707 阅读 · 1 评论 -
ThreadLocal的内存泄露?什么原因?如何避免?
ThreadLocal的内存泄露?什么原因?如何避免?前言在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露、强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这样情况发生,增强系统的健壮性。内存泄露内存泄露为程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光,广义并通俗的说,就是:不再会被使用的对象或者变量占用的内存...原创 2021-06-04 11:17:25 · 166 阅读 · 0 评论 -
JVM之类加载机制
一个Java类从被加载到虚拟机内存到被卸载出内存为止,生命周期一共包括如下几个阶段:加载(Loading) 验证 (Verfication) 准备 (Preparation) 解析 (Resolution) 初始化 (Initialization) 使用 (Using) 卸载 (Unloading)其中验证、准备、解析这个3个部分统称为链接(Linking)。加载、验证、准备、初始化和卸载这5个阶段开始执行的顺序是一定的,但不意味着这几个阶段是分开执行的,这些阶段通常是相互交.原创 2021-04-28 11:30:11 · 140 阅读 · 0 评论 -
位运算、补码、反码、原码
正数位移运算Java中有三个位移运算:• <<:左移 • >>:右移 • >>>:无符号右移我们直接看一下Demo:System.out.println(2 << 1); // 4System.out.println(2 >> 1); // 1System.out.println(2 >>> 1); // 1System.out.println(-2 << 1);原创 2021-02-24 19:43:58 · 312 阅读 · 0 评论 -
Base64加密后有换行回车的解决
据RFC 822规定,每76个字符,还需要加上一个回车换行有时就因为这些换行弄得出了问题,解决办法如下,替换所有换行和回车String bTemp = Base64.encodeBase64String("123".getBytes()); bTemp = bTemp.replaceAll("[\\s*\t\n\r]", "");...原创 2020-10-12 14:37:50 · 1332 阅读 · 0 评论 -
Java 为什么要加 final 关键字
现象描述 原因分析 情景对比 在开发过程中,由于习惯的原因,我们可能对某种编程语言的一些特性习以为常,特别是只用一种语言作为日常开发的情况。但是当你使用超过一种语言进行开发的时候就会发现,虽然都是高级语言,但是它们之间很多特性都是不太相同的。现象描述在 Java 8 之前,匿名内部类在使用外部成员的时候,会报错并提示“Cannot refer to a non-final variable arg inside an inner class defined in a d...原创 2020-07-21 19:37:00 · 183 阅读 · 0 评论 -
Java中String接受的最大字符串的长度
java字符串String的最大长度,要分两个阶段,编译阶段及运行时阶段编译阶段:我们在编写源代码的时候,如果使用 Sting str = "aaaa";的形式定义一个字符串,那么双引号里面的ASCII字符最多只能有 65534 个。为什么呢?因为在class文件的规范中, CONSTANT_Utf8_info表中使用一个16位的无符号整数来记录字符串的长度的,最多能表示 655...原创 2020-03-26 18:32:56 · 3263 阅读 · 0 评论 -
JAVA多线程·并发问题及解决思路
一、概述1. 线程线程允许在同一个进程中存在多个程序控制流。线程可以共享进程的资源,但是每个线程都有自己的程序计数器、栈和局部变量表。同一进程中的不同线程能够访问相同的变量,并且在同一个堆上分配对象。2. 多线程多线程的优势/作用提高程序的运行性能。 充分利用系统的处理能力,提高系统的资源利用率。 提高系统响应性,即线程可以在运行现有任务的情况下立即开始处理新的任务。多线...原创 2020-03-16 10:10:13 · 3050 阅读 · 0 评论 -
Java队列之ArrayBlockingQueue
1、简介ArrayBlockingQueue,顾名思义:基于数组的阻塞队列。数组是要指定长度的,所以使用ArrayBlockingQueue时必须指定长度,也就是它是一个有界队列。它实现了BlockingQueue接口,有着队列、集合以及阻塞队列的所有方法,队列类图如下图所示既然它在JUC包内,说明使用它是线程安全的,它内部使用ReentrantLock来保证线程安全。...原创 2020-02-28 16:47:02 · 432 阅读 · 0 评论 -
当一个单例的对象长久不用时,会不会被jvm的垃圾收集机制回收
首先说一下为什么会产生这一疑问,笔者本人再此之前从来没有考虑过垃圾回收对单例模式的影响,直到去年读了一本书,《设计模式之禅》秦小波著。在书中提到在j2ee应用中,jvm垃圾回收机制会把长久不用的单例类对象当作垃圾,并在cpu空闲的时候对其进行回收。之前读过的几本设计模式的书,包括《java与模式》,书中都没有提到jvm垃圾回收机制对单例的影响。并且在工作过程中,也没有过单例对象被回收的经历,加上...原创 2019-12-25 15:14:03 · 2156 阅读 · 3 评论 -
类的加载方式
类的加载方式1、隐式加载 -new2、显式加载 -ClassLoader.loadClass和Class.forName区别:方式1:new 通过关键字 然后通过不同的构造器直接创建实例。如:new String() ,new String("test")方式2:需要加载.class文件获取Class对象,通过Class对象,获取构造器,然后调用newInstance方法创建对象实...原创 2019-12-24 18:11:34 · 487 阅读 · 0 评论 -
ByteArrayOutputStream或ByteArrayInputStream不需要关闭流原因分析
在解压图片的时候发现ByteArrayOutputStream不需要关闭,为啥呢?ByteArrayOutputStream或ByteArrayInputStream是内存读写流,不同于指向硬盘的流,它内部是使用字节数组读内存的,这个字节数组是它的成员变量,当这个数组不再使用变成垃圾的时候,Java的垃圾回收机制会将它回收。所以不需要关流。如下图所示,ByteArrayOutputStream...原创 2019-10-18 10:41:00 · 955 阅读 · 0 评论 -
构造器是静态方法吗?New一个子类对象的时候是否创建了父类的对象
在thinking in java中,第96页提到,“即使没有显示地使用static关键字,构造器实际上也是静态方法“,对此我产生了疑惑,于是找相关资料进行确认,在一篇大神的博客中得到了答案,那就是构造器不是静态方法。主要是以下几点原因:Java虚拟机规范第二版中定义了四种不同的字节码指令来处理Java程序中不同种类的方法的调用:· invokestatic - 用于调用类(静态)方法 · inv...原创 2018-05-17 20:02:43 · 650 阅读 · 0 评论 -
谈谈Java中的异常
在正常的程序设计中,程序异常处理是非常关键和重要的一部分。试想一个项目中没有一个好的异常处理,这个项目会怎么样?什么是异常异常其实是程序上的错误,包括程序逻辑错误和系统错误。比如数组下标越界、内存溢出等,这些都是意外的情况,错误在我们的程序的编写过程中会经常发生,包括编译期间和运行期间的错误。在编译期间出现的错误编译器会帮助我们修正,可是在运行期间的错误编译器就无能为力了,并且运行期间的错误往往是...原创 2018-06-30 11:00:46 · 462 阅读 · 0 评论 -
设计模式 - 代理模式
概述 代理模式(Proxy Pattern)也称为委托模式。代理模式在生活中经常见,比如访问国外网站时,连上代理服务器,就可以轻松畅游全世界的网络。既然代理模式这么普遍,我们有必要了解下代理模式如何做到的?定义 为其他对象提供一种代理以控制对这个对象的访问。使用场景 当无法或不想访问某个对象或访问某个对象困难的时,可以通过一个代理对象来间接访...原创 2018-09-25 22:13:23 · 122 阅读 · 0 评论 -
JVM概念之Java对象的大小与引用类型
本文来自和你在一起的博客,原文标题:《JVM调优总结(二)-一些概念》。本文总结了JVM概念中的Java对象的大小,以及三种引用类型的定义与区分。基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句: 1.Object ...原创 2018-11-01 11:52:59 · 959 阅读 · 1 评论 -
有关JVM处理Java数组方法的思考
在Java中,获取数组的长度和String的长度是两种不同的方法,这引起了本文作者的一番思考。本文从JVM的角度,探讨了Java数组在JVM中是什么对象,有哪些成员,以及声明方法。本文来自jarfield的博客,原文标题为《为什么如此获取Java数组的长度》。记得vamcily 曾问我:“为什么获取数组的长度用.length(成员变量的形式),而获取String的长度用.length()(...原创 2018-11-01 15:00:52 · 376 阅读 · 0 评论 -
Java 继承
继承的概念继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。生活中的继承:兔子和羊属于食草动物类,狮子和豹属于食肉动物类。食草动物和食肉动物又是属于动物类。所以继承需要符合的关系是:is-a,父类更通用,子类更具体。虽...原创 2018-11-03 16:30:44 · 132 阅读 · 0 评论 -
Java 快排,冒泡排序,选择排序
快排 /** * * @param num 排序的数组 * @param left 数组的前针 * @param right 数组后针 */ public static void quickSort(int [] num ,int left,int right){ //如果left等于right ,即数组只有一个元素,...原创 2019-03-11 15:54:31 · 270 阅读 · 0 评论 -
Java的Integer与int互转
int转Integerint i = 0; Integer wrapperi = new Integer(i); Integer转intInteger wrapperi = new Integer(0); int i = wrapperi.intValue(); JDK1.5以后的int转IntegerJDK1.5以后,Java为我们提供了更为丰富的转换方法。...原创 2019-03-08 12:00:18 · 10631 阅读 · 0 评论 -
JAVA构造时成员初始化的陷阱
让我们先来看两个类:Base和Derived类。注意其中的whenAmISet成员变量,和方法preProcess() 1 2 3 4 5 6 7 8 public class Base { Base() { preProcess(); } ...原创 2019-05-16 12:08:44 · 343 阅读 · 0 评论 -
为什么一个java源文件中只能有一个public类
问题:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 答案:可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同。为什么一个java源文件中只能有一个public类? 在java编程思想(第四版)一书中有这样3段话(6.4 类的访问...原创 2019-09-06 11:13:02 · 527 阅读 · 0 评论 -
静态编译和动态编译,java与javascript区别总结
1.静态编译和动态编译 静态编译是程序在编译时就已经确定好了所有类之间的关系,要运行程序所有类都缺一不可,若在开始运行时就把其中的某类文件丢失,就会产生NoClassDefFoundError错误,程序会终止,在程序运行前的装载期间就把要用到的类加入到内存当中,它的特征是new关键字 再加上类构造器,这个类构造器的命名在程序编译后就不可更改了...原创 2019-09-20 14:31:05 · 1790 阅读 · 0 评论 -
ExceptionInInitializerError异常
因为这个异常时在静态变量初始化发生异常时抛出的,所以首先我们了解一下静态变量初始化的问题。静态变量初始化提到静态变量初始化,又不得不提JVM的类加载机制,把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类加载的生命周期包括:加载,验证,准备,解析,初始化,使用和卸载这7个阶段。静态变量的...转载 2019-10-09 20:12:50 · 2126 阅读 · 0 评论 -
Java实体类(entity)作用
对java实体类的众多理解:A .就是属性类,通常定义在model层里面 B. 一般的实体类对应一个数据表,其中的属性对应数据表中的字段。好处:1.对对象实体的封装,体现OO思想。2.属性可以对字段定义和状态进行判断和过滤3.把相关信息用一个实体类封装后,我们在程序中可以把实体类作为参数传递,更加方便。C. 说白了就是为了让程序员在对数据库操作的时候不用写SQL语句 D. 就是一个数据库表生成一个...原创 2018-05-17 17:17:10 · 77398 阅读 · 3 评论