- 博客(20)
- 收藏
- 关注
原创 【Java集合】ArrayList源码分析
ArrayList是日常开发中经常使用到的集合,其底层采用数组实现,因此元素按序存放。其优点是可以使用下标来访问元素,时间复杂度是O(1)。其缺点是删除和增加操作需要使用System.arraycopy()来移动部分受影响的元素,时间复杂度为O(N)。同时ArrayList由于是采用数组来存放数据,因此会有容量限制,在使用时需要扩容,当插入操作超出数组长度,就会进行扩容,扩容后数组的长度为原来的1.5倍,默认的数组长度是10。为了更好的掌握ArrayList,因此阅读并仿照ArrayList源代码,实现一
2021-07-12 10:38:20
166
原创 【Java类加载】自定义类加载器
要自定义自己的类加载器来加载类,需要先对类加载器和类加载机制有一些基本的了解。1、类加载器类加载器ClassLoader的作用有两个:①是用于将class文件加载到JVM。②是用于判断JVM运行时两个类是否相等。2、类加载的时机类的加载可分为隐式加载和显示加载。隐式加载隐式加载包括以下几种情况:遇到new(new 一个实例对象的时候)、getstatic(获取一个类的静态字段的时候)、putstatic(设置一个类的静态字段的时候)、invokestatic(调用一个类的静态方法的时候)
2021-03-23 02:05:16
605
1
原创 【Java并发第四篇】线程安全
1、线程安全多个线程对同一个共享变量进行读写操作时就可能产生不可预见的结果,这就是线程安全问题。这里说的共享变量,是指多个线程都能访问的变量,一般包括成员变量和静态变量。线程安全问题示例:import lombok.extern.slf4j.Slf4j;/** * @Author FengJian * @Date 2021/1/27 10:59 * @Version 1.0 */@Slf4j(topic = "c.ThreadSafeTest")public class ThreadS
2021-02-25 18:51:30
338
3
原创 【Java并发第三篇】线程间通信
线程间的通信JVM在运行时会将自己管理的内存区域,划分为不同的数据区,称为运行时数据区。每个线程都有自己私有的内存空间,如下图示:Java线程按照自己虚拟机栈中的方法代码一步一步的执行下去,在这一过程中不可避免的会使用到线程共享的内存区域堆或方法区。为了防止多个线程在同一时刻访问同一个内存地址,需要互相告知自己的状态以避免资源争夺。线程的通信方式主要分为三种方式:①共享内存②消息传递③管道流共享内存:线程之间通过对共享内存的读-写来实现隐式通信。Java中的具体实现是:volatile共享内存。
2021-01-21 00:34:42
294
原创 【Java并发第二篇】Java线程的创建与运行,线程状态与常用方法
1、线程的创建与运行(1)、继承或直接使用Thread类继承Thread类创建线程:/** * 主类 */public class ThreadTest { public static void main(String[] args) { //创建线程对象 My_Thread my_thread = new My_Thread(); //启动线程 my_thread.start(); }}/** * 继承Th
2020-12-25 19:32:03
314
原创 【Java并发第一篇】Java的进程与线程
1、进程与线程1.1、进程进程可以看作是程序的执行过程。一个程序的运行需要CPU时间、内存空间、文件以及I/O等资源。操作系统就是以进程为单位来分配这些资源的,所以说进程是分配资源的基本单位。(1)、进程是动态的,程序是静态的程序是静态的,它本身作为一种软件资源可以长期保存在磁盘中。比如QQ,QQ作为一个程序,其本身保存在计算机的磁盘上。此时,它并没有得到CPU、内存、I/O等资源。因此当前的QQ程序只是一个静态的程序并不能给我们实现视频、语音等功能。但当QQ程序开始执行时,操作系统就会将QQ程序
2020-12-07 19:09:34
183
原创 【JVM第八篇--垃圾回收】GC和GC算法
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记。其观看地址如下:尚硅谷2020最新版宋红康JVM教程1、垃圾1.1、什么是垃圾垃圾(Garbage)在Java语言中是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占用的内存空间就会一直保留到应用程序结束,被保留的空间也无法被其他对象所使用,极可能导致内存溢出。1.2、垃圾回收垃圾回收(Garbage Collection)即常说的GC。GC的作用就是清理内.
2020-11-17 16:31:57
183
原创 【JVM第七篇】执行引擎
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记。其观看地址如下:尚硅谷2020最新版宋红康JVM教程 执行引擎是Java虚拟机中的核心组成部分。执行引擎的作用就是解析虚拟机字节码指令,即执行一条条的代码流程,并得到执行结果。我们可以先来看一下执行引擎在Java虚拟机中的位置,...
2020-10-29 22:39:54
186
原创 【JVM第六篇--对象】对象的实例化、内存布局和访问定位
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记。其观看地址如下:尚硅谷2020最新版宋红康JVM教程一、对象的实例化在平常写代码的过程中,我们用class关键字定义的类只是一个类的模板,并没有产生类的对象,也没有分配内存。想要分配内存产生类对象,就要使用到一些创建对象的方式,比如常见的new关键字,虚拟机遇到new关键字,就会在内存中分配此类的内存空间,有了内存空间就可以往里面放定义好的数据并可以进行方法的调用,这就是对象的实例化。1、创建对象的方式(1)、new 的方式①new.
2020-10-19 23:44:28
330
原创 【JVM第五篇--运行时数据区】方法区
一、栈、堆、方法区的关系虚拟机运行时的数据区如下所示:即方法区是属于线程共享的内存区域。我们可以通过如下代码来简单分析方法区和栈、堆之间的关系。有代码:Person person = new Person();其对应关系图如下:即源程序代码运行后,字节码文件中的Person类的元数据被虚拟机加载后放在了方法区。类加载的最终产物,一个对象实例new Person(),则是被放在了堆中。而person则是new Person()这个对象实例的引用,其位于虚拟机栈中的局部变量表(或称为本地变量
2020-10-13 21:49:28
218
原创 【JVM第四篇--运行时数据区】堆
一、堆的概述JVM的运行时数据区如下:一个Java程序运行起来对应着一个进程(操作系统的进程),一个进程对应着一个JVM实例。而一个JVM实例就对应着一个运行时数据区,则其中就包含着一个堆空间。一个进程中的多个线程共享这个堆空间。几乎所有的对象实例和数组都在堆上分配内存(并非所有的对象都是在堆上分配内存,后面会提到这一特殊情况),即堆空间存储着绝大部分的对象。虚拟机栈中的栈帧保存着数组或者对象的引用,这个引用就指向对象或者数组在堆中的位置。有代码如下:package com.fengjian.w
2020-09-28 16:17:30
389
原创 【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈
一、运行时数据区我们在编写Java程序时,使用JVM的流程主要如下所示:虚拟机在执行Java程序时,会把它所管理的内存划分为不同的数据区域,即运行时数据区。有些数据区域是线程共享的,即这些区域会随着虚拟机的启动而创建,随着虚拟机的关闭而销毁。而另一些区域则是与线程对应,属于线程私有的。这些区域会随着线程开始而创建,随着线程的结束而销毁。具体的划分如下:多个线程共享的:堆、方法区每个线程私有的:程序计数器、Java虚拟机栈、本地方法栈图示如下:关于Java线程:在虚拟机中,每个线程都与操作系
2020-09-16 23:02:51
246
原创 【JVM第二篇--类加载机制】类加载器与双亲委派模型
一、什么是类加载器在类加载过程中,加载阶段有一个动作是“通过一个类的全限定名称获取定义此类的二进制字节流”,虚拟机将这个动作交给应用程序,让其自行去决定怎么获取所需的类。而实现这个动作的代码就被称为类加载器。关于类加载过程,可以看我的上一篇博客《类加载过程》。1、类与加载器类加载器除了用于实现类的加载外,还用于确定一个类在虚拟机中的唯一性,也就是说类加载器还用于判断两个类是否相等。想要判断两个类对象是同一个类,需要两个必要条件:① 类的完整类名包括包名都必须一致② 加载这个类的类加载器必须是同
2020-09-12 16:00:23
215
原创 【JVM第一篇--类加载机制】类加载过程
一、什么是类加载过程我们编写的类(.java文件)会被编译器(如javac编译器)编译成Class文件。Java虚拟机把Class文件加载到内存中的过程就称为类加载过程。一个类从被加载到虚拟机内存中,到卸载出内存,共经历七个过程,即这个类的生命周期会经历加载、验证、准备、解析、初始化、使用、卸载七个阶段。其中,验证、准备、解析三个阶段又统称为连接。图示如下:下面我们将逐个介绍类生命周期每个阶段的执行过程。二、类加载时机在生命周期图中,加载、验证、准备、初始化、卸载。这五个阶段的顺序是确定的
2020-08-28 14:16:35
372
原创 [SpringBoot]@RequestParam接收不到POST请求的数据
可能原因:在前端发送请求时,设置了header:{ 'Content-Type':'application/json'}这会导致@RequestParam接收不到POST请求的数据。正确的做法是,设置header:{ 'Content-Type':'application/x-www-form-urlencoded'}如果想继续使用 ‘Content-Type’:‘application/json’,只能使用**@RequestBody**来接收...
2020-05-10 15:21:47
7679
原创 【JavaWeb】基于前后端分离的JavaWeb小项目---新生报道案例的详细实现过程(下)
前言致想要与本文一起实现案例的小伙伴:本文包含实现的全部过程,有想要一起实现案例的小伙伴可以跟着一步一步实现。由于本案例的重点是JavaWeb,且实现了前后端分离,所以在文章中不会有前端代码的实现过程。不过前端的部分我已经写好啦,并且已经打包编译了,所以小伙伴们可以直接下载打包好的前端文件到自己的电脑上去(大概2M左右),然后用浏览器打开就可以直接运行啦~~~~前端文件下载地址:htt...
2020-04-03 20:11:50
4357
原创 【JavaWeb】新生报道案例前端详细使用(模拟前后端通过接口文档对接)
这是一个详细的JavaWeb小案例的详细实现过程,本文是前端文件的使用与模拟的接口文档,博客的上篇在这里:假设现在正在进行前后端分离的开发,此时前端已经写好,需要我们根据前端编写的接口文档用Java 进行后端开发。一、前端编写的接口文档:注意区分请求参数和响应结果。一共三个接口,通过JSON数据格式进行交互。如下:1、接口一方法描述:新生登录URL地址:http://local...
2020-04-03 14:14:05
2770
原创 【JavaWeb】基于前后端分离的JavaWeb小项目---新生报道案例的详细实现过程(上)
前言本次案例的前端代码我已经打包好,可以下载到本地打开即可直接使用。下载地址:前端代码的使用:一、案例分析和设计本节主要有案例分析和案例设计。1、案例介绍这是一个前后端分离的小项目,主要用来检验自己这段时间学习JavaWeb的成果。该案例包含的JavaWeb知识点如下:基于MVC的三层架构的实现(项目搭建)数据库连接(通过JDBC)JavaWeb...
2020-04-03 14:11:59
3981
2
原创 安装mysql成功后,启动时报错:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
一、遇到错误本小白跟着网上的mysql安装教程安装mysql。安装过程一直都没问题,结果在启动的时候报错了。错误如下:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)二、分析原因即及解决过程根据大佬们的博客知道了原因分别有:原因1、mysql服务没有启动该问题的解决过程是最简单的:只...
2020-02-04 12:24:27
426
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人