![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java面试题
weixin_44356698
Java、前端、Nodejs、ThreeJs、vue、Python、ps、blender建模,都会一点点;侧重于java开发的全栈开发工程师
展开
-
java面试题(1) 说一下ArrayList和LinkedList区别
1、首先他们底层数据结构不一样,ArrayList底层结构是数组,LinkedList底层结构是链表;2、数据结构决定了,ArrayList在查询上的效率较高,而LinkedList在删除和添加上的效率更高;(需要注意的一点是,如果添加的时候链表比较长的话,由于需要遍历的成本在内,LinkedList不一定更快)3、都实现了List接口,但是LinkedList还额外实现了Deque的接口,可以当队列来使用。...原创 2022-03-24 11:35:23 · 1411 阅读 · 0 评论 -
Spring学习——1、简介
1.1 简介1.2 优点(1)Spring 是一个轻量级的免费的开源框架(2)原创 2021-09-06 15:19:23 · 50 阅读 · 0 评论 -
java面试题(36) Spring 七连问
1、Spring生命周期总览class(userService)–>判断构造方法–>实例化–>对象–>属性填充–>初始化–>AOP–>代理对象–>Bean(经过代理生成的bean是代理对象,不经过AOP生成的是userService对象)1、首先创建spring容器;2、spring容器通过class文件,判断构造方法,再利用反射机制生成对象;3、通过注解或者配置文件,进行属性注入;4、实现InitializingBean类中的afterProper原创 2021-07-29 15:29:20 · 91 阅读 · 0 评论 -
java面试题(35)BeanFactory和ApplicationContext有什么区别
原创 2021-07-14 11:19:21 · 75 阅读 · 0 评论 -
java面试题(34)对IOC的理解
对IOC的理解可以概括成三个词:容器概念、控制反转、依赖注入。1、容器概念 IOC容器实际上是一个Ma,里边存着各种对象,在项目启动的时候,通过扫描注解,使用反射创建对象,并放到map中。2、控制反转 没有引入IOC容器的时候,对象A依赖于对象B,那么对象A在初始化或者运行到某个节点的时候,由A主动创建对象B,或者使用已有的对象B,控制权在自己手里。 在引入IOC容器后,对象A与对象B之间...原创 2021-07-13 08:38:24 · 116 阅读 · 0 评论 -
java面试题(33)对AOP的理解
比如一个订单模块,处理要实现核心的订单模块外,还需要额外的写日志、事务、安全等非核心的功能,为了分离这些和核心功能毫不相关的功能,以及减少代码的重复。使用面向切面的方式编程。将日志、事务、安全等封装成一个目标对象中,切入到其他模块中,起到一个功能增强的作用,可以在执行摸个方法之前额外的做一些其它的事情。...原创 2021-07-08 19:49:16 · 92 阅读 · 0 评论 -
java面试题(32)什么是Spring
spring是一个轻量级的开源的J2EE框架,它是一个容器框架,用来装JavaBean(java对象),是一个中间级框架,可以起一个连接的作用。 spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架;从大小和花销上来看是一个轻量级框架;(没有说使用spring必须要用其中的类和方法)通过控制反转来达到解耦的目的;提供面向切面编程的丰富支持,允许通过分了应用的业务逻辑和系统性的服务来进行内聚性的开发;管理对象的配置和生命周期,这个意义上是容器;将简单的组件配置,组合成原创 2021-07-08 19:33:46 · 76 阅读 · 0 评论 -
java面试题(31)线程池中线程的复用原理
线程池将线程与任务解耦,通过线程调用循环任务队列,来达到线程复用的作用,通过线程调用任务的run方法来进行,也就是将run方法当成普通的方法执行,通过这种方式只使用固定的线程就将所有任务的run方法串联了起来。...原创 2021-07-08 19:09:12 · 102 阅读 · 0 评论 -
java面试题(30)线程池中阻塞队列的作用?为什么是先添加队列而不是先创建最大线程
1、阻塞队列的作用:一个是当一般队列中的任务满了后,阻塞队列可以保留之后的任务;另一个作用是,当队列没有任务时阻塞获取任务的线程、使其进入wait状态,释放CPU资源。 阻塞队列自带阻塞和唤醒功能,不需要额外的处理,无任务时线程池利用阻塞队列的take方法挂起,从而保证核心线程的存货,不至于一直占用CPU资源。...原创 2021-07-08 18:35:25 · 1286 阅读 · 0 评论 -
java面试题(29)线程池处理流程
需要注意的一点是:当临时线程执行完毕后,会先去任务队列中查看还有没有任务,有的话继续执行。没有的话等到达到最大存活时间后销毁。原创 2021-07-08 09:42:11 · 53 阅读 · 0 评论 -
java面试题(28)为什么用线程池,解释下线程池的参数设置
原创 2021-07-08 09:32:28 · 60 阅读 · 0 评论 -
Java面试题(27)并发的三大特性
0、简介 并发的三大特性:原子性、可见性、有序性。1、原子性 原子性是指子一个操作中CPU不可调度,即不可被中断,要么不执行此操作,要么全部执行完此操作; 原子性指的是最小的操作单元。比如自增操作,它本身其实并不是原子性操作,分了三步操作,包括读取变量的原始值、进行加一操作、写入工作内存中。但是为了保证多线程中自增操作的正确性,在程序中需要在自增的整个步骤中保证自增操作的原子性。2、可见性 仅仅保证自增操作的原子性,并不能保证自增操作的正确性,由于将工作内存的值刷入主内存的不确定性(由操原创 2021-07-08 09:13:19 · 192 阅读 · 0 评论 -
java面试题(26)并行、并发、串行的区别
串行:串行在时间上不可能发生重叠,第一个任务没有搞定,下一个任务只能等着; 并行:并行在时间上是重叠的,两个任务在同一时刻互不干扰的同时执行; 并发:并发运行两个任务彼此干扰,同一个时间点只有一个任务执行,交替执行。...原创 2021-07-07 15:53:27 · 212 阅读 · 0 评论 -
ThreadLocal内存泄漏的原因,如何避免
1、内存泄漏和OOM(内存不足) 内存泄漏:不会被使用的对象或者变量无法被回收; 内存不足:没有剩余的空间可以创建新的对象或者变量。2、ThreadLocal实现原理 ThreadLocal实现原理:每一个Thread维护一个ThreadLocalMap对象,key为弱引用ThreadLocal对象;value为线程变量的副本。3、ThreadLocal内存泄漏原因 由于Entry中value是强引用,key为弱引用;当CG回收ThreadLocal后,由于value是强引用,无法被回原创 2021-07-07 15:43:32 · 5123 阅读 · 0 评论 -
java面试题(24)ThreadLocal的原理和使用场景
一篇讲的很好的链接1、四种引用类型 引用类型分为:强引用、软引用、弱引用、虚引用。 强引用:一般我们使用的都是强引用,特点是不会被gc回收,宁愿抛出内存溢出异常也不会回收; 软引用:特点是内存足够的时候不会被gc回收,内存不足的时候会被回收,优先回收创建时间长,用的少的; 弱引用:特点是下次gc回收之前存活; 虚引用:略;2、ThreadLocal的原理 每一个Thread都有自己的ThreadLocalMap类型的变量ThreadLocals,它存储本线程所有的ThreadLo原创 2021-07-06 14:49:06 · 91 阅读 · 0 评论 -
java面试题(23)守护线程
原创 2021-07-06 10:18:42 · 103 阅读 · 0 评论 -
java面试题(22)Runnable和Thread区别
没太大区别,也就使用的时候有点区别,就是Thread实现了Runnable,有更多的功能提供了更多的方法,当线程要实现复杂的操作的时候使用Thread;当线程实现简单的操作的时候,使用Runnable原创 2021-07-06 10:00:11 · 66 阅读 · 0 评论 -
java面试题(21)对线程安全的理解
1、简介 不是线程安全,是内存安全,堆是共享内存,可以被所有线程访问。 当多个线程同时访问一个对象的时候,如果不借助额外的同步控制或者其它的协作操作,调用这个对象的行为都可以得到正确的结果,我们则称这个对象是线程安全的。2、堆和栈 堆是进程和线程共有的空间,分全局堆和局部堆。全局堆是所有没有分配的空间,局部堆是分配给用户的空间。堆是操作系统在对进程初始化的时候分配的,运行的过程中也可以索要额外的内存。但是运行完毕需要归还给系统,要不然会造成内存溢出。...原创 2021-07-05 19:55:49 · 299 阅读 · 0 评论 -
java面试题(20)sleep、wait、join、yield区别
1、锁池 所有需要竞争同步锁的线程都会放在锁池中,当一个线程获取到同步锁后,其它线程都会放到锁池中等待,当前面的线程释放掉同步锁后,其他线程会竞争同步锁。当其中一个线程获取同步锁后,会进入就绪队列中,等待cpu资源分配。2、线程池 当线程执行wait方法后,会被放到线程池中等待(线程池中线程是不会竞争同步锁的),只有执行notify或者notifyAll发放后,才会进入锁池中竞争同步锁。3、sleep和wait的区别 1、sleep是Thread中的静态方法,wait是Object中的本地方原创 2021-07-05 15:55:30 · 151 阅读 · 0 评论 -
java面试题(19)线程的生命周期?线程有几种状态?
1、线程的状态(1)线程通常有五种状态:创建、就绪、运行、阻塞、死亡;(2)其中阻塞又分为三种: a.等待阻塞:线程执行wait方法,释放cpu资源,JVM会将线程进入等待池中。此时线程无法自动唤醒,需要其它线程执行notify或者notifyAll方法唤醒,wait是objec类的t方法。 b.同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被其它线程所占用,JVM会将该线程放入锁池中等待。 c.其它阻塞:线程执行sleep或者join方法,或者发出I/O请求的时候,会进入等待状态。当原创 2021-07-05 14:57:23 · 189 阅读 · 0 评论 -
java面试题(12)ConcurrentHashMap
原创 2021-06-30 18:42:05 · 41 阅读 · 0 评论 -
java面试题(11)HashMap和HashTable区别
1、区别 (1)HashMap没有用synchronized修饰,HashTable使用了synchronized修饰; (2)HashMap的键和值可以存储null,HashTable的键和值不允许。2、HashMap的底层实现:数组加链表 JDK8开始链表长度大于8,数组长度大于64会转变成红黑树,元素以内部类Node节点存在。 (1)计算key的哈希值,二次哈希值后根据数组长度取模,对应到数组下标; (2)如果没有产生冲突(数组下标没有存入数据),直接将数组存储进去; (3)原创 2021-06-30 14:20:18 · 58 阅读 · 0 评论 -
java面试题(10)ArrayList和linkList区别
1、ArrayList ArrayList基于动态数组,存储在连续的内存当中,适合下标查找(随机访问)。 扩容机制:因为数组长度固定,扩容的时候需要新建数组,并将老数组中的数组复制到新数组中。 插入的时候如果不是尾插方式,需要向后移动数组中的元素,再将数据插入到对应的位置。当插入的方式是尾插的时候,ArrayList效率甚至比LinkList还高。2、LinkList LinkList:基于链表,可以将元素存储在分散的内存当中,适合频繁的删除和插入数据,不适合查询。查询的时候需要用iter原创 2021-06-29 17:16:32 · 130 阅读 · 0 评论 -
java面试题(9)HashCode和equals
1、HashCode介绍 hashCode()方法是获取哈希值,也叫做散列码,它是一个int值,通过哈希值可以确定对象在哈希表中的索引值,从而确定对象所在位置。hashCode()是在jdk中的Object中,所有类都有hashCode()方法。散列表存储的是键值对,它的特点是可以通过键快速确定值,这其中就使用了散列码。(可以快速找到所需对象)2、为什么要有HashCode(以HashSet存储为例说明) HashSet插入对象的时候,首先会通过哈希值判断哈希表的索引处是否有值,如果没有就会假设没原创 2021-06-23 20:02:20 · 198 阅读 · 0 评论 -
java 面试题(8)List和set区别
1、List和Set区别 List有序(是按存储顺序存储的),可以重复,可存储多个null,可以通过下边或者迭代器进行查询; Set无序,不可重复,只能存储一个null,只能通过迭代器查询数据。原创 2021-06-23 19:17:07 · 48 阅读 · 0 评论 -
java面试题(7)接口和抽象类的区别
1、基本回答(0-3年)抽象类中可以有实现类,而接口中的方法只能是public abstract;抽象类中的成员可以是各种各样的,而接口中的成员只能是public static final(即使成员声明的时候没有加上,系统也会默认自动加的)抽象类只能继承一个,接口可以多实现。2、深入回答(3-5年) 接口主要用于约束,约束类必须实现某些方法,而不会深入细节,去注意方法实现的具体方法。而抽象类主要是为了代码的复用,将多个相似的类抽象出共性方法组成一个类,抽象类首先是需要出现子类才能抽象出共性的原创 2021-06-23 19:09:08 · 91 阅读 · 0 评论 -
java面试题(6)重载和重写
1、重载和重写的区别 重载:发生在同一个类中方法名相同,但是参数个数不同、参数顺序不同、参数类型不同,返回值类型和访问修饰符可以不同,发生在编译时。 重写:子类继承父类时候,重写父类方法。方法名和参数列表相同,子类重写的权限访问修饰符要大于父类,返回值小于等于父类,抛出异常范围小于等于父类。如果父类是private修饰的,则子类不能重写该方法。...原创 2021-06-22 17:00:30 · 126 阅读 · 0 评论 -
java面试题(5)String、StringBuffer、StringBuilder
1、String String是final修饰的,不可修改,每次操作产生新的对象。我对这句话是表示质疑的,请看以下代码:带上final之后String类型的引用才是不可改变的!看了很多文章后,总结出来这句话少了俩字:String对象是被final修饰的,不可修改,每次操作都会产生新的对象(被final修饰的是String对象,不是String引用)。2、StringBuffer、StringBuilder 都是在原对象基础上进行修改的,StringBuffer是线程安全的(synchroniz原创 2021-06-22 16:06:03 · 139 阅读 · 0 评论 -
java面试题(4)final
1、简述final作用修饰类的时候,类不可以被继承;修饰方法的时候,方法不可被重写,但是可以重载;修饰变量的时候,变量一旦被赋值就不可以修改;(1)修饰成员变量的时候:需要在声明的时候或者在代码块中赋值;(2)修饰局部变量:在使用之前一定要初始化(系统不会默认初始化)。(3)修饰基本类型数据和修饰引用类型数据:修饰基本类型数据时候一旦初始化后不可被修改;修饰引用类型数据的时候,对象中的数值可以修改。2、为什么局部内部类和匿名内部类只能访问局部final变量? 首先内部类和外部类编原创 2021-06-22 11:50:26 · 142 阅读 · 0 评论 -
java面试题(3) == 和 equals
1、== 和 equals比较 ==比较的是栈中的数据,所以当对比的是基本类型数据的时候,比较的就是内容;对比的是对象的时候,比较的是对象的地址(创建对象的时候,现在栈中创建引用,引用中存储堆中已分配对象的地址); equals:object默认的equals使用还是= =的方法,我么常使用的equals,都是重写后的方法,比如String的equals,重写后的equals比较的是每个字符是否相等,而不是object默认= =的方法。2、面试题 需要注意的一点是 String str原创 2021-06-22 10:26:07 · 137 阅读 · 0 评论 -
java面试题(2)什么是面向对象
1、面向过程与面向对象 面向过程的编程注重点是步骤和过程,面向对象的编程侧重点是对象。举个简单的小例子:用洗衣机洗衣服。 面向过程的编程思想:1、打开洗衣机–>2、放衣服–>3、放洗衣液–>4、清洗–>5、烘干; 面向对象的编程思想:人:打开洗衣机、放衣服、放洗衣液; 洗衣机:清洗、烘干。 面向过程的编程高效,但是复用性低;面向对象的编程则正好相反。2、面向对象的三大特性(1)封装:只提供接口的使用方法,使用者不需要修改和了解方法的具体实现原创 2021-06-21 15:53:42 · 68 阅读 · 0 评论 -
java面试题(1) 自增变量与压栈
-1、一些无聊的话,直接跳过(博主留着自己当日记看) 由于博主跳槽,适应新公司(新公司自身原因,除了要求自身技术外,还需要懂得各种工厂里边的业务)花费了将近半年时间,打乱了自己1-3年深学技术,3-5年深学业务的计划!由于暂时的迷茫了也就没继续更新自己的博客,今天开始准备刷一遍java面试题,学习下新知识,回顾旧知识,温故而知新!迷茫情况下,学习知识总是不会错的。0、尚硅谷的一道面试题 先看一下尚硅谷的一道面试题: 很丢脸的说我第一次算错了,看了看讲解,错的原因是我不理解jvm的计算机制,通原创 2021-06-18 17:22:00 · 100 阅读 · 0 评论