java面试
文章平均质量分 71
桑丘紫言
这个作者很懒,什么都没留下…
展开
-
LinkedList底层代码解析
因为在双向链表中,每个节点都包含了对前一个节点和后一个节点的引用,通过修改节点间的引用关系,可以方便地插入和删除节点,而不需要进行数组元素的移动和容量的调整。需要注意的是,由于LinkedList是基于链表结构的,查找操作的时间复杂度通常是O(n),其中n是链表的长度。LinkedList通过这样的节点结构,实现了双向链表的功能,支持在头部、尾部和任意位置插入和删除节点,为LinkedList提供了灵活的元素操作能力。遍历链表,根据所选择的查找方向,依次访问节点的后继节点或前驱节点,直到找到目标节点。原创 2023-07-27 11:21:22 · 288 阅读 · 0 评论 -
ArrayList是如何动态扩容的
需要注意的是,由于数组的扩容涉及到数据的复制,因此在频繁进行元素添加或删除操作时,可能会带来一定的性能开销。扩容机制:ArrayList的扩容机制是通过创建一个新的数组,并将原数组中的所有元素复制到新数组中实现的。数组复制:在进行扩容时,ArrayList内部会调用System.arraycopy()方法来将原数组中的元素复制到新数组中。具体来说,在Java的ArrayList中,默认的加载因子是0.75。更新引用:扩容后,ArrayList会将新数组的引用指向内部的数组对象,旧的数组会被垃圾回收。原创 2023-07-27 11:00:34 · 882 阅读 · 0 评论 -
ArrayList的扩容机制grow()方法讲解
计算新容量:通过将旧容量右移一位(相当于除以2),然后与旧容量相加,得到新的容量大小。更新引用:将ArrayList的内部数组引用指向新数组,旧的数组会被垃圾回收。需要注意的是,扩容机制中的容量增长策略可以根据具体实现和数组的大小而有所不同。方法,根据新容量创建一个新的数组,并将原数组中的所有元素复制到新数组中。方法的作用是根据需要扩展ArrayList的容量。检查新容量:如果新容量仍然不够需求,则使用需求的大小作为新容量。此外,如果在不断增加元素的过程中,已知要存储的元素数量,可以使用。原创 2023-07-27 10:48:58 · 406 阅读 · 0 评论 -
System.arraycopy()方法使用案例
System.arraycopy()方法来将原数组中的元素复制到新数组中,这是一个底层的高性能数组复制方法。原创 2023-07-27 10:39:43 · 188 阅读 · 0 评论 -
反射和泛型的一些知识总结
反射和泛型的知识总结原创 2023-07-27 10:20:57 · 203 阅读 · 0 评论 -
一些关于设计原理和设计模式的问题
2.能否举一个您在项目中应用开放封闭原则(OCP)的例子,并解释一下为什么该原则对于软件扩展很重要?5.观察者模式是一种常见的设计模式,请解释一下观察者模式的概念以及在实际开发中的应用场景。4.设计模式中的单例模式是什么?你可以解释一下它的作用和在Java中如何实现吗?3.依赖倒置原则(DIP)是什么?你可以给一个您在项目中实践该原则的例子吗?1.请解释一下单一职责原则(SRP)是什么,为什么它在软件设计中很重要?原创 2023-07-26 15:34:17 · 375 阅读 · 0 评论 -
面试比较优质的答案
回答2:在实际项目中,我常使用Spring Boot来快速构建独立的、可自包含的Spring应用程序。控制反转通过依赖注入的方式将JavaBean注入到Spring容器中,使得对象的创建和管理交由容器负责,降低了组件间的耦合度。回答4:Spring AOP(面向切面编程)是Spring框架的一个重要特性,它通过动态代理机制实现在方法执行前、中、后注入额外的行为,而不需要修改原有的业务逻辑。能分享一些实际经验吗?监控系统的性能指标,时刻保持对系统的监控,并对疑似瓶颈进行及时的调优和优化。原创 2023-07-11 15:02:52 · 84 阅读 · 0 评论 -
面试专题:spring
Ioc即控制反转,把原来的代码里需要实现的对象创建,依赖反转给容器来帮忙实现,需要创建一个容器并且需要一种描述让容器知道要创建的对象间的关系,在Spring中管理对象及其依赖关系是通过Spring IOC容器实现的。TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。原创 2023-06-19 16:45:35 · 852 阅读 · 0 评论 -
面试专题:Redis
解决办法: 有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。原创 2023-06-16 19:32:47 · 987 阅读 · 0 评论 -
面试专题:Mysql
例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次读取时查到的记录就变为了5条,这样就导致了幻读。例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导 致A再读自己的工资时工资变为 2000;原创 2023-06-12 17:59:56 · 1129 阅读 · 0 评论 -
面试专题:计算机网络常见面试点总结
由于 TCP 要提供可靠的,面向连接的运输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资。举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。在传输层中有TCP协议与UDP协议。原创 2023-06-09 14:55:51 · 964 阅读 · 0 评论 -
面试专题:设计模式
里氏代换原则是对开闭原则的补充。工厂类负责判断、控制哪个子类被执行,而工厂类调用子类完成后,返回的结果是该子类的父类,该父类中的变量已经被操作过了,访问该父类,得到我们想要的结果。面试时常见的就是的就是让你手写一个单例模式(注意单例模式的几种不同的实现方法)或者让你说一下某个常见的设计模式在你的项目中是如何使用的,另外面试官还有可能问你抽象工厂和工厂方法模式的区别、工厂模式的思想这样的问题。工厂方法模式可以在不修改工厂角色的情况下引进新产品,该模式中,工厂类与产品类是一一对应,并且是平行等级的结构。原创 2023-06-07 17:59:33 · 672 阅读 · 0 评论 -
面试专题:java虚拟机(3)---JVM 调优
但是遇见大一点的程序就容易死机,因为本身就是用 java写的,所以有占据本机的JVM内存,所以一般是远程检测,故对于大程序一般不推荐直接使用,而推荐使用jmap+mat。在设计(或使用)GC 算法时,我们必须确定我们的目标:一个 GC 算法只可能针对两个目标之一(即只专注于最大吞吐量或最小暂停时间),或尝试找到一个二者的折衷。JVM 的 GC指标一般是从 GC 日志里面查看,默认的 GC 日志可能比较少,我们可以添加以下参数,来丰富我们的GC日志输出,方便我们定位问题。典型的有:死循环、使用无界队列。原创 2023-06-06 16:53:02 · 872 阅读 · 0 评论 -
面试专题:java虚拟机(2)
在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个哈希表,里面存的是驻留字符串(也就是我们常说的用双引号括起来的)的引用(而不是驻留字符串实例本身),也就是说在堆中的某些字符串实例被这个StringTable引用之后就等同被赋予了”驻留字符串”的身份。常量池的每一项常量都是一个表,一共有如下表所示的11种各不相同的表结构数据,这每个表开始的第一位都是一个字节的标志位(取值1-12),代表当前这个常量属于哪种常量类型。G1收集器收集范围是老年代和新生代。原创 2023-06-05 15:48:05 · 419 阅读 · 0 评论 -
面试专题:JAVA虚拟机(1)
这一阶段的目的是确保class文件的字节流中包含的信息符合当前虚拟机的要求,并不会危害虚拟机自身的安全(虽然编译器会严格的检查java代码并生成class文件,但是class文件不一定都是通过编译器编译,然后加载进来的,因为虚拟机获取class文件字节流的方式有可能是从网络上来的,者难免不会存在有人恶意修改而造成系统崩溃的问题,class文件其实也可以手写16进制,因此这是必要的)生命周期和线程的生命周期是一致的。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。原创 2023-06-02 18:09:28 · 710 阅读 · 0 评论 -
面试专题:java多线程(3)---关于 Atomic 原子类
UnSafe 类的 objectFieldOffset() 方法是一个本地方法,这个方法是用来拿到“原来的值”的内存地址,返回值是 valueOffset。AtomicReference: 引 用 类 型 原 子 类 AtomicStampedRerence:原子更新引用类型里的字段原子类AtomicMarkableReference :原子更新带有标记位的引用类型。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。原创 2023-06-01 10:05:27 · 530 阅读 · 0 评论 -
面试专题:java多线程(2)-- 线程池
线程池会返回一个future类型的对象,通过这个future对象可以判断任务是否执行成功,并且可以通过future的get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而使用get(long timeout,TimeUnit unit) 方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性, 使用线程池可以进行统一的分配,调优和监控。原创 2023-05-31 17:17:01 · 615 阅读 · 0 评论 -
面试专题:java 多线程(1)----synchronized关键字相关问答
所以如果一个线程A调用一个实 例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态synchronized 方法占用的锁是当前实例对象锁。比如一个线程获得了某个对象的锁,此时 这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死 锁。5.线程池解决什么问题的;原创 2023-05-30 17:32:12 · 788 阅读 · 0 评论