自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 收藏
  • 关注

原创 maven下载、本地仓库设置与idea内置maven设置

镜像:指的是mirrors,它是一个拦截器,它会拦截MAVEN对远程仓库的相关请求,把请求里的远程仓库的地址,重新定向到镜像里配置的地址。远程仓库的网络加速器,一般是出于网速考虑。如果不配置镜像时,默认使用的MAVEN的中央库。maven下载官网:https://maven.apache.org/download.cgi。修改完成后点击Apply -> ok即完成IDEA里配置maven的本地仓库。新建MAVEN_HOME 变量值为自己的maven包所在的位置。这样就完成了maven本地仓库的配置。

2023-09-27 16:52:42 888

原创 通俗讲解Java回调函数

多态的思想油然而生~~~鉴于JAVA接口的好处,我们就定义一个名为CallBack的接口作为回调接口,再在该接口下定义一个名为backResult的抽象方法作为回调方法,让那些总经理类啦~经理类啦~主管类啦~什么的都去实现该接口,这时候我们就来改造下我们的项目:?Manager类是个模拟总经理的类,当该类的对象被造出来后就会通过Personnel的对象去执行Personnel中的doSomething方法告诉员工做些什么。这是一个现实生活中常能碰到的例子,用代码的方式实现这个过程就可以解释为。

2023-09-20 11:31:19 219

原创 文件路径中的/,\的区别和文件路径的常见用法

是Unix和类Unix系统上的路径分隔符.现代Windows通常可以同时使用。几十年来一直主张使用路径分隔符."./":代表目前所在的目录。"../":代表上一层目录。以"/"开头:代表根目录。交换文件路径,但微软。

2023-09-15 11:38:23 4250

原创 HTML、css、javascript的区别

3.JavaScript是用来实现网页上的特效效果。如:鼠标滑过弹出下拉菜单。可以这么理解,有动画的,有交互的一般都是用JavaScript来实现的。可以这么理解,有动画的,有交互的一般都是用。1.html是用来描述网页的一种语言,它不是一种编程语言,而是一种标记语言(标记标签),总的来说,html使用标记标签来描述网页。比如,标题字体、颜色变化,或为标题加入背景图片、边框等。内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字、图片、视频等。,但是一直未理解这三者的区别,现在回过头做一下区别。

2023-09-14 15:39:19 827

原创 IDEA配置

IDEA开发工具常用配置集合

2023-09-12 16:47:29 111

原创 MySQL 8.0安装及配置教程

MySQL 8.0安装及配置教程

2023-09-07 17:10:56 2898

原创 CP和AP有是什么?有什么区别?

最近有时间研究分布式架构,想探究一下Spring Cloud Eureka与Zookeeper之间的区别,于是看到简书里的文章:Spring Cloud Eureka简介及与Zookeeper对比,明显的区别可能就是Zookeeper为CP设计,而Eureka为AP设计,但是对CAP/AP/CP很不理解,于是查阅资料,做一个简单的了解。 我们是分布式系统,很有可能出现网络分区。但是出现网络分区的时候,我们仍希望系统能够对外提供响应,因此P是一定

2022-07-08 15:56:38 2204 1

原创 sso单点登录的实现。

单体架构的登录:通过cookie和session的会话机制。缺点:服务器要存储登录信息。​ 在将具体实现之前,我们先来聊一聊 Cookie 的作用域。 Cookie 的作用域由 domain 属性和 path 属性共同决定。domain 属性的有效值为当前域或其父域的域名/IP地址,在 Tomcat 中,domain 属性默认为当前域的域名/IP地址。path 属性的有效值是以“/”开头的路径,在 Tomcat 中,path 属性默认为当前 Web 应用的上下文路径。 如果将

2022-07-01 20:10:49 345

原创 JVM垃圾回收什么情况会进入老年代

新生代Minor GC后剩余存活对象太多,无法放入Survivor区中,此时就必须将这些存活对象直接转移到老年代去,如果此时老年代空间也不够怎么办?1、执行任何一次Minor GC之前,JVM会先检查一下老年代可用内存空间,是否大于新生代所有对象的总大小,因为在极端情况下,可能新生代Minor GC之后,新生代所有对象都需要存活,那就会造成新生代所有对象全部要进入老年代;2、如果老年代的可用内存大于新生代所有对象总大小,此时就可以放心大胆的对新生代发起一次Minor GC,因为 Minor GC

2022-06-05 09:32:07 932

原创 创建对象的时候堆内存的分配

在学习Java的过程中,一般认为new出来的对象都是被分配在堆上的,其实这个结论不完全正确,因为是大部分new出来的对象被分配在堆上,而不是全部。通过对Java对象分配的过程分析,可以知道有另外两个地方也是可以存放对象的。这两个地方分别栈 (涉及逃逸分析相关知识)和TLAB(Thread Local Allocation Buffer)。我们首先对这两者进行介绍,而后对Java对象分配过程进行介绍。在JVM中,堆是线程共享的,因此堆上的对象对于各个线程都是共享和可见的,只要持有对象的引用,就可以访问堆中存储

2022-06-04 20:44:53 1960

原创 字符串常量池、class常量池和运行时常量池

在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念。1.全局字符串池(string pool也有叫做string literal pool)全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,

2022-05-25 16:44:51 115

原创 String类intern()方法和字符串常量池

String类和常量池1. String对象创建方式 String str1 = "abcd"; String str2 = new String("abcd"); System.out.println(str1==str2);//false这两种不同的创建方法是有差别的,第一种方式是在常量池中拿对象,第二种方式是直接在堆内存空间创建一个新的对象。只要使用new方法,便需要创建新的对象。创建了几个对象?1. String s1 = new String(“xyz”);考虑类加...

2022-05-25 16:07:08 198 1

原创 方法区里面有什么——class文件、class文件常量池、运行时常量池

最近一直被方法区里面存着什么东西困扰着? 1.方法区里存class文件信息和class文件常量池是个什么关系。 2.class文件常量池和运行时常量池是什么关系。 方法区存着类的信息,常量和静态变量,即类被编译后的数据。这个说法其实是没问题的,只是太笼统了。更加详细一点的说法是方法区里存放着类的版本,字段,方法,接口和常量池。常量池里存储着字面量和符号引用。 符号引用包括:1.类的全限定名,2.字段名和属性,3.方法名和属性...

2022-05-25 14:57:53 769

原创 字符串常量池、class常量池和运行时常量池

在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念。1.全局字符串池(string pool也有叫做string literal pool)全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,

2022-05-25 14:54:51 171 1

原创 Java中的属性和字段有什么区别?

Java中的属性和字段有什么区别?Java中的属性(property),通常可以理解为get和set方法。而字段(field),通常叫做“类成员”,或 "类成员变量”,有时也叫“域”,理解为“数据成员”,用来承载数据的。简单说属性实现了字段的封装,属性有get、set 方法来控制字段,属性和字段区别:Java中的属性(property),通常可以理解为get和set方法。更形象的说就是:属性是对字段的封装,供外部访问。而字段(field),通常叫做“类成员”,或 "类成员变量”,有时也叫

2022-05-25 14:53:53 1041

原创 JVM的符号引用和直接引用是什么

解析一:符号引用就是一个类中(当然不仅是类,还包括类的其他部分,比如方法,字段等),引入了其他的类,可是JVM并不知道引入的其他类在哪里,所以就用唯一符号来代替,等到类加载器去解析的时候,就把符号引用找到那个引用类的地址,这个地址也就是直接引用。解析二:1.符号引用(Symbolic References):符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Class文件中它以CONSTANT_Class_info、CONSTANT_

2022-05-24 15:54:53 851

原创 Java8内存模型—永久代(PermGen)和元空间(Metaspace)

一、JVM 内存模型  根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。  1、虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建。栈里面存着的是一种叫“栈帧”的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息。栈的大小可以固定也可以动态扩展。当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误,不过这个深度范围不是一个恒定的值,我们通过下面这段程序可以测试一下

2022-05-23 18:32:44 2117

原创 JMM——java内存模型

基本问题:介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式)拓展问题:String类和常量池 8种基本类型的包装类和常量池1 概述对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给

2022-05-23 17:24:19 95

原创 JDK8新特性-stream流

1、为什么需要Stream ?  Stream作为Java8的一大亮点,它与java.io包里的InputStream和OutputStream是完全不同的概念。它也不同于StAX对XML解析的Stream,也不是Amazon Kinesis对大数据实时处理的Stream。Java8中的Stream是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API借助.

2022-05-14 17:31:54 490

原创 JDK8新特性-方法引用

方法引用:lambda表达式是模仿python的面向函数的,但是java是面向对象的,所以一个类就定义一个方法,这样创建一个对象就相当于创建了一个函数。最开始的时候,我们用匿名内部类创建对象,在对象里面重写接口的方法。现在定义了一种特殊情况,在接口中只定义一个方法,这样这个接口就是函数式接口,可以用lambda表达式创建对象,在使用lambda表达式的时候,我们用简化的方式(()->{})重写了这个接口的方法,然后jvm自动帮我们创建对象,并将我们重写的这个方法...

2022-05-14 17:13:56 174

原创 JDK8新特性-Lmabda表达式

Lmabda表达式的语法总结: () -> ();口诀:左右遇一省括号,左侧推断类型省注:当一个接口中存在多个抽象方法时,如果使用lambda表达式,并不能智能匹配对应的抽象方法,因此引入了函数式接口的概念函数式接口函数式接口的提出是为了给Lambda表达式的使用提供更好的支持。什么是函数式接口?简单来说就是只定义了一个抽象方法的接口(Object类的public方法除外),就是函数式接口,并且还提供了注解:@FunctionalInterface常见的四大函数式接.

2022-05-14 16:37:49 143

原创 JDK8新特性:接口的静态方法和默认方法

interface 的设计初衷是面向抽象,提高扩展性。这也留有一点遗憾,Interface 修改的时候,实现它的类也必须跟着改。在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的。由于这些修饰符都是默认的,所以在JDK8之前,下面的写法都是等价的。public interface JDK8BeforeInterface { public static final int field1 = ..

2022-05-14 15:22:46 241

原创 CAS原理

概念CAS的全称是Compare-And-Swap,它是CPU并发原语。它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的再次强调,由于CAS是一种系统原语,原语属于操作系统用于范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致的问题,也就是说CAS是线程安全的。CAS底层原理首先我们先看看 atomicInteger.getAndInc

2022-05-13 16:55:49 192

原创 Java序列化——JDK序列化与Json序列化

Java原生序列化Java原生序列化我们可能会了解的比较多,Java类通过实现Serializable接口来实现该类对象的序列化,这个接口非常特殊,没有任何方法,只起标识作用。Java序列化保留了对象类的元数据(如类、成员变量、继承类信息),以及对象数据等,兼容性最好,但不支持跨语言,而且性能一般。下面我们来写一个简单的例子public class User implements Serializable { private String username; private S

2022-05-09 15:35:10 2732

原创 云服务器mysql不能远程访问-Navicat1130错误

在用Navicat配置远程连接Mysql数据库时遇到如下报错信息,这是由于Mysql配置了不支持远程连接引起的。 在安装Mysql数据库的主机上登录root用户: mysql -u root -p 依次执行如下命令: use mysql; elect host from user where user='root'; 可以看到当前主机配置信息为localhost. 执行update user set host = '%' where use..

2022-05-05 19:05:28 629

原创 四种访问修饰符

Java中修饰符分为两种:访问修饰符和非访问修饰符。修饰符中,有一些修饰符可以既可以修饰类,也可以修饰方法,但是有一些修饰符只能修饰符方法。今天这篇文章先介绍一下四种访问修饰符。1、private修饰符private表示私有的。既然是私有的,那么就只能在自己所属的类中使用了,private也是Java中四种访问修饰符中,访问权限最小的。private可以修饰变量、修饰方法,但是private不能修饰外部类,可以修饰内部类。2、default(默认的,什么也不写)修饰符当我们定义变量、

2022-05-05 17:14:22 11576

原创 编译型语言与解释型语言

一、编译型语言与解释型语言的必需知识点解释性语言和编译型语言二、Python和Java解释型语言的主流执行方式:不管是啥语言,都是要转换成计算机能识别出来的语言。三、进而可推之解释性语言和编译型语言的优缺点编译型语言:编译型语言最大的优势之一就是其执行速度。用C/C++编写的程序运行速度要比用Java编写的相同程序快30%-70%。编译型程序比解释型程序消耗的内存更少。不利的一面——编译器比解释器要难写得多。编译器在调试程序时提供不了多少帮助——有多少次在你的C语言.

2022-05-04 16:05:31 153

原创 JVM常见参数调优

JVM参数调优前言你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值使用jps和jinfo进行查看-Xms:初始堆空间-Xmx:堆最大值-Xss:栈空间-Xms 和 -Xmx最好调整一致,防止JVM频繁进行收集和回收JVM参数类型标配参数(从JDK1.0 - Java12都在,很稳定) -version -help java -showversion X参数(了解) -Xint:解释执行 -Xcomp:第一次使用就编译成本地代码 .

2022-05-02 21:04:15 450

原创 JVM垃圾与GC Roots

JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots什么是垃圾简单来说就是内存中已经不再被使用的空间就是垃圾如何判断一个对象是否可以被回收引用计数法Java中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法就是通过引用计数来判断一个对象是否可以回收。简单说,给对象中添加一个引用计数器每当有一个地方引用它,计数器值加1每当有一个引用失效,计数器值减1任何时刻计数器值为零的对象就是不可能再被使用的,那么这个对象就是可回收对象。

2022-05-02 14:56:01 62

原创 JVM体系结构

JVM体系结构概览java gc 主要回收的是 方法区 和 堆中的内容类加载器类加载器是什么 双亲委派机制 Java类加载的沙箱安全机制常见的垃圾回收算法引用计数在双端循环,互相引用的时候,容易报错,目前很少使用这种方式了复制复制算法在年轻代的时候,进行使用,复制时候有交换优点:没有产生内存碎片标记清除先标记,后清除,缺点是会产生内存碎片,用于老年代多一些标记整理标记清除整理但是需要付出代价,因为移动对象需要成本...

2022-04-30 21:19:08 731

原创 死锁编码及定位分析

死锁编码及定位分析概念死锁是指两个或多个以上的进程在执行过程中,因争夺资源而造成一种互相等待的现象,若无外力干涉那他们都将无法推进下去。如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。产生死锁的原因系统资源不足 进程运行推进的顺序不对 资源分配不当死锁产生的四个必要条件互斥 解决方法:把互斥的共享资源封装成可同时访问 占有且等待 解决方法:进程请求资源时,要求它不占有任何其它资源,也就是它必须一次性申请到所有的资

2022-04-30 21:08:58 138

原创 实现多线程的四种方式与线程池原理

实现多线程的三种方法:(1)继承Thread类,(2)实现Runnable接口,(3)实现Callable接口方法一:继承Thread类重写run方法,调用对象的start()注意:如果是tt.run()不能开启多线程,相当于调用TestThread类的run()方法,这是一种“同步编程模型”public class TestThread extends Thread{ //方法一:继承Thread类 重写run方法,调用对象的start() //run()是线程的入口点.

2022-04-30 14:51:42 953

原创 生产者消费者模式---lock与阻塞队列分别实现

阻塞队列概念队列队列就可以想成是一个数组,从一头进入,一头出去,排队买饭阻塞队列BlockingQueue 阻塞队列,排队拥堵,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下图所示:线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素 当阻塞队列是空时,从队列中获取元素的操作将会被阻塞 当蛋糕店的柜子空的时候,无法从柜子里面获取蛋糕 当阻塞队列是满时,从队列中添加元素的操作将会被阻塞 当蛋糕店的柜子满的时候,无法继续向柜子里面添加蛋糕了

2022-04-29 21:30:55 363

原创 多线程下的单列模式-----volatile双端检测机制

首先回顾一下,单线程下的单例模式代码public class SingletonDemo { private static SingletonDemo instance = null; private SingletonDemo () { System.out.println(Thread.currentThread().getName() + "\t 我是构造方法SingletonDemo"); } public static Singleton

2022-04-29 19:50:15 392

原创 线程状态模型与synchronized的wait与notify方法

1. 线程状态图这是线程的7状态模型图,常见的7大状态之间的转换关系也在上面。多线程之间的通信主要用到4个方法,wait()、wait(long time)、notify()、notifyAll(),其他方法在多线程基础中都有介绍。wait():作用是使当前线程从调用处中断并且释放锁转入等待队列,直到收到notify或者notifyAll的通知才能从等待队列转入锁池队列,没有收到停止会一直死等。wait(long time):相比wait多了一个等待的时间time,如果经过ti..

2022-04-29 19:00:55 889

原创 静态代码块、非静态代码块、构造方法之间的执行顺序

静态初始化块:使用static定义, 执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量(静态变量),即static修饰的数据成员。非静态初始化块:在每个对象生成时都会被执行一次,可以初始化类的实例变量.(只能出现在构造方法里面。)非静态初始化块会在构造函数执行时,在构造函数主体代码执行之前被运行。(super在构造方法的第一行。)从语法角度来看,程序可以在3个地方对实例变量执行初始化:1.定义实例变量时指定初始值2.非静态初始化块中对实

2022-04-26 20:10:39 382

原创 java回调函数和回调接口

废话不多说,像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号码叫你如果事情办完了你就打电话告诉他一声;这是一个现实生活中常能碰到的例子,我们用呢就用代码的方式来实现一个这个过程,看一下这个过程究竟是怎样的。首先在Eclipse中新建一个Java项目:CallBackDemoInJava;然后再新建三个类:Manager(该类用来模拟总经理)、Pers

2022-03-25 20:55:50 372

原创 java集合的并发修改异常(只有使用迭代器的时候会出现)

出现List集合并发修改异常的原因: 源码中的 expectedModCount 和 modCount 不相等导致的final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException();}expectedModCount 和 ModCount 是什么? modCount代表了集合在...

2022-03-14 16:55:14 559

原创 Java synchronized 对象锁和类锁

一.对象锁和类锁的作用范围:我们可以理解java中锁的概念。一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全局锁(该锁针对的是类,无论实例多少个对象,那么线程都共享该锁)。实例锁对应的就是synchronized关键字,而类锁(全局锁)对应的就是static synchronized(或者是锁在该类的class或者classloader对象上)。二、具体讲解synchronized作用域:1)是某个对象实例内,synchron...

2022-03-14 15:47:27 2127 2

原创 java的clone方法、浅拷贝与深拷贝

Java中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?1 使用new操作符创建一个对象2 使用clone方法复制一个对象那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,

2022-02-13 17:17:59 268

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除