首页IT科技java基础面试题集合(Java基础面试题突击系列5)

java基础面试题集合(Java基础面试题突击系列5)

时间2025-09-19 11:41:32分类IT科技浏览5263
导读:👩🏻 作者:一只IT攻城狮 ,关注我不迷路...

👩🏻 作者:一只IT攻城狮                 ,关注我不迷路

❤️《java面试核心知识》突击系列                         ,持续更新…

💐 面试必知必会学习路线:Java技术栈面试系列+SpringCloud项目实战学习路线

📝再小的收获x365天都会成就不一样的自己         ,一起学习            ,一起进步                。

一                 、java反射

1                         、定义:

反射机制是在运行时                        ,对于任意一个类             ,都能够知道这个类的所有属性和方法;对于任意个对象        ,都能够调用它的任意一个方法                         。在java中                        ,只要给定类的名字                 ,就可以通过反射机制来获得类的所有信息         。

这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制            。

2        、哪里会用到反射机制?

jdbc就是典型的反射 Class.forName(com.mysql.jdbc.Driver.class);//加载MySQL的驱动类这就是反射                        。如mybatis等框架使用反射实现的             。

反射的核心是获取class对象    ,获取 Class 对象的 3 种方法

1)调用某个对象的 getClass()方法

2)调用某个类的 class 属性来获取该类对应的 Class 对象

3)使用 Class 类中的 forName()静态方法(最安全/性能最好)

更多详情:Java反射

二            、instanceof 关键字的作用

instanceof 严格来说是Java中的一个双目运算符                        ,用来测试一个对象是否为一个类的实例                     ,用法为:

boolean result = obj instanceof Class

其中 obj 为一个对象,Class 表示一个类或者一个接口                    ,当 obj 为 Class 的对象                         ,或者是其直接或间接子类    ,或者是其接口的实现类                ,结果result 都返回 true                         ,否则返回false        。

注意:编译器会检查 obj 是否能转换成右边的class类型         ,如果不能转换则直接报错            ,如果不能确定类型                        ,则通过编译             ,具体看运行时定                        。 int i = 0; System.out.println(i instanceof Integer);//编译不通过 i必须是引用类型        ,不能是基本类型 System.out.println(i instanceof Object);//编译不通过 Integer integer = new Integer(1); System.out.println(integer instanceof Integer);//true //false ,在 JavaSE规范 中对 instanceof 运算符的规定就是:如果 obj 为 null                        ,那么将返回false                 。 System.out.println(null instanceof Object)

三                         、Java 序列化中如果有些字段不想进行序列化                 ,怎么办?

对于不想进行序列化的变量    ,使用 transient 关键字修饰    。

transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时                        ,被 transient 修饰的变量值不会被持久化和恢复                        。transient 只能修饰变量                     ,不能修饰类和方法                     。

四            、&和&&的区别?

&运算符有两种用法:(1)按位与;(2)逻辑与。

&&运算符是短路与运算                    。

逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是 true 整个表达式的值才是 true                         。&&之所以称为短路运算是因为                    ,如果&&左边的表达式的值是 false                         ,右边的表达式会被直接短路掉    ,不会进行运算    。

很多时候我们可能都需要用&&而不是&                ,例如在验证用户登录时判定用户名不是 null 而且不是空字符串                         ,应当写为:username != null &&!username.equals(“                 ”)         ,二者的顺序不能交换            ,更不能用&运算符                        ,因为第一个条件如果不成立             ,根本不能进行字符串的 equals 比较        ,否则会产生 NullPointerException 异常                。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此                         。

五        、3*0.1 == 0.3返回值是什么

false,因为有些浮点数不能完全精确的表示出来         。

在计算机中浮点数的表示是误差的            。所以一般情况下不进行两个浮点数是否相同的比较                        。而是比较两个浮点数的差点绝对值                        ,是否小于一个很小的正数             。如果条件满足                 ,就认为这两个浮点数是相同的        。

六                         、用最有效率的方法计算 2 乘以 8?

2 << 3(左移 3 位相当于乘以 2 的 3 次方    ,右移 3 位相当于除以 2 的 3 次方)                        。

七                、float f=3.4;是否正确?

不正确                 。3.4 是双精度数                        ,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting                     ,也称为窄化)会造成精度损失,因此需要强制类型转换 float f =(float)3.4; 或者写成 float f =3.4F;    。

八    、Java 中的Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

Math.round(11.5)的返回值是 12                    ,Math.round(-11.5)的返回值是-11                        。四舍五入的原理是在参数上加 0.5 然后进行向下取整                     。

九                         、switch 是否能作用在 byte 上                         ,是否能作用在 long 上?

在 Java 5 以前    ,switch(expr)中                ,expr 只能是 byte                    、short、char                     、int。从 Java5 开始                         ,Java 中引入了枚举类型         ,expr 也可以是 enum 类型            ,从 Java 7 开始                        ,expr 还可以是字符串(String)             ,但是长整型(long)在目前所有的版本中都是不可以的                    。

十                        、char 型变量中能不能存贮一个中文汉字?

char 类型可以存储一个中文汉字                         。

因为 Java 中使用的编码是 Unicode(不选择任何特定的编码        ,直接使用字符在字符集中的编号                        ,这是统一的唯一方法)                 ,一 个 char 类型占 2 个字节(16 比特)    ,所以放一个中文是没问题的    。

补充:使用 Unicode 意味着字符在 JVM 内部和外部有不同的表现形式                        ,在 JVM内部都是 Unicode                     ,当这个字符被从 JVM 内部转移到外部时(例如存入文件系统中),需要进行编码转换                。所以 Java 中有字节流和字符流                    ,以及在字符流和字节流之间进行转换的转换流                         ,如 InputStreamReader 和 OutputStreamReader    ,这两个类是字节流和字符流之间的适配器类                ,承担了编码转换的任务;对于 C 程序员来说                         ,要完成这样的编码转换恐怕要依赖于 union(联合体/共用体)共享内存的特征来实现了                         。

十一    、String s = new String(“xyz                         ”);创建了几个字符串对象?

两个对象         ,一个是静态区的        ”xyz            ”            ,一个是用 new 创建在堆上的对象         。

十二                 、如何实现字符串的反转及替换?

可以自己写实现也可以使用 StringBuilder 或者 stringBuffer 的 reverse() 方法            。

示例代码: // StringBuffer reverse StringBuffer stringBuffer = new StringBuffer(); stringBuffer. append("abcdefg"); System. out. println(stringBuffer. reverse()); // gfedcba // StringBuilder reverse StringBuilder stringBuilder = new StringBuilder(); stringBuilder. append("abcdefg"); System. out. println(stringBuilder. reverse());

有一道很常见的面试题是用递归实现字符串反转                        ,代码如下所示:

public static String reverse(String originStr) { if(originStr == null || originStr.length() <= 1) return originStr; return reverse(originStr.substring(1)) + originStr.charAt(0); }

十三                         、怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?

String s1 = "你好"; String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

十四        、阐述 final            、finally                         、finalize 的区别

final:修饰符(关键字)有三种用法:如果一个类被声明为 final             ,意味着它不能再派生出新的子类        ,即不能被继承                        ,因此它和 abstract 是反义词                        。将变量声明为 final                 ,可以保证它们在使用中不被改变    ,被声明为 final 的变量必须在声明时给定初值                        ,而在以后的引用中只能读取不可修改             。被声明为 final 的方法也同样只能使用                     ,不能在子类中被重写        。

finally:通常放在 try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常                    ,这里的代码只要 JVM 不关闭都能执行                         ,可以将释放外部资源的代码写在 finally 块中                        。

finalize:Object 类中定义的方法    ,Java 中允许使用 finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作                 。这个方法是由垃圾收集器在销毁对象时调用的                ,通过重写 finalize()方法可以整理系统资源或者执行其他清理工作    。

十五            、是否可以继承 String 类?

String 类是 final 类                         ,不可以被继承                        。

声明:本站所有文章         ,如无特殊说明或标注            ,均为本站原创发布                     。任何个人或组织                        ,在未征得本站同意时             ,禁止复制        、盗用                         、采集                、发布本站内容到任何网站    、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益        ,可联系我们进行处理                    。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
linux怎么删除整个目录(Linux批量清空当前目录中的日志文件)