自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 土木哥面经

循环依赖的问题是通过三级缓存机制来解决的。Spring的默认单例bean创建过程中包括三个缓存完整初始化的bean map,未完整初始化的bean map ,以及存储bean代理工厂的map不能解决多例bean 解决方法 变为单例不能解决 构造器注入 解决方法 懒加载或者使用setter注入方法重新设计结构:这是最直接也是最彻底的方式。重新设计你的类和组件,避免它们之间产生直接的相互依赖。这可能需要引入新的中间类或接口。drop:删除内容和定义,释放空间。(表结构和数据一同删除)truncate。

2023-08-22 21:07:43 61

原创 泛型dasd

型更像是对多态做出了限制,如果说没有限制之前的多态是花花公子,可能今天爱一个女人明天爱另一个女人,但经泛型约束后的多态就是一位丈夫,他必须全心全意去爱一个女人。Java在编译期引入了泛型检测机制,对容器的使用进行了强制约束,但容器本身并没有发生实质性的改变。1.泛型是一种编译期的代码模板技术,具有存入时类型检查和取出时自动转型的优点。创造的语法糖,只在编译期,由编译器负责解析,类型强转:根据泛型自动强转(多态,向下转型)静态方法无法使用泛型类的类型参数,换言之,静态方法无法使用泛型类的类型参数,换言之,

2023-08-18 16:31:04 158

原创 子类初始化顺序

"一个子类对象的实例会包含其所有基类所声明的字段,外加自己新声明的字段。那些父类声明的字段并不构成一个完整的父类的实例。super()是让父类封装对自己所声明的字段做初始化的手段。只创建了子类对象, 并调用父类构造方法初始化了一些必要的属性, 并没有创建父类对象, this只指向子类对象.有自己独立空间的才是一个对象, 此时父类初始化的属性都在子类对象所属的空间里面, 所以并没有创建出父类对象.4. 子类中普通成员变量和代码块,子类的构造函数。3. 父类中普通成员变量和代码块,父类的。

2023-08-18 14:57:56 76

原创 xxxxxxxx

反射-》jdk动态代理。

2023-08-16 20:21:26 162

原创 一些小整理

Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。从jvm角度,子类的方法表从指向父类方法,到指向自身重写后的方法。,子类继承父类,子类重写父类方法, 以及父类引用指向子类实例。中方法的调用,实际上调用的是代理类重写的代理方法。体现方法重载,方法名相同,方法参数不同。多态指的是一个对象具有多种的状态。的时候,实际上创建的是这个。的一个代理对象,我们后续对。使用了两种动态代理,分别是。

2023-08-14 21:55:43 34

原创 关于堆操作(小根堆为例)

heap[k]=heap[size] size-- up[k]/downp[k] 这里指有可能上浮或者下沉。size++ heap[size]=x 插入堆的末尾也就是树的最后一个节点,然后做up[size]明确:堆为完全二叉树,用一维数组存,为了方便,下标由1开始。1.建堆,用o(n)的复杂度 (可以用数学归纳法证明(核心是从非叶子节点往下down。2.查看最小值 heap[1]核心就是叶子不用down操作。6.修改任意一个值 k为x。5.删除任意一个值 k。

2023-08-14 15:08:16 32

原创 继承与多态

分派描述的是方法版本确定的过程。1.静态连接与非虚方法。2.动态连接与虚方法。

2023-08-13 23:12:37 29

原创 8.8面经

期望达到的并发状态是线程池配置中的一个关键参数,代表核心线程数。线程池初始化时并不会立即创建这么多线程,但当任务持续提交给线程池时,线程池会尽量快速创建线程,直到达到指定的数量。这些核心线程是线程池尝试始终保持活动的,因为它们通常用于处理最常见的工作负载。不关心最先添加到线程池的核心线程是否会被销毁通常情况下,核心线程是不会被销毁的,即使它们处于空闲状态。这一特性确保了当新的任务到来时,线程池可以迅速响应,因为它总有一些线程在待命。但在中,有一个参数。当它设置为true时,核心线程在空闲超过。

2023-08-08 23:23:16 48

原创 8.7面经

如果向任务队列投放任务失败(任务队列已经满了),但是当前运行的线程数是小于最大线程数的,就新建一个线程来执行任务。创建线程池的方法常用的有两中,一种是new ThreadPoolExecutor配置7种参数,一种是Executors类,四种封装好的线程池类型(定长,单线程,可缓存支持灵活回收的线程池,支持周期执行任务的线程池)Java提供了很多核心接口的定义,这些接口被称为SPI接口,同时为了方便加载第三方的实现类,SPI提供了一种动态的服务发现机制(约定),只要第三方在编写实现类时,在工程内新建一个。

2023-08-07 21:14:22 77

原创 对象进入老年代

大对象直接进入老年代。

2023-08-04 11:44:51 145

原创 G1和CMS

G1是一款专门针对于拥有多核处理器和大内存的机器的收集器,在满足了GC响应时间的延迟可控的情况下,也会尽可能提高的程序的吞吐量。

2023-08-03 15:27:30 562

原创 内存泄漏和内存溢出,安全点与安全区域

你在程序中申请了一块内存,使用了之后之后不会再使用,但是没有释放,而JVM的GC机制也无法回收这块区域,此时就可以被称为内存泄漏。好比程序中开了一个流对象,使用完成之后没手动关闭,GC机制也无法回收它,这种情况就是内存泄露。这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持有外部类的实例对象,这个外部类对象不会被垃圾回收,这也造成内存泄漏。长生命周期对象持有短生命周期对象的引用,尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收。

2023-08-03 11:35:37 346

原创 ziplist、quicklist 和 listpack

quicklist 结构在 ziplist 基础上,使用链表将 ziplist 串联起来,链表的每个元素就是一个 ziplist。同时,quicklist 限制了每个节点上 ziplist 的大小,一旦一个 ziplist 过大,就会采用新增 quicklist 节点的方法。更糟糕的是,ziplist 新增某个元素或修改某个元素时,可能会导致后续元素的 prevlen 占用空间都发生变化,从而引起。问题,导致每个元素的空间都要重新分配,这就会导致 ziplist 的访问性能下降。,把每个元素都紧挨着放置。

2023-08-02 13:45:30 158

原创 HashMap扩容和Redis中Dict 扩容

扩充HashMap的时候,不需要像JDK1.7的实现那样重新hash,只需要看看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成“原索引+oldCap”,这个设计确实非常的巧妙,既省去了重新hash值的时间,而且同时,由于新增的1bit是0还是1可以认为是随机的,因此resize的过程,均匀的把之前的冲突的节点分散到新的bucket了,这一块就是JDK1.8新增的优化点。,还可能是覆盖掉原来的数据,这里就存在一个key的比较问题。每次新增,查询,修改,删除,

2023-08-02 13:21:23 388

原创 多线程简单编程题总结(更新奇偶交替打印)

注意:实现公共方法put和take没有先while循环,因为put,take每次只用一次,注意与上边区分。使用 ReentrantLock,加两个条件队列(isFUll,isEmpty)按顺序指定唤醒使用ReentrantLock,注意:显示的加锁和释放锁。可以看到3中实现有界阻塞,本身就是消费者生产者。

2023-08-01 21:11:33 149

原创 String ,StringBulider ,StringBuffer

面试指北149知乎。

2023-07-31 19:35:56 261

原创 cookie和session

(2)如果上一步中从cookie数组中取到的cookie数组已经包含了JSESSIONID这个cookie,这时候我我们取出JSESSIONID的值,然后去内存中的session(内存中有很多session)去寻找对应的sessionId为JSESSIONID的值的session,如果找得到的话,就使用这个session,找不到的话,就新建一个session,并且同样的调用addCookie()方法覆盖掉原来的JSESSIONID这个cookie的值。ssion是一种持久的会话,它的存在主要是为。

2023-07-30 15:01:18 46

原创 面试111213

1.是依赖于对象实现的锁功能(对象头以及Monitormonitor对象存在于堆空间内,每个Java对象的对象头,其中markword存放指向Monitor对象的指针,关键字便是通过这种方式获取锁的2.锁升级无锁状态:偏向锁:如果一个线程获得了锁,那么锁就进入偏向模式,此时Mark Word的结构也变为偏向锁结构,当这个线程再次请求锁时,无需再做任何同步操作,即不需要再走获取锁的流程,这样就省去了大量有关锁申请的操作,从而也就提高程序的性能。轻量级锁:之前持有偏向锁的线程,会优先进行cas。

2023-07-28 21:26:56 108

原创 面试91011

略1.7的数据结构 数组+单链表1.8的数据结构 数组+单链表/红黑树1.7的插入方法:头插法1.8的插入方法:尾插法1.7扩容机制:先扩容在插入1.8扩容机制:先插入再扩容在JDK1.6和JDK1.7中,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的key-value键值对都存储在一个链表里。但是当数组中一个位置上的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。

2023-07-27 21:16:50 70

原创 执行引擎子系统、JIT即时编译原理与分派实现

class。

2023-07-27 16:10:01 110

原创 对象的整个生命周期

在上篇对于JVM内存区域分析的文章中曾分析到:大部分的Java对象是会被分配在堆上的,但也说到过堆是线程共享的,那么此时就会出现一个问题:当JVM运行时,如果出现两条线程选择了同一块内存区域分配对象时,不可避免的肯定会发生竞争,这样就导致了分配速度下降。栈上分配是属于C2编译器的激进优化,建立在逃逸分析的基础上,使用标量替换拆解聚合量,以基本量代替对象,然后最终做到将对象拆散分配在虚拟机栈的局部变量表中,从而减少对象实例的产生,减少堆内存的使用以及GC次数。不同的GC器对于大对象的判定标准也不一样。

2023-07-27 13:45:41 40

原创 类加载过程问题

使用自定义加载器场合:1.class文件不在classpath路径下2.class文件在网络传输中进行了加密继承CLASSLOAD类 ,重写了父类的方法,利用方法在JVM内存中生成了最终的Class对象。

2023-07-27 12:59:20 47

原创 Redis为什么快

Redis 的大部分操作都在内存中完成,并且采用了高效的数据结构,因此 Redis 瓶颈可能是机器的内存或者网络带宽,而并非 CPU,既然 CPU 不是瓶颈,那么自然就采用单线程的解决方案了; Redis 采用单线程模型可以避免了多线程之间的竞争,省去了多线程切换带来的时间和性能上的开销,而且也不会导致死锁问题。 Redis 采用了I/O 多路复用机制处理大量的客户端 Socket 请求,IO 多路复用机制是指一个线程处理多个 IO 流,就是我们经常听到的 select/epoll 机制。简单来说,在

2023-07-26 22:34:10 30

原创 初始化顺序

在类对象进行初始化的时候,按顺序会初始化类中的静态成员变量,静态初始化块。 在进行类实例初始化的时候,按顺序会初始化成员变量,初始化块,构造函数

2023-07-26 20:23:04 24

原创 MySql问题

2.red-log刷盘策略:参数来控制,默认是处于第二个级别,也就是每次提交事务时都会刷盘,这也就意味着一个事务执行成功后,相应的。的缓冲区,设计在线程的工作内存中,这样就能够让所有引擎通用,并且不同线程/事务之间,由于写的都是自己工作内存中的。,而这个缓冲池主要存放两类东西,一类是数据相关的缓冲,如索引、锁、表数据等,另一类则是各种日志的缓冲,如。是一种预写式日志,即在向内存写入数据前,会先写日志,当后续数据未被刷写到磁盘、级别的日志,也就是所有引擎都能用的日志,而。文件中的旧数据,然后再写表上的数据。

2023-07-26 13:33:33 26

原创 java注解

这一种情况只适用于那些编译器已经熟知的注解类,比如 JDK 内置的几个注解,而你自定义的注解,编译器是不知道你这个注解的作用的,当然也不知道该如何处理,往往只是会根据该注解的作用范围来选择是否编译进字节码文件,仅此而已。接着,你用注解修饰某个元素,编译器将在编译期扫描每个类或者方法上的注解,会做一个基本的检查,你的这个注解是否允许作用在当前位置,最后会将注解信息写入元素的属性表。讲的挺深入的,虽说是注解的属性,但毕竟本质还是接口的方法。3.java 三大内置注解。

2023-07-24 20:18:29 31

原创 面经四五六

说到这里起码能够证明你是看过源码的,接下来说说你的思考,比如我们知道对于hashmap 初始化容量决定了数组大小,一般我们对于数组这个初始容量的设置是有规律的,它应该是 2^n。这个问题比较简单,强引入、弱引入、软引入、虚引入,说一下它们各自的特点和GC对它们的不同处理方式,再说一下常用的应用场景或者jdk的实现中对它们的使用,比如,ThreadLocal 的静态内部类ThreadLocalMap,它的Key是弱引用的,也可以说一下 在你的理解中 为什么它是弱引用的,假如不是会怎么样。

2023-07-24 20:04:22 36

原创 背包问题边界总结

for j in range(self.vol, -1, -1):f【j】 = merge(f【j】, f【max(j - v,0)】 + w) # 01背包``for j in range(self.vol+1):f【j】 = merge(f【j】, f【max(j - v,0)】 + w) # 完全背包``for j in range(self.vol, -1, -1):f【j】 += f【max(j - v,0)】 # 01背包`- 最终f【j】代表体积`至多`为j时的方案数。

2023-07-05 11:54:46 48

原创 Java中访问修饰符

default(即不写访问修饰符):默认访问修饰符,表示该类可以被同一个包中的其他类访问,但是在不同包中的类不能访问。在 Java 中,访问修饰符用于限制类、方法和变量的访问范围。public:公共访问修饰符,表示该类可以被任何其他类访问,无访问限制。的主要作用是限制了类和成员变量、方法的访问范围,保护了类的封装性。的成员变量和方法只能被同一类内的方法访问,其他任何类都无法访问。的成员变量和方法可以被同一包内的类和不同包中的子类访问。的类、方法和变量只能被同一包内的类访问。访问修饰符是最严格的访问级别。

2023-04-14 19:51:25 1044

空空如也

空空如也

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

TA关注的人

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