当前位置: 首页 > article >正文

每日速记10道java面试题02

其他面试题

每日速记10道java面试题01-CSDN博客

目录

一、Java 中 String、StringBuffer 和 StringBuilder 的区别是什么?

 二、java的Stringbuilder是怎么实现的?

三、Java 中包装类型和基本类型的区别是什么?

四、接口和抽象类有什么区别?

​编辑 

五、JDK和JRE有什么区别?

六、Java 中 hashCode 和 equals 方法是什么?它们与 ==操作符有什么区别?

七、Java 中的 hashCode 和 equals 方法之间有什么关系? 

八、什么是java中的动态代理?

九、JDK 动态代理和 CGLIB 动态代理有什么区别?

十、java的注解原理是什么?


一、Java 中 String、StringBuffer 和 StringBuilder 的区别是什么?

线程安全:String、StringBuffer
线程不安全:StringBuilder

String是不可变类,底层用final修饰,每次对String进行修改的时候,会生成新的副本,从而占用更多的资源,频繁大量的修改,会造成资源的浪费

StringBuffer为了解决String的可能造成资源浪费问题,底层使用char,新增了append方法来修改字符串,同时各个修改方法加上了sychronized同步锁,所以它是线程安全的,但是需要消耗一定的性能作为代价

StringBuilder是在StringBuffer的基础上,将同步锁给去除掉了,舍弃了线程安全但换来了更高的性能

使用场景:
1、String:适用与少量的修改
2、StringBuffer:修改频率很高,需要保证线程安全的情况下使用
3、StringBuilder:修改频率很高,不需要保证线程安全
细节:由于StringBuffer和StringBuilder底层是数组实现,所以会涉及到扩容的机制,如果在使用时知道大概的数据量,在创建实例时可以给其赋予初始大小,减少扩容次数,提高性能

 二、java的Stringbuilder是怎么实现的?

StringBuilder 内部有一个字符数组,这个数组用来存储字符串。当你开始拼接字符串时,StringBuilder 会先检查这个内部数组是否有足够的空间来存放新的字符串。如果内部数组空间不够,StringBuilder 会自动进行扩容。它会创建一个新的更大的数组,并将旧数组的内容复制到新数组中,然后再加上新的字符串。这个过程叫做动态扩容。

三、Java 中包装类型和基本类型的区别是什么?

1.基本数据类型占用的内存小,效率高,包装数据类型占用的内存大
2.基本数据类型的默认值为0,false,包装数据类型的默认为null
3.基本数据类型如果是局部变量存放在栈中,如果是成员变量存放在堆中,包装数据类型存放在堆中
4.包装数据类型可以用于泛型,基本数据类型不可以用于泛型
5.基本数据类型直接赋值,包装数据类型需要通过new对象
6.基本数据类型使用==比较值,包装数据类型使用==比较内存地址,使用重写后的equals比较值

四、接口和抽象类有什么区别?

 接口是协议,调用方无需关心实现细节,实现方维护底层实现,在实现发生变更时,调用方无需感知;
抽象类是模版,即一些类共有的部分可以抽象出来,提高代码复用,便于子类扩展。

五、JDK和JRE有什么区别?

1.JDK =JRE +开发工具集(例如 Javac,java 编译工具等
2. JRE = JVM + Java SE 标准类库(java 核心类库)
3.如果只想运行开发好的 .class 文件 只需要 JRE 

六、Java 中 hashCode 和 equals 方法是什么?它们与 ==操作符有什么区别?

hashCode: 快速比较两个对象是否相同,hash码不同,肯定不相等。但是hash码相同,也不一定相等。
equals方法:比较两个对象的内容是否相等。通常需要自己实现对象的比较逻辑。
==:如果是引用,比较的是内存地址:如果是基本数据类型,比较的是值。 

七、Java 中的 hashCode 和 equals 方法之间有什么关系? 

这两者的关系主要体现在HashMap和HashSet中,HashMap和HashSet底层都是有数组作为数据结构的,所以在查询的时候会先用hashCode方法去计算获得key的唯一hash值,也就是这个key在数组中所在的位置,然后在这个位置中去使用equals方法去比较具体的属性值是否一致。所以说两个对象的equals()相等,那么他们的hashCode()也必须相等,那是因为hashCode()如果不相等就会导致hashMap和HashSet中存在相同的key值,这显然不符合定义。

八、什么是java中的动态代理?

动态代理是一种在运行时生成代理对象的机制,允许在不修改原始类的情况下,为其方法调用添加额外的行为。
AOP(面向切面编程)是动态代理的一个实际应用,它通过代理为核心业务逻辑添加横切关注点(如日志、事务等)。
在 Java 中,Spring AOP 可以基于 JDK 动态代理或 CGLIB 动态代理来实现。
简单来说,AOP 通过动态代理来实现面向切面的编程。

九、JDK 动态代理和 CGLIB 动态代理有什么区别?

JDK动态代理:基于Java反射,只能代理实现了接口的类。首先通过InvocationHandler接口得到一个切面类,然后利用Proxy根据目标类的类加载器、接口和切面类得到一个代理类。

CGLIB代理:基于字节码技术,可以代理所有对象。首先通过Methodlnterceptor接口得到一个拦截类,new一个enhancer,传入需要代理的类,创建callback方法并设置拦截类,再使用enhancer.create()方法返回一个代理类,同时这个代理类和方法不能被final修饰。

十、java的注解原理是什么?

注解就是一个标记,是给机器看的,就是在类或者方法或属性中设置一些标记,注解本身不影响代码执行,相当于标记一些元数据,注解一些代码,可以生命文档也可以作为切面增强。

 其中@Retention可以说明注解的有效访问,source、class、runtime

@Target可以说明注解应用元素,field、method等。


http://www.kler.cn/a/413885.html

相关文章:

  • 从0开始Linux(34)——进程信号(3)信号保存
  • 泡泡玛特出海,如何走出舒适区
  • webrtc ios h264 硬编解码
  • Vue3+Typescript+Axios+.NetCore实现导出Excel文件功能
  • 并行区块链全解:执行原理、代表项目及技术发展周期
  • 深度学习:自然语言处理
  • JS-06-事件监听
  • MongoDB的SQL注入测试方法
  • ubuntu上安装redis
  • 【C++】7000字介绍map容器和set容器的功能和使用
  • Virtio on Linux
  • css:项目
  • PHP 常量
  • 云计算之kubernetes面试题
  • 基于spring boot开发的理财管理系统设计
  • 算法训练营day16(二叉树03:最大深度,最小深度,完全二叉树节点数量)
  • 湖北移动,以5G-A规模商用“换”出内需新活力
  • SSH远程命令实践:如何打包、压缩并传输服务器文件
  • shell-函数调用进阶即重定向
  • 租辆酷车小程序开发(二)—— 接入微服务GRPC