Java面试总结
文章平均质量分 91
Java面试总结系列
路上阡陌
得不高歌失不忧
展开
-
Java多线程基础面试总结(五)
这里只是初步介绍,在后续文章中我会详细介绍,后续文章完成后我会将连接更新到这里。synchronized 翻译成中文是同步的的意思,主要解决的是多个线程之间访问资源的同步性,可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。原创 2023-05-27 08:12:25 · 872 阅读 · 0 评论 -
项目中遇到的一些问题总结(三)
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击方式,攻击者通过伪造用户请求的方式来执行非法操作,从而获取用户的敏感信息或进行恶意操作。攻击者通常会针对某个具体的网站或应用程序进行攻击,攻击方式比较隐蔽,用户难以察觉,常见的攻击方式包括:钓鱼攻击:攻击者通过伪装成信任的网站或应用程序,引诱用户点击链接或下载文件,从而在用户的设备上植入恶意代码。CSRF攻击:攻击者通过伪造用户请求的方式来执行非法操作,例如在用户未授权的情况下转账、修改密码等操作。原创 2023-05-17 08:26:30 · 365 阅读 · 0 评论 -
项目中遇到的一些问题总结(二)
比如在 Web 应用程序中,Session 状态就是一种有状态处理机制,当用户通过浏览器访问服务器后,服务器会创建一个 Session 对象来持久化记录该用户的登录状态等信息,在后续的请求中,服务器可以利用 Session ID 检索对应的 Session 对象,从而实现更加智能的处理。Token机制与Session机制的主要区别在于,Token机制是基于无状态协议的,客户端与服务端的通信是通过请求头部携带Token信息实现的,服务端会验证Token的有效性,而不是存储和管理客户端状态。原创 2023-05-13 08:06:57 · 926 阅读 · 0 评论 -
项目中遇到的一些问题总结(一)
自定义密码校验流程需要实现Spring Security提供的PasswordEncoder接口,并将其注册到Spring容器中。然后在Spring Security的配置中指定使用自定义的PasswordEncoder即可。具体步骤如下:实现PasswordEncoder接口,实现encode()和matches()方法,用于加密和验证密码。将自定义的PasswordEncoder实例注入到Spring容器中,可以使用@Component或@Bean注解。} }原创 2023-05-11 08:20:00 · 783 阅读 · 0 评论 -
synchronized 常见面试题总结
在多线程编程中,有时候需要保证多个线程对某个共享资源(如变量、方法或对象)的访问是互斥的,即同一时刻只能有一个线程访问该资源,其他线程需要等待。这种情况下,就需要使用同步机制来实现线程的同步和互斥。Synchronized是Java提供的一种同步机制,它能够保证在同一时刻只有一个线程能够进入synchronized代码块或方法,从而避免了多个线程同时访问共享资源的问题,保证了线程安全和程序的正确性。原创 2023-05-07 08:42:42 · 1407 阅读 · 0 评论 -
synchronized 关键字基础总结
作用于非静态方法,锁住的是对象实例(this),每一个对象实例有一个锁。作用于静态方法,锁住的是类的 Class 对象,Class 对象全局只有一份,因此静态方法锁相当于类的一个全局锁,会锁所有调用该方法的线程。作用于 Lock.class,锁住的是 Lock 的 Class 对象,也是全局只有一个。作用于 this,锁住的是对象实例,每一个对象实例有一个锁。作用于静态成员变量,锁住的是该静态成员变量对象,由于是静态变量,因此全局只有一个。必须有“对象”来充当“锁”的角色。原创 2023-05-06 08:56:51 · 769 阅读 · 0 评论 -
类加载器和双亲委派模型面试总结
启动类加载器(Bootstrap ClassLoader),使用c++实现,是虚拟机的一部分。其他所有类加载器,使用Java实现,独立于虚拟机,且全部继承自抽象类 java.lang.ClassLoader。每一个类都有一个对应它的类加载器。系统中的 ClassLoader 在协同工作的时候会默认使用双亲委派模型。如果一个类加载器收到了类加载的请求,系统会首先判断当前类是否已经被加载过,已经被加载的类会直接返回,否则才会尝试加载。原创 2023-05-01 08:04:04 · 1019 阅读 · 0 评论 -
Java中几种常量池面试总结
运行时常量池是为了加速Java程序的运行和节省内存资源而设置的。运行时常量池相对于class文件的常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中。总结:运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与字符串常量池中的引用值保持一致。原创 2023-04-29 08:10:09 · 1622 阅读 · 0 评论 -
垃圾收集器面试总结(二)
在以前的分代收集中,新生代的规模一般都比老年代要小许多,新生代的收集也比老年代要频繁许多,那回收新生代中的对象时也面临相同的问题,如果回收新生代时也不得不同时扫描老年代的话,那么Minor GC的效率可能下降不少。垃圾回收的并发标记阶段,gc线程和应用线程是并发执行的,所以一个对象被标记之后,应用线程可能篡改对象的引用关系,从而造成对象的漏标、误标,其实误标没什么关系,顶多造成浮动垃圾,在下次gc还是可以回收的,但是漏标的后果是致命的,把本应该存活的对象给回收了,从而影响的程序的正确性。原创 2023-04-22 07:35:35 · 567 阅读 · 0 评论 -
垃圾收集器面试总结(一)
空间碎片过多时,将会给大对象分配带来很大麻烦,往往会出现老年代还有很大空间剩余,但是无法找到足够大的连续空间来分配当前对象,不得不提前触发一次Full GC。为了解决这个问题,CMS收集器提供了一个-XX:+UseCMSCompactAtFullCollection开关参数(默认就是开启的),用于在CMS收集器顶不住要进行FullGC时开启内存碎片的合并整理过程,内存整理的过程是无法并发的,空间碎片问题没有了,但停顿时间不得不变长。原创 2023-04-21 07:35:40 · 597 阅读 · 0 评论 -
垃圾收集算法面试总结
后续的收集算法都是基于这种思路并对其不足进行改进而得到的。原创 2023-04-20 08:11:29 · 418 阅读 · 0 评论 -
垃圾回收面试总结
虚拟机栈(栈帧中的本地变量表)中引用的对象:每个线程在运行时都有一个虚拟机栈,其中包含了多个栈帧,每个栈帧代表了一次方法调用。栈帧中的本地变量表可以存储基本类型和对象引用,并且在方法执行过程中会动态变化。只要虚拟机栈中的某个栈帧还在执行,那么该栈帧中的本地变量表中引用的对象就是可达的。方法区中的类静态属性引用的对象:类的静态属性存放在方法区中,而且它们的生命周期与类的生命周期相同。如果某个类的静态属性引用了某个对象,那么这个对象就是可达的。原创 2023-04-19 08:31:29 · 714 阅读 · 0 评论 -
Java反射面试总结(二)
解释一下这句话:每次getMethod获取到的Method对象都持有对根对象的引用,因为一些重量级的Method的成员变量(主要是MethodAccessor),我们不希望每次创建Method对象都要重新初始化,于是所有代表同一个方法的Method对象都共享着根对象的MethodAccessor,每一次创建都会调用根对象的copy方法复制一份。因此,每当我们调用同一个类的不同方法时,虽然返回的Method对象是不同的,但是它们都共享着这个根对象的MethodAccessor对象。原创 2023-04-18 07:50:00 · 729 阅读 · 0 评论 -
Java多线程基础面试总结(四)
这里只是初步介绍,在后续文章中我会详细介绍,后续文章完成后我会将连接更新到这里。JDK1.5后新增功能,与采用synchronized相比,lock可提供多种锁方案,更灵活Java中的Lock和synchronized都是用于实现线程同步的机制,但是它们之间有以下几个区别:锁的获取和释放方式不同synchronized关键字是隐式锁,在进入同步代码块或方法时自动获取锁,在退出同步代码块或方法时自动释放锁。而Lock是显式锁,需要手动获取锁和释放锁,分别通过lock()和unlock()方法实现。原创 2023-04-17 08:07:28 · 187 阅读 · 0 评论 -
Java多线程基础面试总结(三)
线程状态是处于BLOCKED或WAITING或TIME_WAITING这三种统称为堵塞状态,堵塞状态下cpu是不会分配时间片的。原创 2023-04-16 07:53:37 · 547 阅读 · 0 评论 -
Java多线程基础面试总结(二)
采用接口能够更好的实现数据共享。线程的启动需要Thread类的start方法,如果采用继承的方式每次新建一个线程时,每个新建线程的数据都会单独的存在线程内存中,这样每个线程会单独的操作自己线程的数据,不能更好的实现线程之间的数据共享。Java的设计是单继承的设计,如果使用继承Thread的方式实现多线程,则不能继承其他的类,而如果使用实现Runnable接口或Callable接口的方式实现多线程,还可以继承其他类。线程类已经继承了Thread类,所以不能再继承其他的类。原创 2023-04-15 08:22:44 · 657 阅读 · 0 评论 -
Java多线程基础面试总结(一)
线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。原创 2023-04-14 08:26:17 · 673 阅读 · 0 评论 -
Java 对象的创建过程面试总结
执行完上面四个步骤后,从虚拟机的角度来看,一个新对象已经产生了,但是从Java程序的角度来看,对象的创建才刚刚开始,init()方法还没有执行,所有的字段都还是零值,所以,一般来说,执行完new指令后会接着执行init方法,将对象按照程序员的需求来进行初始化,这样一个真正可用的对象才算完全产生出来。初始化零值之后,虚拟机需要对对象头进行必要的设置,例如这个对象是哪个类的实例,如何才能找到这个类的元数据信息,对象的哈希码,对象的GC分代年龄、锁标志等信息,这些信息会存放到对象头中。原创 2023-04-13 08:13:41 · 706 阅读 · 0 评论 -
Java注解面试总结
Java 枚举是一种用于定义常量的数据类型。它是一组具有命名值的特殊类,可以将其视为一种“类型安全”的枚举设计模式。Java 枚举使代码更具可读性和可维护性,因为它们避免了一些常见的错误,例如大小写拼写错误和非法输入值。一个 Java 枚举类由一个或多个枚举常量组成,每个枚举常量都有一个名称和值。枚举常量通常用大写字母表示,并用逗号分隔。RED,GREEN,BLUE在这个例子中,我们定义了一个名为ColorREDGREEN和BLUE。这些常量都是Color类的实例。可以通过调用Color.RED。原创 2023-04-12 08:21:07 · 614 阅读 · 0 评论 -
Java反射面试总结(一)
Java的反射是指在程序运行时,对于任意一个类,都可以获取到这个类的所有属性和方法,并能够对其进行操作。通过反射机制,可以在程序运行时动态地创建对象、调用方法、获取属性值等。反射可以帮助我们更轻松地实现一些复杂的功能,但也会带来一些性能上的损失。获取Class对象:通过反射可以动态地获取类对象,即Class对象。Class对象是Java运行时系统中的一个重要概念,每个类都有一个与之对应的Class对象,通过Class对象可以获取类的所有信息。// 获取String类的Class对象。原创 2023-04-11 08:12:47 · 941 阅读 · 0 评论 -
算法练习随记(五)
做题时很少能够立刻看出思路,其实这道题我之前也刷到过类似的,但是今天做,其实还是很懵逼,甚至于一开始连题都读不懂,如果是以前的话,我可能会绝望,但是现在,被打击习惯了,脸皮也就厚一点了,实在不懂,就看看题解,然后自己去理解,再自己写出来。希望你看到这里,能够缓解一下自己的情绪,至少,这种迷茫无力感觉不是只有你一个人有,至少,我现在还是这样。我说这些不是劝退大家,更不是宣泄自己的负能量,这是不可能的,这不是我写博客的初衷,我只是想和大家说一说,可能很多人都会遇到我这种情况,也处在迷茫中。原创 2023-04-07 08:35:49 · 557 阅读 · 0 评论 -
Java面试总结(十四)
这里就不对上面的字节码进行详细注释了,7 这个位置的 ldc 命令不会在堆中创建新的字符串对象“abc”,这是因为 0 这个位置已经执行了一次 ldc 命令,已经在堆中创建过一次字符串对象“abc”了。ldc 命令用于判断字符串常量池中是否保存了对应的字符串对象的引用,如果保存了的话直接返回,如果没有保存的话,会在堆中创建对应的字符串对象并将该字符串对象的引用保存到字符串常量池中。并且,字符串常量拼接得到的字符串常量在编译阶段就已经被存放字符串常量池,这个得益于编译器的优化。原创 2023-04-06 08:07:34 · 534 阅读 · 0 评论 -
Java类加载过程面试总结
Java 虚拟机一般使用 Java 类的流程为:首先将开发者编写的 Java 源代码(.java文件)编译成 Java 字节码(.class文件),然后类加载器会读取这个 .class 文件,并转换成 java.lang.Class 的实例。有了该 Class 实例后,Java 虚拟机可以利用 newInstance 之类的方法创建其真正对象了。原创 2023-04-05 09:15:50 · 519 阅读 · 0 评论 -
Java面试总结(十三)
/... }//... }//... }我们知道被 final 关键字修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是基本数据类型则值不能改变,修饰的变量是引用类型则不能再指向其他对象。因此,final 关键字修饰的数组保存字符串并不是 String 不可变的根本原因,因为这个数组保存的字符串是可变的(final 修饰引用类型变量的情况)。保存字符串的字符数组被 final 修饰且为私有,并且 String 类没有提供/暴露修改这个字符数组的方法;原创 2023-04-04 13:40:48 · 500 阅读 · 0 评论 -
JVM内存区域面试详解
在Java源文件被编译成字节码文件时,所有的变量和方法引用都作为符号引用(Symbilic Reference)保存在class文件常量池中,当一个方法需要调用其他方法时,需要将常量池中指向方法的符号引用转换为其在内存地址中的直接引用,动态链接的作用就是为了将符号引用转换为调用方法的直接引用。本地方法栈和虚拟机栈所发挥的作用非常相似,它们之间的区别是 Java 虚拟机栈为虚拟机执行 Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的本地(Native)方法服务。原创 2023-04-03 08:28:16 · 302 阅读 · 0 评论 -
Java面试总结(十二)
异常被抛出后,JVM会在当前方法中查找匹配的异常处理器进行处理,如果当前方法没有找到匹配的异常处理器,JVM会递归地查找当前方法的调用方法,并在调用方法中进行处理,直到找到匹配的异常处理器。如果在当前方法的调用堆栈中找不到任何匹配的异常处理器,则异常将继续向调用方传递,直到找到可以处理异常的异常处理器或将异常传递到程序的顶层,这时程序将终止并输出异常信息。在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给 JVM,该异常对象包含异常名称,异常描述以及异常发生时应用程序的状态。原创 2023-04-01 08:48:35 · 423 阅读 · 0 评论 -
Java泛型面试总结
泛型是一种语法糖,泛型这种语法糖的基本原理是类型擦除。Java中的泛型基本上都是在编译器这个层次来实现的,也就是说:**泛型只存在于编译阶段,而不存在于运行阶段。**在编译后的 class 文件中,是没有泛型这个概念的。类型擦除:使用泛型的时候加上的类型参数,编译器在编译的时候去掉类型参数。我们定义了一个泛型类,定义了一个属性成员,该成员的类型是一个泛型类型,这个 T 具体是什么类型,我们也不知道,它只是用于限定类型的。原创 2023-03-31 09:48:58 · 199 阅读 · 0 评论 -
Java序列化面试总结
在进行反序列化时,JVM 会把传来的字节流中的serialVersionUID 与本地相应实体(类)的 serialVersionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidClassException)。transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。原创 2023-03-30 08:17:03 · 356 阅读 · 0 评论 -
Java面试总结(十一)
浅拷贝会在堆上创建一个新的对象(区别于引用拷贝),但如果对象内部有有引用类型的属性,会直接复制内部对象的引用地址,即原对象和拷贝对象共用一个内部对象;深拷贝会完全复制整个对象,包括这个对象的内部对象。简单来说,引用拷贝就是两个不同的引用指向同一个对象。也就是说引用拷贝不会再堆上创建新的对象,而是直接复制原对象的对象引用。不可变对象指对象一旦被创建,状态就不能再改变,任何修改都会创建一个新的对象,如 String、Integer及其它包装类。不可变对象最大的好处是线程安全。原创 2023-03-28 08:11:36 · 285 阅读 · 0 评论 -
Java面试总结(十)
这里用我的理解解释一下:A 线程准备删除锁,首先 A 线程获取锁持有信息,并进行判断,判断通过后 A 线程正准备删除,此时,A 线程的锁失效了,而 B 线程刚好获取锁成功,A 线程继续删除,此时删除的已经是 B 线程的锁,因为 A 线程已经完成了获取所持有信息,并通过了判断,所以即使此时所持有者信息应为 B 线程,但是 A 线程也可以成功删除。例如,返回1的切面会先于返回2的切面执行。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。原创 2023-03-26 08:02:49 · 371 阅读 · 0 评论 -
Java面试总结(九)
它是 spring 框架核心 IoC 的具体实现。我们的程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。IoC 解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用持久层的方法。那这种业务层和持久层的依赖关系,在使用 spring 之后,就让 spring 来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。原创 2023-03-22 08:07:15 · 237 阅读 · 0 评论 -
Java面试总结(四)
synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。synchronized 修饰的方法并没有 monitorenter 指令和 monitorexit 指令,取得代之的确实是 ACC_SYNCHRONIZED 标识,该标识指明了该方法是一个同步方法。不过两者的本质都是对对象监视器 monitor 的获取。原创 2023-03-04 08:40:09 · 423 阅读 · 0 评论 -
Java面试总结(一)
函数式编程的另一个特点是高阶函数,即可以接受函数作为参数或返回函数的函数。Java EE 则是在 Java SE 的基础上构建的,是针对企业应用程序的扩展版本,提供许多专门的API和开发工具,例如用于Web服务的JAX-WS、用于消息队列的JMS、用于事务的JTA、用于持久化的JPA等等。对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。原创 2023-02-28 09:17:36 · 217 阅读 · 0 评论 -
Java面试总结(二)
lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码,简化编程。通俗的说,lombok可以通过注解来标示生成getter settter等代码,简便我们的开发。这个问题我不太理解要怎么回答,是直接说使用标签和标签确定要引入的依赖,使用标签确定要引入的版本吗?get/set方法,无参/有参构造方法,toString()方法,equals()方法,hashCode()方法。如果想要详细了解这个问题,可以参考这篇文章——如果想要详细了解这个问题,可以参考这篇文章——详细使用,可以参考这篇文章——原创 2023-03-01 10:37:28 · 149 阅读 · 0 评论 -
Java面试总结(八)
/... }//... }//... }我们知道被 final 关键字修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是基本数据类型则值不能改变,修饰的变量是引用类型则不能再指向其他对象。因此,final 关键字修饰的数组保存字符串并不是 String 不可变的根本原因,因为这个数组保存的字符串是可变的(final 修饰引用类型变量的情况)。String 真正不可变有下面几点原因:保存字符串的数组被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。原创 2023-03-16 08:09:39 · 251 阅读 · 0 评论 -
Java面试总结(五)
Spring是java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量型代替品,无需开发重量级的Enterprise JavaBean (EJB),Spring为企业级java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的java对象(Plain Old java Object,POJO)实现了EJB的功能。TCP 提供可靠的传输服务,TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。原创 2023-03-08 08:08:53 · 322 阅读 · 0 评论 -
Java面试总结(三)
使用场合:堆内存规整(即没有内存碎片)的情况下。实现原理:将用过的内存都整合到一边,没有用过的内存放到另一边,中间有一个分界指针,当需要为新对象分配内存空间时,只需要将分界指针向没有用过的内存一侧移动对象内存大小位置即可。原创 2023-03-02 08:24:46 · 202 阅读 · 0 评论 -
Java面试总结(七)
数据库返回的不是分页结果,而是全部数据,然后再由程序员通过代码获取分页数据,常用的操作是一次性从数据库中查询出全部数据并存储到List集合中,因为List集合有序,再根据索引获取指定范围的数据。分页插件的基本原理就是根据 mybatis 提供的插件接口,自定义分页插件,在插件的拦截方法内拦截执行的 sql,然后重写 sql,根据 dialect 方言, 添加对应的物理分页语句和物理分页参数。左值是对应内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。原创 2023-03-14 12:29:00 · 297 阅读 · 0 评论 -
Java面试总结(六)
线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。原创 2023-03-11 07:59:35 · 298 阅读 · 0 评论