自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java中的基本数据类型

数据类型占用空间byte1Bshort2Bint4Blong8Bfloat4Bdouble8Bchar英文1B,中文UTF-8占3B,GBK占2Bboolean单个变量4B,数组1B由于JVM没有boolean赋值的专用字节码指令,boolean f = false使用常数0赋值,单个boolean变量使用int代替,boolean数组会被编码成为byte数组。String为什么是final的? String类和cha...

2021-09-09 20:41:16 102

原创 设计模式-适配器模式

 适配器模式是作为俩个不兼容接口之间的桥梁,这种设计模式属于结构型模式,它结合了俩个独立接口的功能。 这个设计模式有一个单一的类,该类负责加入独立的或者不兼容的接口功能。举个例子,扩展坞是网线和电脑之间的桥梁,将网线接入扩展坞,扩展坞接入电脑,这样电脑就可以上网。 使用时机: 想要建立一个可重复使用的类,这个类可以将彼此之间没有联系的类联系起来一起工作,这些源类不一定要有一致的接口。定义重复使用类的接口,规定其作用://转接头public interface Adapter { //作用:

2021-08-28 20:17:34 94

原创 OOP的七大原则

开闭原则:对扩展开放,对修改关闭里氏替换原则:继承必须要保证超类所拥有的性质在子类中仍然成立依赖倒置原则:要面向接口编程,不能面向实现编程单一职责原则:控制类的粒度大小,将对象解耦,提高内聚性接口隔离原则:要为各个类建立他们的专用接口迪米特法则:只和你的朋友直接交谈,不和陌生人交谈合成复用原则:尽量先使用组合或者聚合来实现,其次才考虑继承关系实现...

2021-08-28 16:28:22 91

原创 设计模式-工厂模式

作用:实现了创建者和调用者的分离。核心本质:创建对象不需要new,将调用者和实现类解耦三种模式简单工厂:用来生产同一等级结构中的任意产品,新增产品需要覆盖代码工厂方法:用来生产同一等级结构中的固定产品,支持新增任意产品抽象工厂:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂1、简单工厂:package DesignPattern;/** * @author : Lxd * @date : 17:20 2021/8/27 */public class Simp.

2021-08-27 18:26:12 66

原创 设计模式-原型模式

 原型模式是一种创建型模式,它允许通过一个对象再创建另外一个可定制的对象,不需要关注创建对象的细节。使用在new一个类的时候所需要的参数很多的时候。一般情况下,原型模式很少单独出现,通过clone方法创建一个对象,然后由工厂方法提供给调用者。实现: 创建的实体类要实现cloneable接口。package DesignPattern;import java.util.Date;/** * @author : Lxd * @date : 11:03 2021/8/27 * 原型模式,创建3个

2021-08-27 16:57:07 51

原创 TCP/IP协议族

首先,TCP/IP是一个协议族,是IP、TCP、HTTP等协议的集合。一、OSI七层模型每层的作用假设A给B发送一封电子邮件,为“早上好”在A输入完发送的内容点击发送的时候,进入了应用层协议的处理,该协议会在所要传送数据的前端附加一个首部标签。该首部标明了邮件内容和收件人。B收到A的数据,会分析首部与数据正文,并进行处理。应用层是为应用程序提供服务并规定应用程序中相关的细节我们并不能保证A和B使用的邮件软件完全相同,于是将数据转化为特定的字符编码,如UTF-8,表示层与表示层之间为了识别编码格式

2021-08-20 16:48:05 166

原创 CopyOnWriteArrayList是怎么保证线程安全的

ArrayList是线程不安全的,如下:假设List长度为10,现在数组中有了9个元素线程A在add的时候,发现长度是9,进行容量判断;这时线程B也开始add元素,取出size也是9,进行容量判断;线程A发现最大容量为10,不需要扩容;线程B也一样;线程A将elementData[size++]设置为e,size变成10;线程B要将elementData[10]设置为e,此时出现了数组越界异常;Juc包下的CopyOnWriteArrayList就可以解决线程不安全的问题。具体的add

2021-08-19 20:50:34 844

原创 设计模式---单例模式

饿汉式的单例(静态变量)package DesignPattern;/** * @author : Lxd * @date : 15:35 2021/8/19 * 饿汉式单例模式 */public class Singleton01 { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.get

2021-08-19 17:03:21 58

原创 计算机网络之面试

一、OSI与TCP/IP各层的结构和功能1. OSI的七层模型图解表示:自上而下的介绍各层功能:应用层: 通过应用进程间的交互来完成特定的网络应用。常见协议:域名系统DNS、HTTP协议、电子邮件SMTP协议等传输层: 负责向俩台主机之间进程的通信提供通用的数据传输服务,主要有以下俩种协议:传输控制协议TCP:面向连接的、可靠的数据传输服务用户数据协议UDP:无连接的、尽最大努力的数据传输服务网络层: 在计算机网络中进行通信的俩个计算机可能会经过多个数据链路,也可能要经过很多通信

2021-08-14 11:20:36 107 1

原创 AQS的学习

1. 是什么 AQS是用来构建锁和同步器的一个框架,我们常用的ReentrantLock,Semaphore等都是基于AQS的。2. 原理 如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态。如果请求的共享资源被占用,那么就需要一套的线程阻塞等待以及被唤醒时锁分配的机制,这个机制时使用队列锁实现的,将暂时获取不到锁的线程添加到队列中。 AQS使用一个int成员变量来表示同步状态,使用CAS操作对其进行修改。3. 共享资源的方式独占模式:只能有一个线

2021-08-12 22:10:52 86

原创 ThreadLocal

什么是ThreadLocal 通常情况下,我们创建的变量是可以被任意一个线程访问并且修改的,而ThreadLocal可以让每个线程都有一个自己的专属本地变量。原理public class Thread implements Runnable { ThreadLocal.ThreadLocalMap threadLocals = null; ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;}在Thread类中,有俩

2021-08-10 20:24:45 89

原创 ConcurrentHashMap和HashTable

二者都是属于线程安全的HashMap,只是实现方式不同;底层数据结构:JDK7的ConcurrentHashMap底层采用分段的数组+链表实现;JDK8以后采用的数据结构和HashMap(1.8)的数据结构相同。HashTable采用数组加链表实现。实现线程安全的方式(1)在JDK7的时候,ConcurrentHashMap对整个数组桶进行了分割分段,每一把锁之锁定容器中的某一部分数据,对各线程访问不分段的资源的时候获取的是不同的锁,不会存在锁竞争,提高了并发的效率;在JDK8以后,抛弃了分段Seg

2021-08-10 17:33:44 214

原创 HashMap、HashTable、HashSet区别

HashMap和HashTable线程安全: HashMap是非线程安全的,HashTable是线程安全的,内部方法使用synchronized修饰,但是如果要保证线程安全推荐使用ConcurrentHashMap效率: HashMap效率高,HashTable基本被淘汰null Key 和 null Value: HashMap允许,只能有一个null Key , HashTable不允许,会抛出空指针异常初始容量大小和扩容大小: (1)HashMap初始大小为16,扩容为原来2倍,HashTa

2021-08-10 12:53:23 145

原创 HashMap扩容机制(JDK8)

 HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。可以存储null值,但是只有一个key可以为null,有多个值可以为null。 JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。 HashMap 默认的初始化大小为 16。之后每次扩充,容量

2021-08-10 11:09:38 1311

原创 ArrayList扩容机制

 ArrayList使用默认构造方法会生成一个长度为0的list,在调用add()方法的时候会进行扩容,细说一下扩容机制。首先,先来看ArrayList中的一些参数://默认初始容量大小private static final int DEFAULT_CAPACITY = 10;//空数组private static final Object[] EMPTY_ELEMENTDATA = {};//用于默认大小空实例的共享空数组实例。private static final Object[]

2021-08-09 20:18:20 116

原创 Java中的重写和重载

区别:重载是同一个方法对于输入参数的不同所作出的不同处理,比如常见的多个构造器重写是子类继承父类的相同方法,输入的数据一样,但是要做出与别于父类的响应的时候,需要重写父类的方法重载发生在一个类中,方法名必须相同重写发生在运行期间,参数列表、返回类型、方法名必须一样,抛出异常的范围需要小于等于父类,访问修饰符范围需要大于等于父类父类方法为private、final、static,子类无法重写,但是static方法可以再次声明构造方法不能重写...

2021-08-09 17:45:28 56

原创 剑指Offer04-二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回

2021-08-03 21:40:40 70

原创 Leetcode 实现 strStr()

题目实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。作者:力扣 (LeetCode)链接:htt

2021-07-25 22:19:13 61

原创 深入学习synchronized

一、Java内存模型JMM在介绍JMM之前,先说说计算机的结构,冯诺依曼计算机结构:CPU 是计算机运算和控制的核心,我们的程序最终都会变成指令让CPU去执行内存 程序都是在内存中运行的,内存会保存程序运行中的数据,供CPU处理缓存 由于CPU的运算速度和内存的读写速度差距很大,导致每次CPU操作内存都要耗费很长的时间,于是在CPU和内存之间加上缓存,最靠近CPU的缓存称为L1,然后依次是L2,L3和主内存,越靠近CPU的缓存速度越快,存储容量越小。CPU缓存模型结构如下:二、Java内

2021-07-22 20:29:46 116

原创 常见的垃圾回收算法和垃圾回收器

垃圾回收算法前置:1.对象什么时候需要被回收 堆内存中存放着Java中几乎所有的对象实例,垃圾回收器在进行垃圾回收之前要知道这些对象中有哪些活着,有哪些需要回收。常见的判断方式有以下俩种:引用计数法 在对象中添加一个引用计数器,每当有一个地方引用他的时候,计数器就加一,当引用失效的时候,计数器减一;当计数为0的时候,这个对象就是不可能再被使用的。 引用计数法原理简单,判定效率也比较高,但是无法解决循环引用的问题,A和B相互引用的时候,他们的计数不为0,但是这俩个对象也不会再被访问,这时候引用计

2021-07-20 13:05:45 603 1

原创 Redis的缓存击穿和缓存雪崩

一、什么是缓存击穿 redis中没有出现大量的key过期,而且redis是正常运行的,但是此时数据库的访问量瞬间增大。造成原因:redis中的某个key过期了,恰好有大量的并发访问要使用这个key,就会使数据库的压力瞬间增大。二、如何解决预先设置热门数据:在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些key的时常;适时调整:现场监控哪些数据热门,实时调整key的过期时常;使用锁:效率比较低一、什么是缓存雪崩 在极少的时间段内,出现了大量的key过期,导致数据库

2021-07-13 18:45:34 86

原创 Redis缓存穿透

一、什么是缓存穿透 在客户端发送请求查询数据的时候,先是查询缓存,若缓存中没有该数据,再去查询数据库,查到数据以后返回给客户端,并且将该数据写入缓存中。如果有大量的请求查询不存在的数据,会给数据库带来极大的压力,这个就是缓存穿透。二、怎么解决缓存穿透对空值做缓存: 如果一个查询返回的数据为null(不管数据是否存在),我们扔把这个空结果进行缓存,设置很短的空结果的过期时间,最长不超过5min。设置白名单: 利用bitmaps,定义一个可访问的白名单,名单id为birmaps的偏移量,每次访问都

2021-07-13 18:22:39 1663

原创 Redis集群

一、是什么 Redis集群实现了对redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点占存储总数的1/N。二、搭建集群 搭建一个三主三从的redis集群,在一台服务器上模拟。该操作在Reids的主从复制基础上进行。先删除之前的dump文件修改配置文件删除6380、6381配置文件,复制5份6379文件,模拟五台redis。修改配置文件,将端口号改为文件名端口号启动6个redis服务,生成以下6个配置文件将6个节点合成一个集群,我这里使用的

2021-07-13 17:09:15 128

原创 Redis的主从复制

一、什么是主从复制主服务器用于写入数据,从服务器用于读取数据,master/slaver机制,master写,slaver读有什么作用实现读写分离,减缓服务器压力容灾快速恢复二、实现组从复制(一台服务器模拟)新建myredis文件夹并将redis配置文件复制到该目录下配置一主俩从,创建三个配置文件:redis6379.conf、redis6380.conf、redis6381.conf,先将刚才复制文件的AOF关闭创建并编辑3个配置文件,直接使用vim创建启动三个服务

2021-07-12 19:16:41 133

原创 Redis的持久化操作(RDB、AOF)

一、RDB(Redis DataBase)是什么: RDB是在指定的时间间隔内将内存中的数据集快照写入磁盘,恢复的时候将文件快照直接读取到内存中。 Redis会在启动目录下生成一个dump.rdb文件。redis.conf配置如下:也可以指定输出目录:默认RDB持久化的三种策略: 在配置好配置文件以后,重启Redis,进行测试,配置在30s内改变10个key就进行持久化操作 在存入12个键值对以后,dump.rdb的文件大小发生了改变,说明持久化成功,需要注意的是,redis只会按照规

2021-07-12 12:59:12 188

原创 Redis中的事务操作

 Redis中的事务是一个单独隔离的操作,事务中的所有命令都会被序列化、按顺序的执行,事务在执行的过程中,不会被其他客户端发来的请命令请求打断。Redis中事务的主要作用就是串联多个命令防止别的命令插队。 Redis中事务操作通过三个关键词来实现:Multi、Exec、discard,Multi是组队阶段,Exec是执行阶段,discard可以在组队的过程中放弃组队。 注意:在组队的时候有任何一个命令失败,则组队的队列会被取消,在执行的时候某个命令出现了错误,只有出现错误的事务不会执行,其他的事务都会

2021-07-08 16:35:57 91

原创 Redis的三种新数据类型

一、Bitmaps Bitmaps本身不是一种新的数据类型,实际上就是字符串,但是它可以对字符串的位进行操作。在Redis中Bitmaps和字符串的操作方法不太相同。可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫偏移量。命令setbit设置某个偏移量的值,记录每个独立用户是否访问过网站,是为1,否则为0。users:20210706是2021-07-06这天独立访问用户的bitmaps,如图,表示1、6、10号用户访问过。 注意:很

2021-07-06 11:15:43 800

原创 redis的基本类型操作(包括底层实现)

一、String String类是二进制安全的,意味着String类可以包含任何数据,比如图片或者序列化的对象。一个value最多是512M。常用命令set get set会覆盖旧值appendsetnx:key不存在的时候才会设置keyincr和decr 给数字加一和减一incrby/decrby设置加减步长mset/mget设置多个key/valuemsetnx原子性存入,存在就不会存入getrange 截取字符串,相当于substringsetrange相当于

2021-07-05 17:48:37 137

原创 MySQL面试中遇到的问题

  Java后端开发(大三实习),面试的时候遇到的MySQL的问题1、三大范式第一范式:列不可再分,保证每列的原子性。第二范式:属性完全依赖于主键,满足第二范式必须先满足第一范式,要确保数据表中的每一列都与主键相关,而不是与主键(联合主键)的某一部分相关。第三范式:确保每列都与主直接相关,而不是间接相关,不能存在传递依赖。2、事务是什么:是一组SQL语句,是一个独立的工作单元,一个事务中的所有语句要不全部执行成功,要不全部执行失败事务特性:ACID原则原子性:一个事务在逻辑上是不

2021-06-19 18:32:01 136

原创 安恒信息笔试算法题

1、输入一个数组[1, 0, -1, 2, -1];输出其中和为0的三元组,输出格式为[[1, 0, -1],[-1, 2, -1]] 这个题本身是不难的,但是笔试的平台什么也没给,和平时刷LeetCode不一样,需要自己写方法,自己写返回值,甚至main函数都要自己写,我在写的时候返回值设置成了List<int[]> 类型的,返回后无法输出为需要的格式。package 面试;import java.util.ArrayList;import java.util.Arrays;imp

2021-06-19 15:28:17 677

原创 二叉树的前序、中序、后序、层序遍历,非递归实现

二叉树的遍历 二叉树的前中后遍历使用递归比较简单,这里只介绍非递归的方式前序 :根左右中序 :左根右后序 :左右根层序 :按层1、前序遍历给你二叉树的根节点 root ,返回它节点值的 前序 遍历。LeetCode144使用栈先进后出的特点,每碰到一个结点,先记录此节点,再尽可能的寻早右节点入栈,最后将左节点入栈public class LeetCode_144 { public List<Integer> preorderTraversal(TreeNode root

2021-06-11 16:05:29 154 1

原创 LeetCode142_环形链表II

环形链表II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/linked-list-cycle-ii著作权归领扣网络所有。商业转载

2021-06-10 12:17:22 67

原创 LeetCode141_环形链表

环形链表给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/l

2021-06-10 12:09:41 74

原创 LeetCode83_删除链表中的重复元素

删除链表中的重复元素存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。public class LeetCode_83 { public ListNode deleteDuplicates(ListNode head) { //哑结点,指向头结点 ListNode preHead = new ListNode(101); preHead.next = head;

2021-06-10 11:34:27 62

原创 LeetCode82_删除链表中的重复元素II

删除链表中的重复元素II存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。public class LeetCode_82 {

2021-06-10 11:28:43 60

原创 反转链表I

LeetCode206_反转链表I给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。俩种方法:1、递归public class LeetCode_206 { public ListNode reverseList(ListNode head) { //递归结束条件 if (head == null || head.next == null) return head; ListNode newNode = reverseList(hea

2021-06-10 11:17:59 76

原创 反转链表II

LeetCode 92 反转链表II(面试题)给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list-ii1、选出中间的链表反转,再次连接//leetcode submit region begin(Prohibit mod

2021-05-31 20:33:13 70

原创 Java对象的创建过程以及OOM测试

一、对象的创建  在Java语言层面上,创建对象通常仅仅是一个new关键字,当JVM遇到一条new的字节码指令时,首先先去检查这个指令的参数能否在常量池定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析,若没有,要先执行类加载。  接着为新生对象分配内存,内存大小在类加载完成后就已经确定了,分配内存实际上就是把一块大小确定的内存从堆中划分出来,分配的方法又有俩种:  指针碰撞法:这种方法有个前提:堆中的内存是绝对规整的,被使用过的内存放在一边,没被使用的放在另一边,中间有一个指针作

2021-05-31 17:25:31 446

原创 Java内存区域的划分

1.运行时数据区  JVM在执行Java程序时会将其所管理的内存区域划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而建立,有的区域根据用户线程的启动和结束而建立和销毁,Java虚拟机管理的内存分为以下几个区域:1.1 程序计数器  程序计数器是一块较小的内存空间,它可以看作当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来确定下一条要执行的字节码指令,分支、循环、异常处理等都是由计数器完成。  Java虚拟机的多线程是多条

2021-05-30 12:26:55 174

原创 Java中类的生命周期

Java类的生命周期(面试题)       当我们在本地编写完java代码的时候,是.java文件,在编译过后会成为.class字节码文件,.class字节码文件只能在虚拟机中运行,Java中类的声明周期就是.class文件从加载到销毁的过程。       Java类的生命周期主要有加载、连接、初始化、使用、卸载这五个阶段。如图:加载:  

2021-05-27 19:25:52 212

空空如也

空空如也

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

TA关注的人

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