自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【无标题】

2023-11-11 20:05:04 188 1

原创 面试 004

Java 内存模型是为了保证 Java 程序在多线程运行下,仍然可以使得数据安全性,这里的安全指的是线程安全,也就是保证数据的,可见性、有序性、原子性。为了使得 Java 内存模型的实现,设计了一系列的关键字,比如:synchornized volatile final除此之外,还涉及了 happen - before 原则:线程的执行在线程的创建之后,线程中前面的动作再早于后面的执行动作,通过设计了一系列的规则,保证的多线程下面的线程安全问题。

2023-05-05 11:57:43 780 1

原创 Java 线程池

主要目的就是为了提升程序的运行效率,如果说服务器接受了 1000 个请求,为每一个请求都创建一个线程,那么在创建线程以及管理线程消耗的系统资源是非常多的,使用线程池技术,可以使得线程复用,得到提升系统运行效率的目的。为了提升效率,避免频繁的创建销毁线程从而导致影响系统性能。线程复用的思想。

2023-04-29 20:13:05 1293

原创 面试 - 003

在传统的互联网访问中,如果所有用户的请求都打到一个服务器上面,那么这个服务器肯定是受不了的,所以说将资源分配到不同的服务器上面是有必要的。用户连接 CDN 服务器的时候,有那么多的服务器,选择哪一个进行连接是需要选择的。这个时候便是需要使用 CDN 的算法,使得用户访问到距离它最近的 CDN 服务器,这样一来,使得用户的体验感更好了。

2023-04-27 21:28:59 428

原创 面试题目 002

最长回文串根据前序中序恢复二叉树。

2023-04-26 17:40:02 556

原创 Cesium 核心概念 核心接口

Cesium 是一个开源的3D地球可视化引擎,它可以在Web浏览器中以高性能和高质量呈现全球范围内的地球表面数据。Cesium 可以用于以下领域:地理信息系统:Cesium 可以呈现地球表面上的各种地理信息数据,包括卫星影像、数字高程模型、地形数据、矢量数据等。用户可以使用 Cesium 创建交互式的地图应用程序,从而更好地了解地球上的各种地理信息。智能城市:Cesium 可以用于可视化城市规划、交通流量、气象预报、环境监测等数据。

2023-04-22 19:59:20 1658

原创 面试题目 - 001

线程安全的本质就是由于多个线程在争抢资源,可能使得资源的一致性、完整性发生问题,导致程序的不正确执行。Java 是怎么保证线程安全的?提供一些关键字以及 API 精良的保证线程安全:关键字:volatile:能保证可见性、有序性、不能保证原子性,需要加上 Synchornized,底层的原理是内存屏障,内存屏障就是一个硬件指令,保证程序的可见性、有序性。synchornized(底层会加锁,表面上是锁上了一段代码):保证代码块的可见性、有序性、原子性。

2023-04-20 21:35:18 489

原创 MySQL Join 关键字及其使用

(1)它是在关系型数据库(关系型数据库也就是按照表格的形式增删改查数据)使用 join 关键字可以讲多张表的数据组合到一起,提供全面新的查询。简单来说就是将不同的表格数据进行组合,然后查询到自己想要的数据。

2023-03-15 16:28:57 582

原创 注册了一个监听器 注册怎么理解 编程中为什么叫做注册

在编程中,"注册"一般是指将一个对象(通常是一个回调函数或者一个监听器)与一个事件关联起来,以便在该事件发生时能够执行相应的操作。这个过程可以理解为在某个集合中登记该对象,以便在需要时能够找到它并且执行相应的操作。比如在Java中,我们可以通过调用事件源对象的 addXXXListener() 方法来注册一个监听器,将其与某个事件关联起来。这样当该事件发生时,事件源对象会遍历所有已经注册的监听器列表,逐个调用它们的相应方法来处理该事件。

2023-02-28 21:32:42 277

原创 在数组里面 num[i++] 和 num[++i] 的区别 ,不推荐使用 但是得分清楚

num[i++] 先使用 i 的当前值来获取数组 num 中的元素,然后再将 i 的值加 1。也就是说,该操作会先返回 num[i],然后将 i 增加 1。num[++i] 先将 i 的值加 1,然后再使用新的值来获取数组 num 中的元素。num[i++] 和 num[++i] 都是数组 num 中的元素操作,它们之间的主要区别在于它们对变量 i 的修改顺序不同。因此,num[i++] 和 num[++i] 的结果是不同的,且在一些情况下会产生错误的结果。

2023-02-26 22:00:08 853

原创 Java 解释器和即时解释器(JIT)之间的区别

因此,可以将解释器和即时编译器看作是两种不同的执行模式,解释器是按需执行和翻译,即时编译器是预先翻译和优化。但两者并不是相互独立的,JVM 可以根据程序的实际情况动态地选择最优的执行模式,以提高程序的执行效率。需要注意的是,即时编译器不是一次性将整个程序都翻译成机器码,而是按照需要逐个方法进行翻译和优化的。当一个方法被多次调用时,即时编译器会根据实际情况对该方法进行翻译和优化,从而提高该方法的执行效率。它的翻译粒度是一条指令,而且是按需翻译,也就是只有在需要执行某条指令时才进行翻译。

2023-02-26 12:00:55 829

原创 Java 知识点

D 中会出现两个从 A 继承下来的属性或者方法,那么在调用的时候就会出现歧义。所以在 Java 中放弃使用多继承,避免了这样的问题。

2022-09-18 21:35:50 127

原创 JMM (Java 内存模型,不是 JVM 内存结构) 和 volatile

在 CPU 层面,实现了数据的一致性访问,编程语言在这个方面也付出了相关的努力。在 C++ 中可以实现数据在并发情况下的并发访问安全,但是这个程序的跨平台能力很差。举例:对于传统的内存模型,比如 C++ 的内存模型,在 linux 下面可以正常的执行程序,保证变量的线程安全,但是换到 windows 中,需要特别的针对 windows 编写代码,否则因为换了使用平台会导致并发访问出错,也就是变量不是线程安全的。在设计 JMM 的时候,也就是设计 Java 程序中访问变量规则的时候。.........

2022-08-28 16:06:42 425

原创 剑指 Offer 39 数组中出现次数超过一半的数字

题目链接。

2022-08-26 17:04:06 151

原创 剑指 Offer 04 二维数组中的查找

题目链接。

2022-08-24 20:16:14 208

原创 ReentrantLock 类 源代码详细解释

所谓的可重入就是一个线程获取到了锁之后,同一个线程还是想要再次的获取到这个锁,那么这个锁可以再次的被获取到,那么这个锁就是可重入锁。否则这个,锁就是不可重入锁。

2022-07-29 17:35:59 270

原创 力扣 7 整数反转

题目链接给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。(在 res 出来结果之前就需要判断,这里是一个大坑)2、思路分析按照数学的方式以及按照字符串拼接的方式,可以出现两种解决方案,使用数学的时候,需要注意:如果是在 res 输出之前才进行判断的话,会出现数字溢出的情况需要注意。在循环内部进行判断的时候,由于判断语句在 res

2022-07-09 20:20:40 160

原创 力扣 226 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。翻转整棵树,可以将问题拆解成为很多个小问题,也就是将存在左结点以及右结点的结点进行翻转。使得左结点以及右结点的位置进行交换,达到翻转的目的。这里体现出来了递归的思想,重点是确定单层递归的逻辑、确定递归传递的参数以及递归停止的条件。递归停止条件:递归传递的参数:单层递归的逻辑:找到有左右结点的结点,将该结点的左右结点交换即可。java 中,位置的交换体现在引用的交换。3、执行代码4、小结借着翻转整棵树这个题目,基于将问题拆解的思

2022-06-15 16:48:57 172 1

原创 Java ThreadLocal 深入底层源代码; 讲清楚为什么 ThreadLocalMap 的 Entry 的 key 使用弱引用;

在多线程并发编程中,保证变量的线程安全性是十分重要的,在通常的做法是利用加锁来实现线程安全。这样虽然可以保证线程安全。但是程序运行的效率会显著的下降。为了使得程序运行效率的提升并且兼顾变量被访问的线程安全性,ThreadLocal 应用而生。ThreadLocal 的设计思想下面简单的概述:既然多线程访问同一个变量会造成线程安全的问题,那么创建出来一个变量,需要使用这个变量的线程将该变量拷贝一份,并且拷贝的变量是线程私有的,使得变量隔离起来使用,避免了线程之间的交错使用数据造成的线程安全问题。举个例子,

2022-06-06 17:48:52 236

原创 Http 协议报文 ;浏览器输入URL 回车发生过程阐述; 计算机网络四层模型

Http协议1 什么是协议?提前某一个人或者某些组织提前指定好的规范,大家可以按照规范进行无障碍的交流沟通两个人之间说话可以互相听得懂,这个就是普通话协议,都是遵守的,所以可以沟通2 什么是HTTP 协议?W3C 制定的超文本传输协议(发送数据的一个模板,是提前被制定好的)什么是超文本?不是普通的文本,可以有声音,图片等流媒体信息比如向服务器发送照片存储到服务器中,向服务器上传视屏,都是超文本传输实现的。当然超文本信息都是可以传递的,那么文本信息当然也是可以传递的B S(

2022-05-19 15:57:20 357

原创 Java 反射 参考较为官方的中英文档

什么是 Java 反射具有分析类的能力的程序叫做反射;Java 中具有分析类的能力的程序存在于 java.lang 以及 java.lang.reflect 包下面,这两个包中提供相关的类以及方法来实现反射。反射主要做的事情就是:在程序动态运行的过程当中,动态的检查以及修改类、接口、方法、字段中的内容。对于反射的英文简单解释:1、The java.lang and java.lang.reflect packages provide classes for java reflection.2、Ja

2022-05-15 20:01:37 451

原创 MySQL锁的分类 以及并发事务下存在的问题以及问题的解决方式

引言无论何时,多个查询在同一时间修改数据,就会产生并发控制的问题,为了解决并发控制可以使用锁机制来保证数据的安全性;在 MySQL 中存在不同种类的锁,对于数据库性能调优以及选择合适的存储引擎来存储数据,了解这些锁是十分有必要的;MySQL 按照锁的粒度划分为表锁,页锁,行锁;按照锁的类型分为共享锁,排他锁,意向锁;意向锁分为意向排他锁,意向共享锁;上面锁的分类可以使用下面思维导图总结总体来说 MySQL 支持的锁的粒度有行锁,页锁,表锁,但是不同的存储引擎支持的粒度是不一样的;行锁

2022-05-11 20:57:23 481

原创 try catch finally? 还是 try with resource?

引言在程序开发过程中,存在着这样的应用场景:需要读取文件,读取结束之后需要关闭资源;比如下面的开发场景:读取了 test.txt 文件,读取结束之后,需要关闭资源,不关闭的话,会造成系统资源的浪费;public static void main(String[] args) { //读取文本文件的内容 Scanner scanner = null; try { scanner = new Scanner(new File("/test.txt"));

2022-05-11 17:47:51 282

原创 力扣 11 盛最多水的容器

题目链接https://leetcode.cn/problems/container-with-most-water/1、题目要求给定一个长度为 n 的整数数组 height(就是个数组名字,里面保存几个数字) 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

2022-05-11 16:01:09 199

原创 设计模式 - 原型模式 - 基于 Java 实现

原型模式的定义(Prototype)原型模式允许我们向客户端隐藏创建新实例的复杂性。这个概念是复制现有对象而不是从头开始创建新实例,创建新的对象可能包括昂贵的操作。现有对象充当原型并包含对象的状态。只有在需要时,新复制的对象才能更改相同的属性。这种方法节省了昂贵的资源和时间,尤其是在对象创建是一个繁重的过程时。原型模式是一种创造型设计模式。当对象创建耗时且操作成本高时,需要原型模式,因此我们使用现有对象本身创建对象。从现有对象创建对象的最佳可用方法之一是 clone() 方法. 克隆是实现原型模式的最

2022-05-07 20:10:25 224

原创 设计模式 - 工厂方法模式 - 基于 Java 实现

工厂模式的分类工厂模式可以分为简单工厂模式,工厂方法模式,抽象工厂模式;在前面的博客中介绍了简单工厂模式,本篇博客主要介绍的是工厂方法模式什么是工厂方法模式工厂方法模式是简单工厂的进一步的深化,在工厂方法模式中,不再提供统一的工厂类来创建不同的对象,针对不同的对象,选择使用了不同的工厂;可以这样理解:每一个对象都是有自己的工厂来创建自己的对象的;工厂模式的定义:定义一个用于创建对象的接口,让子类决定哪儿个类进行实例化,工厂方法模式让一个类的实例化延迟到其子类;工厂方法模式的实现应用场景的假设

2022-05-06 16:12:36 587

原创 设计模式 - 简单工厂模式 - 基于 Java 实现

工厂模式的分类在工厂模式中,有三种类型:简单工厂模式,工厂方法模式,抽象工厂模式;本文主要是对简单工厂模式进行简单的介绍以及总结;简单工厂模式定义定义一个工厂类,根据传递参数的不同从而返回不同的实例,被创建的对象实例之间有着共同的父类或者拥有共同实现的接口。适用场景1、需要创建的对象比较少2、客户端不需要创建对象的过程上面的使用场景这样子设定是因为,创建的对象太多,使得工厂的逻辑变得非常的复杂,这是不可取的,由于工厂类封装了对象的创建过程,所以客户端不需要关系对象是怎么创建出来的。代码实

2022-05-05 11:36:34 780

原创 设计模式 - 单例模式 - 基于 Java 实现

什么是单例模式Ensure a class has only one instance, and provide a global point of access to it.确保一个类产生的实例只有一个,自行的创建这个实例化对象,并且向着整个系统中提供这个实例什么地方需要单例模式举例:1、在操作系统中的回收站,创建出来一个回收站的实例即可,不需要重复的创建多个回收站2、网站的访问计数器类,只需要一个实例即可,多个计数器反而容易造成线程安全的问题1、需要频繁实例化,然后销毁的对象,考虑使用单例

2022-05-04 14:36:01 294

原创 Java ;类加载全过程(也叫类加载机制); 类的生命周期 ;类加载器(选择类加载器是基于双亲委派模型的);

文章目录对于上面的图解 所有的一切基于上图展开 下面每个部分的截图来自上图Java 代码编写以及编译类加载器介绍类加载过程类的生命周期对于上面的图解 所有的一切基于上图展开 下面每个部分的截图来自上图Java 代码编写以及编译类加载器介绍类加载过程类的生命周期...

2022-05-02 20:56:31 786 1

原创 MySQL 索引 为什么 InnoDB 使用 B+树

什么是索引对于数据库中数据的查询,有:查找一个范围内的数据,或者查找一个具体的数据;怎么查询呢1、遍历数据库中的数据查询,显然查询速度很慢,用户的体验效果是不好的;2、建立数据库的数据的 “目录” ,按照目录直接锁定数据可能存在的范围,提升了查询的效率,这个 “目录” ,就是索引;索引的定义是什么关于索引的定义的 MySQL 文档,国内的很多翻译翻译过来就变味了:A database index is a data structure that improves the speed of op

2022-05-01 13:30:49 2178

原创 Mysql 练习题目

原始的表题目:运营想要知道复旦大学学生gpa最高值是多少,请你取出相应数据select max(gpa) from user_profile where university = '复旦大学';题目:现在运营想要看一下男性用户有多少人以及他们的平均gpa是多少,用以辅助设计相关活动,请你取出相应数据。select count(gender) as 'male_num',avg(gpa) as 'avg_gpa' from user_profile where gender = 'male';

2022-04-30 21:00:03 1204

原创 Java 在 try catch finally 中的任何一个语句块中添加 return 之后 finally语句块代码会正常执行吗

try catch finally通常这个语句块的执行是为了处理受检异常,所谓的受检异常就是编译器检测到的并且开发人员必须处理的异常,常见的受检异常有:Java.lang.ClassNotFoundExceptionJava.lang.CloneNotSupportedExceptionJava.lang.IllegalAccessExceptionJava.lang.InterruptedExceptionJava.lang.NoSuchFieldExceptionJava.lan

2022-04-30 12:56:49 1130

原创 Java 字符串常量池 基本数据类型的包装类的常量池

为什么存在常量池所谓的常量池技术,可以理解是一种缓存技术,如果在常量池中存定义好的对象,那么程序就不需要反复的创建出来一个对象了,需要使用的时候,拿来即用,开袋即食。因为反复创建出相同的对象不仅在创建的时间上面的开销比较大,也是对于内存空间的一种浪费,所以想到了使用常量池技术。Java 里面的常量池技术,本文重要讨论的是 String 类型的常量池思想,以及基本类型的包装类的常量池思想。常量池中放置的都是引用类型,也就是各种对象,确切的说是在程序开发过程中,可能会大量重复使用的对象,提前在常量池中创建

2022-04-29 11:41:49 1516

原创 Spring IOC AOP 原理简述

什么是 IOC 目的是为了解耦合?所谓的 IOC 就是控制反转,控制反转就是开发者自己不创建对象,创建对象统一交给 Spring 框架进行管理;正常的开发者创建对象的时候,是使用 new 关键词进行创建的,如下面所示:class UserService { public static void main(String[] args) { UserDao userDao = new UserDao(); }}class UserDao { }上面这种开

2022-04-27 10:32:14 563

原创 二叉树的遍历 前序 中序 后序遍历 递归版本 java

文章目录1、题目要求2、思路分析关于递归的理解使用递归进行遍历二叉树的时候,需要考虑到下面的三种因素3、执行代码5、小结题目链接https://leetcode-cn.com/problems/binary-tree-preorder-traversal/1、题目要求给你二叉树的根节点 root ,返回它节点值的 前序 遍历。2、思路分析关于递归的理解因二叉树的遍历是有规律的,可以拆解的,每次遍历二叉树的时候,都是先遍历根节点,然后遍历二叉树的左结点,然后遍历二叉树的右节点;使用递归的思

2022-04-25 16:21:43 756

原创 Redis 从表层逐渐深入底层

什么是 Redis?Redis 代表REmote DIctionary Server。它由 Salvatore Sanfilippo 在 2006 年用 C 语言编写。它是一个 NoSQL 高级键值数据存储。Redis 中的读写操作非常快,因为它将所有数据存储在内存中。数据也可以存储在磁盘上,也可以写回内存。它通常被称为数据结构服务器,因为键可以包含字符串、散列、列表、集合、排序集合、位图和超日志。NoSQL 意味着not only SQL。NoSQL 数据库不定义像表这样的数据库结构,也不支持查询,

2022-04-21 12:15:03 1177

原创 都说 Java 万物皆对象 Java 普通对象在堆中长的是什么样子呢?

文章目录查看下面的图示 是一个完整的对象 针对 32 位的普通对象对象头对象的实例数据部分对齐填充查看下面的图示 是一个完整的对象 针对 32 位的普通对象例如数组这种大对象,在对象的结构中需要存在数组的长度的;在 64 位对象中,对象的布局与上面的有一定的出入,需要注意鉴别;对象头里面有两个数据,一个是 Mark Word 一个是类型指针Mark Word:查看上图中的左上角部分即可;具体的含义如图所示;类型指针:Java 虚拟机通过这个指针知道这个对象是哪儿个类的实例;对象的实例数据

2022-04-19 21:20:51 618

原创 力扣 1047 删除字符串中的所有相邻重复项 Java

文章目录1、题目要求2、思路分析3、执行代码4、问题反思4.1、if (top >= 0 && stack.charAt(top) == ch)5、小结题目链接https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/1、题目要求给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项

2022-04-19 15:35:56 236

原创 Java 垃圾回收器与内存分配策略 JVM

什么是垃圾回收?在 Java 开发的过程中,万物皆为对象,产生的对象存在生命周期,也就是对象存在存活的时间;在程序运行过程中,会产生完成自身使命的对象,这个时候对象就成为了程序当中的垃圾,不回收的话会一直占用内存,否则对于程序的性能,内存是有一定影响的;在 C++ 中,开发人员是自己进行垃圾回收的,但是在 Java 中,JVM 里面存在多种垃圾回收器以及多种垃圾回收算法,底层的垃圾回收一般情况下不需要开发人员关心,但是在某些特定的场景下,需要开发人员掌握 JVM 垃圾回收机制,更好的解决一些程序问题;那

2022-04-17 12:55:40 608

原创 单链表 双向链表 双向队列 (LinkedList 源代码解读)重点是LinkedList 源代码解读

单向链表与双向链表之间进行比较单链表:在链表中的每个结点中,只是维护一个其后面的结点的地址,可以满足一定的增加结点以及删除结点的作用;双向链表,在每个结点中,维护的是上一个结点的地址以及下一个结点的地址;单链表的局限性:有一个需求:查找当前的结点的上一个结点是什么,此时单链表是非常难以实现的,但是此时使用双向链表是十分容易实现的;双向链表的缺点:由于每个结点都多维护了一个指向上一个结点的指针,所以对于系统资源的消耗耗时存在的;Java Deque 接口 双向队列在常规队列中,元素是从后面添加

2022-04-15 19:38:06 1042

空空如也

空空如也

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

TA关注的人

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