首页 > 编程语言 >java常见面试题分析及答案

java常见面试题分析及答案

时间:2023-07-05 15:24:04浏览次数:52  
标签:面试题 java String synchronized 对象 索引 bean 答案 使用

new一个object对象占多少字节
对象头加实例数据 16个字节

java反射的优缺点
Java反射的优点
1.增加程序的灵活性,避免将程序写死到代码里
2.代码简洁,提高代码的复用率,外部调用方便
3.对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法
Java反射的缺点
1.性能问题 使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用反射。
2.使用反射会模糊程序内部逻辑
程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。
3.安全限制
使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题了。
4.内部暴露
由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化

String为什么设计成不可更改
(1)节省空间:在java语言中,为了提高效率和空间使用率,把字符串常量存储在String pool(池)中,这些字符串可以被共享,为了保证一个用户对字符串的修改不会影响到其他用户的使用,String被设计为不可变量。
(2)提高效率:正是由于String会被不同的用户共享,在多线程编程时,String可能会被不同的线程共享,如果把String设计为不可变量,那么它就是线程安全的,就不需要对String进行同步,可以显著提高多线程效率,此外,String会经常被当做 HashMap的key进行存储,也就需要进行计算String的hash值,如果String设计为不可变量,它的hash值也会保持不变,就可以把它的hash值缓存起来,而不需要每次都计算hash值,可以显著的提高效率。
(3)安全因素,由于String会经常被用作参数来使用(例如连接数据库时使用的用户名,密码,读写文件时使用的文件名等)如果String是可变量,黑客就可以通过某种特定的手段对这些参数进行修改,从而修改文件的内容或属性,造成安全隐患,为了安全,Strng被设计为不可变量,那么黑客就无法对字符串参数的内容进行修改。

bean的生命周期
Bean的生命周期包括四个阶段:实例化Instantiation 、属性赋值Populate 、初始化Initalization 、销毁Destruction

spring三级缓存的作用
三级缓存的作用是为了解决spring中Bean依赖注入时发生的循环依赖。如果不需要AOP,那么只需要二级缓存即可实现,如果有AOP,其实二级缓存也能够实现,但是会打破Bean的生命周期,不符合spring的原则,因为需要把AOP对象放入二级缓存中,那么就必须在所有需要AOP处理的Bean对象初始化之前就对Bean对象进行后置处理(生成AOP对象),即使没有发生循环依赖!这并不是spring想看到的,所以spring引入了三级缓存,而且存入的是<beanName, ObjectFactory>结构,ObjectFactory是一个lambda表达式,相当于一个回调函数,当发生循环依赖的时候,会进行lambda表达式的执行,获取到Bean对象或者 AOP代理对象,再将Bean对象或者 AOP代理对象存入二级缓存中,如果之后还有循环依赖指向该对象(类似 A 依赖 B , B 依赖 A和C , C 依赖 A这种情况),就直接从二级缓存里面获取,从而解决了循环依赖。(这里解释了为什么不直接在二级缓存里存放lambda表达式,因为同一个lambda表达式每执行一次,就会生成一个新的代理对象,不能保证单例)

spring里用到的设计模式
(1)工厂模式:Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
(2)单例模式:Bean默认为单例模式
(3)策略模式:例如Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
(4)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
(5)模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate
(6)适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式,Spring MVC中也是用到了适配器模式适配Controller
(7)观察者模式:Spring事件驱动模型就是观察者模式的一个经典应用。
(8)桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库

spring的作用域
一、概述
  spring有五种作用域分别书singleton、prototype、request、session、application
二、详解
  singleton 就是单例类型。创建容器时自动创建一个bean的对象,不管是否使用,都存在了,每次获取到的对象都是同一个对象
  prototype就是一个bean定义对应多个对象实例。prototype是原型类型,在创建容器时并没有实例化,当获取bean的时候才回去创建对象。每次获取到的对象都不是同一个对象。有状态的bean使用prototype,无状态的使用singleton。有状态就是说这个bean实例是保存用户的信息的,一旦用户灭忙,bean生命周期也就结束。无状态是没有特定的用户。即使使用它的用户消亡,依然存在会话池中,依然可以被其他用户调用。
  request、session、application都是在web环境下使用的,我们一般搭配springMVC使用。因为springmvc的前端控制器包含了相关的状态。
  如果没有使用springmvc需要在xml文件里配置一下listener和filter
  request就是请求作用域:就是说每次用到这个bean来处理HTTP请求的时候会创建一个bean实例。请求完成后销毁这个bean
  session是会话作用域:session是服务器和浏览器的一次会话过程,是连续的不是一次请求。session结束后销毁,session中所有http请求共享同一个请求的bean实例
  application全局作用域:是说bean是ServletContext级别的就是说是整个web项目全局共享的。与单例有点像,但是单例是作用在applicationcontext也就是一个容器当中的,一个项目不仅仅只有一个applicationContext。
  Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口。他们都可代表Spring容器,Spring容器是生成Bean实例的工厂,并且管理容器中的Bean。

synchronized的了解
synchronized是JVM内置锁,通过内部对象Monitor(监视器锁)来实现,基于进入与退出monitor对象来实现方法与代码块的同步,监视器锁的实现,最终依赖操作系统的Mutex lock(互斥锁)来实现。
synchronized 主要有3种使用方式,.同步类方法,同步代码块,修饰一个类

SQL优化,什么情况导致索引失效
使用函数或表达式作为 WHERE 子句中的条件,例如使用函数来对列进行操作,例如 TRIM() 或 UPPER()。
这样做会导致索引失效,因为无法直接使用索引进行计算。
在 OR 语句中使用多个条件时,如果其中的一个条件没有索引,则索引可能会失效。
在使用索引时,如果查询返回的数据行数很少,则可能会导致索引失效。因为对于小数据集,扫描整个表比使用索引更快。
对于包含 NULL 值的列,如果没有为该列创建索引,则索引可能会失效。
在联接多个表时,如果使用了子查询,则索引可能会失效。因为子查询可能会阻止优化器使用最佳的执行计划。
如果对列进行了大量的更新、插入或删除操作,则索引可能会失效。因为数据库需要不断更新索引,这可能会导致性能下降。
如果索引的统计信息不准确,则索引可能会失效。统计信息用于帮助优化器确定最佳的查询计划。

联合索引与普通索引对比有什么优势
联合索引优点
可以更快地处理需要同时查询多个列的查询,例如使用WHERE和ORDER BY子句。
联合索引可以减少索引的数量,减少存储空间占用。
在某些情况下,使用联合索引可能比使用单个索引更优秀,因为优化器可以更好地利用索引

SQL执行计划的type有哪些
ALL 全表扫描
INDEX 索引全扫描,MYSQL遍历整个索引来查找匹配的行
RANGE 索引范围扫描,常见于<、<=、>、>=、between等操作符
REF 使用非唯一性索引或者唯一索引的前缀扫描,返回匹配某个单独值的记录行
EQ_REF 相对于ref来说就是使用的是唯一索引,对于每个索引键值,只有唯一的一条匹配记录
CONST,SYSTEM 单表中最多只有一条匹配行,查询起来非常迅速,所以这个匹配行中的其他列中的值可以被优化器在当前查询中当做常量来处理。例如根据主键或者唯一索引进行的查询
NULL MYSQL不用访问表或者索引就直接能到结果

jvm的组成

JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、 Execution engine(执行引擎);两个组件为Runtime data area(运行时数据 区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如: java.lang.Object)来装载class文件到Runtime data area中的method area。 Execution engine(执行引擎):执行classes中的指令。 Native Interface(本地接口):与native libraries交互,是其它编程语 言交互的接口。 Runtime data area(运行时数据区域):这就是我们常说的JVM的内 存。 作用 :首先通过编译器把 Java 代码转换成字节码,类加载器( ClassLoader) 再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方 法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作 系统去执行,因此需要特定的命令解析器执行引擎( Execution Engine),将 字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他 语言的本地库接口(Native Interface)来实现整个程序的功能。

jvm垃圾回收的算法
复制算法,标记-清除算法,标记-整理算法

synchronized和lock的区别
1.synchronized是关键字,Lock是接口;
2.synchronized是隐式的加锁,lock是显式的加锁;
3.synchronized可以作用于方法上,lock只能作用于方法块;
4.synchronized底层采用的是objectMonitor,lock采用的AQS;
5.synchronized是阻塞式加锁,lock是非阻塞式加锁支持可中断式加锁,支持超时时间的加锁;
6.synchronized在进行加锁解锁时,只有一个同步队列和一个等待队列, lock有一个同步队列,可以有多个等待队列;
7.synchronized只支持非公平锁,lock支持非公平锁和公平锁;
8.synchronized使用了object类的wait和notify进行等待和唤醒, lock使用了condition接口进行等待和唤醒(await和signal);
9.lock支持个性化定制, 使用了模板方法模式,可以自行实现lock方法;

什么时候触发full gc
主动调用 System.gc()
此操作建议虚拟机进行垃圾回收。但是,虚拟机会选择性执行。不建议使用此方式管理 JVM 内存。
未设置堆大小
在 JVM 初始化期间分配了一个较小的值(初始堆),随着应用程序的运行,会不断对堆大小进行调整。调整过程中,也会发生 Full GC。建议设置-Xms -Xmx。
老年代空间不足
大对象空间分配、长期存活的对象进入老年代。
空间分配担保失效

redis如何实现多路复用

具体实现方式是Redis采用了select、poll、epoll等系统调用来实现多路复用I/O,Redis会将所有需要监听的socket(包括客户端和服务器端)加入到一个事件集合中,并使用select、poll、epoll等系统调用等待这些socket上是否有I/O事件发生,当有I/O事件发生时,Redis会通过事件处理器将该事件分发到对应的处理器进行处理。在这个过程中,Redis维护了一个事件处理器,它包含了多个事件的处理器,每个事件处理器都是一个函数指针,用于处理特定的事件类型。当某个socket上发生I/O事件时,Redis会根据事件类型调用相应的事件处理器函数进行处理。

Tcp粘包,拆包的原因,怎么解决
因为TCP是面向流,没有边界,而操作系统在发送TCP数据时,会通过缓冲区来进行优化,例如缓冲区为1024个字节大小。
如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题。
如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包。
发送端将每个包都封装成固定的长度,比如100字节大小。如果不足100字节可通过补0或空等进行填充到指定长度;
发送端在每个包的末尾使用固定的分隔符,例如\r\n。如果发生拆包需等待多个包发送过来之后再找到其中的\r\n进行合并;例如,FTP协议;
将消息分为头部和消息体,头部中保存整个消息的长度,只有读取到足够长度的消息之后才算是读到了一个完整的消息;
通过自定义协议进行粘包和拆包的处理。

 

标签:面试题,java,String,synchronized,对象,索引,bean,答案,使用
From: https://www.cnblogs.com/wplei/p/17528612.html

相关文章

  • Java批量操作Excel文件实践
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言|问题背景在操作Excel的场景中,通常会有一些针对Excel的批量操作,批量的意思一般有两种:对批量的Excel文件进行操作。如导入多个Excel......
  • JavaScript
    JS变量//varletconstvar:很少使用,全局作用域let:值可以被修改const:值不能被修改,而且需要在声明时初始化数值console.log('helloworld') //这是我的第一个js代码;letbbb//声明bbb=30//赋值bbb=31//修改console.log(bbb)......
  • java的可选链Optional
    Optional是Jdk1.8提供的一个新类,用以解决null判断问题,作用类似于JavaScript中的可选链例如如下场景:privatevoidgetIsoCode(Useruser){if(user!=null){Addressaddress=user.getAddress();if(address!=null){Countrycount......
  • java 中协变,逆变,不变简单理解
    1.什么是协变、逆变、不变假设有两个类,Dog和Animal,如果用Dog<=Animal表示它俩的继承关系。用f(type)表示类型构造器,一个已知的类型被类型构造器处理后就是一个崭新的类型。协变就是f(Dog)是f(Animal)的子类,即f(Dog)<=f(Animal);逆变就是f(Animal)是f(Dog)的子类,即f(Ani......
  • 【阿里二面面试题】说说你对 Raft 算法的理解?
    博主介绍:✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家✌......
  • JAVA设计模式之建造者模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、......
  • 单线程JavaScript为何如此高效
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址什么是js执行机制JavaScript的执行机制指的是JavaScript代码在运行时的工作方式和顺序。它涉及以下几个关键概念:单线程:JavaScript是一门单线程的编程语言,意味着它只有一个主线程用于执行代码。这意味着JavaScrip......
  • java双冒号写法(Lambda的简写)
    类似这种Person::getName,双冒号写法,是Java8对Lambda表达式的简写常见的简写场景有以下是Java8中方法引用的一些语法:静态方法引用(staticmethod)语法:classname::methodname例如:Person::getAge对象的实例方法引用语法:instance::methodname例如:System.out::println对象的超类方......
  • 面向对象(java)
    一、定义 二、注意事项:一个java文件中最好只写一个类;  三、封装(1)对象代表什么,就得封装对应的数据,并提供数据对应的行为;(2)如果加了static,就是类的变量(类共享),而不是实例变量了;......
  • java运行ubuntu clear命令
    importjava.io.BufferedReader;importjava.io.InputStreamReader;publicclassClearScreen{publicstaticvoidmain(String[]args){try{//执行clear命令Processprocess=Runtime.getRuntime().exec("clear");......