JAVA基础
文章平均质量分 89
JAVA基础知识
原来是肖某人
杭州电子科技大学计算机硕士
展开
-
十分钟学懂Java并发
事实上,虽然看似是两种方式实现线程,实际上却是一种。因为Thread类的run函数的默认源码实现就是调用了一个包含在Thread对象内部的Runable实现对象。= null) {我们可以为我们的自定义Runable实现类提供一个取消标记成员,然后在run方法的执行过程中不断去检查这个标记来判断是否需要提前终止任务。// 执行任务的代码// 检查是否取消任务。原创 2024-04-14 16:03:22 · 1115 阅读 · 0 评论 -
JVM参数、JDK常用监控指令和监控工具使用教程,非常实用!
本文主要讲述JVM参数的介绍以及虚拟机内存的监控与管理,方便读者针对自己的项目进行分析,进一步实现项目的优化原创 2022-06-08 15:18:08 · 1385 阅读 · 0 评论 -
Java虚拟机的垃圾回收器以及内存分配策略详解
概述垃圾回收器(GC)是什么以及为什么我们需要垃圾回收器??垃圾回收是Java语言区别于其他语言的一种最为重要的特性之一, 通过垃圾回收器(Garbage Collection)来实现对我们Java虚拟机中内存的自动回收,即将一些我们不再需要的对象所在的内存进行回收。正是这种特性,使得我们的Java程序员在进行开发工作时不再像C/C++程序员一样需要关心对象的释放和内存的回收。这为我们的开发带来了极大的便利。虽然在这种便利下,势必需要付出一些额外的性能消耗。但是这种消耗在多数情况下所带来的收益也是远超原创 2022-05-25 17:14:14 · 489 阅读 · 0 评论 -
关于引用计数法的循环引用问题
关于引用计数法,我们可以先看一段wiki上的描述:As a collection algorithm, reference counting tracks, for each object, a count of the number of references to it held by other objects. If an object’s reference count reaches zero, the object has become inaccessible, and can be d原创 2022-05-24 18:36:04 · 233 阅读 · 0 评论 -
JVM虚拟机之栈帧与以及方法调用
简介执行引擎是Java虚拟机最核心的组成部分之一。虚拟机与物理机都具有执行代码的能力。区别在去物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是自己实现的,可以自行定制指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。本章主要从虚拟机执行引擎的概念模型上来学习和讲解虚拟机的方法调用和字节码执行栈帧栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态原创 2020-12-28 13:44:00 · 410 阅读 · 0 评论 -
JVM虚拟机之类加载机制
概述我们的java类都会在编译器编译之后变成一个class文件,我们需要通过虚拟机加载这个class文件才能够使用我们编写的类。本章主要讲述的内容分为以下几点:虚拟机什么时候会加载这些Class文件虚拟机如何加载这些Class文件Class文件中的内容进入到虚拟机后会发生什么变化虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化。最终形成可以被虚拟机直接使用的Java类型。这就是虚拟机的类加载机制。本文参考 《深入理解Java虚拟机》 一书中关于类加载机制的内原创 2020-12-25 14:49:15 · 189 阅读 · 1 评论 -
Java虚拟机JVM之类文件结构解析(常量池)
简介在java的学习过程中,关于Class的文件结构一直困扰着我。比如像常量池,它是类文件中最为重要的一部分之一,但是网络上关于常量池的说话五花八门,因此我决定参考《深入理解Java虚拟机》一书去对Class文件以及常量池等重要知识进行学习和梳理。Class类文件的结构Class文件是一组以8位字节为基础单位的二进制流,文件中各个部分严格按照规则顺序紧凑地排列在Class文件之中,中间不存在任何间隔符号。如果遇上8位以上的数据时,会分割成若干8位字节进行存储。下面是一个简单个class文件的十六进原创 2020-12-17 17:09:38 · 341 阅读 · 0 评论 -
Java学习之注解元数据
简介注解也被称为元数据,它为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。注解一定程度上是把元数据和源代码文件结合在一起,而不是保存在外部文档中这一大的趋势之下所催生的。在Java中,有一些内置的注解,比如:@Override:表示当前的方法顶柜将覆盖超类中的方法,如果拼写错误或者覆盖不符合标准,编译器就会发出错误提示。@Deprecated:表示被修饰的元素已经被弃用,不建议程序员使用。@SuppressWarnings:关闭不当的编译器警告原创 2020-11-18 10:44:10 · 533 阅读 · 0 评论 -
Java学习之枚举类型
简介关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。这是一种非常有用的功能。基本enum特性通过values()方法可以遍历enum实例,而且该数组中的元素严格保持在enum中声明时的顺序。创建enum时,编译器会生成一个相关的类,这个类继承自java.lang.Enum,下面例子中演示了Enum提供的一些功能:public class EnumDemo1 { public static void main(String[]原创 2020-11-17 15:14:47 · 180 阅读 · 0 评论 -
Java学习之容器深入研究
简介我们以往经常使用数组来存储对象,数组虽然具有很高的效率,但是同样的,数组也具有一个致命的缺陷,那就是无法动态扩容。一个数组在其生命周期中,它的大小是不会发生变化的。同时,为了实现多种堆栈队列等高效的数据结构,我们需要借助于容器。集合容器的用途是保存对象,但是被分为两个不同的概念:Collection:一个独立元素的序列,这些元素都服从一条或多条规则List:按插入顺序保存元素Set:不能用重复元素Queue:先进先出的排队规则Map:一组成对的键值对注意,这里并没有提到像Vec原创 2020-11-15 15:56:03 · 264 阅读 · 0 评论 -
Java学习之数组
简介Java中有大量其他方式可以持有对象,但是在很多时候我们还是会去使用数组。数组和其他种类的容器之间的区别有三个方面:效率类型保存对象在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但是代价是数组对象的大小被固定,并在其生命周期内是不可改变的。数组的使用无论哪种类型的数组,数组标识符其实只是一个引用,指向在堆中创建的一个真实对象,这个对象保存指向其他对象的引用。可以作为数组初始化语法的一部分隐式地创建此对象,或用n原创 2020-11-12 16:07:54 · 67 阅读 · 0 评论 -
Java学习之反射(RTTI)
简介运行时类型信息使得我们可以在程序运行时发现和使用类型它使得我们从只能在编译期执行面向类型的操作和禁锢中解脱出来有人会对标题上的RTTI感觉到陌生,RTTI的全名时Run-Time Type Identification,表示运行时类型识别。但是学过C++或者看过Thinking in Java的同学们都应该对此有些熟悉,我在看Thinking in Java这本书时,其实抱有很大的疑惑,因为我没有办法很清晰地清淅的区分出RTTI和反射的概念,在区分两者上,总是会存在一些疑惑。但是后来查阅各方资原创 2020-11-11 23:29:48 · 321 阅读 · 0 评论 -
Java学习之字符串和正则表达式
简介可以证明,字符串操作是计算机程序设计中最常见的行为不可变StringString对象是不可变的,通过JDK文档可以发现,每一个看似会修改String值的操作,实际上都是创建了一个新的String对象,以包含修改后的字符串内容,而最初的String对象则丝毫未动。重载"+" 与StringBuilderString对象是不可变的额,你可以给String对象加任意多的别名。因为String具有只读特性,所以指向它的任何引用都不可能改变它的值,因此,也就不会对其他的引用有什么影响。不可变性会原创 2020-11-11 10:25:05 · 1686 阅读 · 1 评论 -
Java学习——通过异常处理错误
简介Java的基本理念是“结构不佳的代码不能运行”发现错误的理想时机是在编译阶段,也就是在我们试图运行程序前。但是编译期并不能找出所有的错误,有些问题需要在运行期得到解决。这就需要错误源能够通过某种方式把适当的信息传递给某个知道如何处理这个问题的接收者。基本异常异常情形是指阻止当前方法或作用域继续执行的问题,当我们在运行程序中,遇到了一个意料之外的错误时,我们就需要抛出异常,而不是顺着原来的路执行下去。当抛出异常后,有几件事会随之发生。首先,与Java中其他对象的创建一样,将使用new在原创 2020-11-09 20:58:51 · 455 阅读 · 0 评论 -
Java学习之接口
简介接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方式抽象类和抽象方法在学习到抽象类之前,我们实现多态的方式就是通过实现一个基类,然后在不同的导出类中重写基类的方法以及进行一些个性的拓展来实现多态。在这种关系中,基类的目的是为它的所有导出类创建一个通用接口。但是,纯粹作为接口而言,普通的类显得有些多余。因为它会要求基类同样实现接口方法。但实际上对于这些方法的实现有时候并不是必须的。因此我们引入了抽象类和抽象方法的概念这种方法是不完整的,仅有声明而没有方法体。下面是抽象方法声明采用的语原创 2020-11-07 13:34:13 · 171 阅读 · 0 评论 -
JAVA学习之多态
简介向上转型转机构造器和多态协变返回类型原创 2020-11-06 17:06:09 · 169 阅读 · 0 评论 -
Java学习之复用类
简介复用代码是Java众多引人注目的功能之一,通过复用代码,我们可以极大地降低我们的工作量,以及提升我们代码的简洁程度。这种方法的窍门在于使用类而非破坏现有程序。复用代码的方式有两者:第一种叫做组合,该方法比较直观,只是单纯调用了现有的程序代码。第二种则细致一些,也是我们经常使用到的,叫做继承。该方法按照现有类的类型创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。组合语法组合只需要将对象引用置于新类中即可。也就是说,如果我们创建的类中需要使用到某个其他的类型,我们可以在我们的新原创 2020-11-02 17:15:41 · 167 阅读 · 0 评论 -
Java学习之什么是泛型的擦除
序上一章讲了泛型的基本使用方式,但是在上一章中提到了擦除这一概念。我们都知道Java一开始并没有泛型这一语言特性,泛型这一特性是在JavaSE5出现的,也就是说,在该版本以前,所有的库都是以原有的语言特性进行设计,如果我们在java代码中使用了新的语言特性,那么编译出来的代码是不被低版本的jre进行兼容的。换句话说,如果泛型以新语言特性的形式出现,那么所有需要使用到泛型的类库都需要在新版本的编译器上进行重新编译,而原来的老的类型会因为低版本jre不兼容这些新的语言特性而无法使用这些类库,那么我们这时候必原创 2020-10-26 17:07:50 · 671 阅读 · 0 评论 -
Java学习——泛型的介绍和基本使用
介绍一般的类和方法,只能使用具体的类型,要么是基本类型,要么是自定义类型。如果要编写可以应用于多种类型的代码,就需要借助于多态和泛型实现。多态勉强算是一种泛化机制,比如你可以将方法的参数类型设置为基类或者接口,那么该方法就可以接受从这个类中导出的任何类作为参数。这种方式使我们相当常见也是相当方便的。但是这种方式必须要求你的代码必须实现特定的接口,这样对程序的约束性太大了。那么我们如何实现一个更通用的代码使得代码能够应用于某种不具体的类型。因此再JavaSE5中引入了泛型的概念。事实上,于C++相原创 2020-10-23 13:31:16 · 220 阅读 · 0 评论 -
JAVA学习——内部类
1.简介内部类就是定义在类内部的类,可以是直接在类内部,也可以在作为方法内2.内部类的特性内部类可以直接使用外部类的方法和属性内部类可以直接通过外部类名.this获取外部类对象引用class A{ private String aName; public void sayHello(){ System.out.println("Hello from A"); } class B{ private String bN原创 2020-08-29 15:19:55 · 186 阅读 · 0 评论 -
JAVA学习之I/O系统
1.File类File代表一个文件或是一个文件夹,更准确的说是一个文件路径1.1 创建一个File对象File file = new File("d://data.txt");//根据文件路径创建FileFile dir = new File(".");//根据文件夹路径创建File1.2 操作FileSystem.out.println(file.isFile());//判断file是不是文件System.out.println(dir.isDirectory());//判断dir是不原创 2020-08-29 16:18:19 · 271 阅读 · 0 评论 -
集合
由于数组具有固定尺寸,所以当我们程序无法在一开始就知晓我们需要放置的对象数量时,数组便无法满足我们的要求因此,java提供一组容器类来解决这个问题。最基本的类型为以下四种:List Set Queue Map通常来说,像ArrayList这样的泛型容器一般在声明时便需要确定容器中的类型。但是当我们没有指定类型时,我们也可以将不同类型的类往里添加,因为一般的类默认都是继承Object,所以没有特别声明类型的集合容器会默认为Object类型的容器。当然,如果我们直接放入不同类型对象,编译器原创 2020-05-22 17:01:11 · 117 阅读 · 0 评论 -
JAVA多线程
目录1.线程状态2.线程开辟2.1继承Thread类2.2实现Runable接口2.2.1 匿名实现2.2.2 lambda实现2.2.3 直接实现接口3.线程常规操作3.1 线程命名3.2 优先级设置4.线程转换5.引起线程状态转换的方法5.1 Thread.sleep()6.2yield()6.3 wait()6.4 notify()6.5 notifyAll()6.6 interrupt()6.7 suspend()和res.原创 2020-05-13 16:26:32 · 429 阅读 · 0 评论 -
关于JVM内存
JVM内存分为五个部分:其中我们主要需要了解前三个部分。这三个部分也是我们最常用到的。1.栈(stack)用来存放方法中的局部变量、方法的参数以及具体的执行命令(例如赋值、调用) 方法(程序执行单位)必须在栈中运行 栈是先进后出,每次调用方法需要将对应方法从方法区中取出压入栈进行逐行执行2.堆(heap)所有new出来的对象都被存放在堆内存中 地址为十六进制,栈中引用类...原创 2020-05-07 14:24:58 · 124 阅读 · 0 评论 -
Serializable接口
之前经常看到别人代码中会出现seralizable接口,但是一直不明白序列号的意义在哪,因为我不序列化java也能正常运行,现在研究一下概述:在程序中我们为了能让java对象在存储时按照一定形式进行存储,再到使用时重新获得对象。这需要用到序列化。序列化其实可以看成是一种机制,按照一定的格式将 Java 对象的某状态转成介质可接受的形式,以方便存储或传输。其实想想就大致清楚基本流程,序列化时...转载 2020-04-28 15:08:59 · 182 阅读 · 0 评论 -
java编译器优化
1.当赋值时等号右侧则为常量的运算时,在编译时编译器会直接帮我们进行运算,而不是等到运行时才发生计算,如: int i = 32 + 20; 会在编译时变成 int i = 52;2.当对short/char/byte赋值数字时,如:byte b = 30;右侧30默认为int赋值给byte类型的变量b,但是只要右侧没有超过左侧段类型超出的表示范围,编译器默认进行强转换,所以...原创 2020-04-13 14:26:40 · 145 阅读 · 0 评论 -
java环境
1.JVMJVM--java虚拟机,用于实现java程序的跨平台可移植性,不同操作系统之间只要安装了JVM,一个经过编译的java程序就可以不经过二次编译直接运行在不同操作程序上2.JRE和HDKJRE(java runtime environment):java运行时环境,包含JVM和运行时需要的核心类库 JDK(java development kit):java开发工具包,包含...原创 2020-04-12 15:43:00 · 348 阅读 · 0 评论 -
JVM学习——类加载器
1.什么是类加载器一个类如果要运行,需要被加载到虚拟机内存中才能够运行。那么由谁来将其加载到虚拟机内存(也就是我们虚拟机的方法区中)中呢?就是我们所说的类加载器2.类的加载过程编译该阶段通过java编译器将我们编写的.java文件编译成计算机可以识别的二进制形式的.class文件(机器码字节文件)加载通过全限定类名,将字节码文件读取到内存中,存放到方法区中连接这一步我们还不算完成完整的类加载,连接是极其重要的一步连接分为三个部分1)验证确保文件字节流中包含的信息符合虚拟机要求2)准备原创 2020-08-28 20:57:41 · 132 阅读 · 0 评论 -
深入理解Java虚拟机——栈
栈是一种FILO类型的数据结构。在虚拟机内存中有两个栈,一个是虚拟机栈,一个是本地方法栈。其中虚拟机栈是用来执行Java执行代码的。而本地方法栈则是为虚拟机使用到的Native方法服务。关于本地方法栈,此处不做展开。主要描述虚拟机栈。我们平时提到的栈也就是指虚拟机栈。1.特点栈描述的是java代码执行的一种内存模型。 栈中包含的元素为栈帧(一个栈帧对应一个方法) 栈是线程独立的2.栈帧栈帧(Stack Frame)是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack原创 2020-07-27 09:43:48 · 161 阅读 · 0 评论 -
XML学习——XML读取
1.引入xml解析工具dom4j<!-- https://mvnrepository.com/artifact/dom4j/dom4j --><dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version></dependency>2.创建读取器原创 2020-07-23 10:10:51 · 137 阅读 · 0 评论 -
XML学习——dtd
1.什么是dtd?(document type define)DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。2.dtd实例<!DOCTYPE NEWSPAPER [<!ELEMENT school (student+)><!ELEMENT student (name,age,gender)><!ELEMENT name (#PCDATA)><!.原创 2020-07-23 09:44:51 · 171 阅读 · 0 评论 -
http请求解析
请求消息请求消息 由 请求行,请求头部,空行和请求数据4部分组成请求头部请求头部信息提供了如下信息:Host: 主机名User-Agent: 浏览器基本资料Accept: 浏览器能够识别的响应类型Accept-Language: 浏览器默认语言Accept-Encoding: 浏览器能够识别的压缩方式Referer: 来路页面, /addHero 这个路径是通过addHero.html这个页面跳转过来的。Connecton:是否保持连接请求数据提交数据所传递的原创 2020-07-09 17:07:39 · 425 阅读 · 0 评论 -
Servlet详解学习
一、什么是Servlet一款java编写的服务器端程序 功能:与浏览器进行交互数据/视图 servlet可以响应任何类型的请求,但一般只用于HTTP协议和Web服务器二、servlet的工作模式转载自https://blog.csdn.net/qq_19782019/article/details/80292110客户端向服务器发起请求 服务器启动并调用Servlet 服务器将HTTP请求封装成request请求传入Servlet servlet根据请求内容生成响应数据传回服务器原创 2020-07-13 18:02:01 · 2580 阅读 · 0 评论 -
JSP9大内置对象
request response out session exception application pageContext config page1 request代表javax.servlet.HttpServletRequest类。 包含有关浏览器请求的信息 提供许多方法用于获取cookie、header、session以及请求参数1.1 方法介绍getMethod():返回HTTP请求信息中所使用到的方法名称;getServletPath():返回请求信息中调用S转载 2020-05-20 01:06:50 · 215 阅读 · 0 评论 -
Session/Request/Cookie的生命周期
Session/Request当我们在网页之间互相传递数据时我们一般需要将数据存储到request或是session域中,而另一个页面或者后台则需要在对应的域中根据字段名取出值。那么两者有什么不同?Tomcat中session的默认生命周期为30min,也就是用户在页面时两次操作时间的间隔,如果超过30min,session自动销毁。如果用户在30min内刷新页面或者进行其他请求操...原创 2020-04-29 15:13:23 · 661 阅读 · 0 评论 -
类加载器ClassLoader
但程序需要使用某个类且该类还没被加载到内存中,JVM会通过加载、链接、初始化三个步骤对该类进行初始化然后使用。所以这三个步骤也被称为类初始化。一.类加载过程1.加载加载指的是将java程序的class字节码文件读取到内存中,并为其创建一个java.lang.Class对象。类的加载由类加载器完成。开发者课通过继承ClassLoader来创建自己的类加载器。通过不同的类加载器可以...原创 2020-04-25 15:51:27 · 204 阅读 · 0 评论