Java面试题基础,java高级面试题及答案
如何解决写爬虫IP受阻的问题?立即使用。
面试问题如下:
(相关面试问题推荐:java面试问答)
1、String s = new String("xyz");创建了几个StringObject?是否可以继承String类?
两个或一个都有可能。“xyz”对应于一个对象,该对象放在字符串常量缓冲区中。常量“xyz”是缓冲区中的一个,不管它出现多少次。每次写入新字符串时,都会创建一个新对象,该对象使用常量“xyz”对象的内容来创建一个新的String对象。
如果以前使用过“xyz ”,则不会在此处创建“xyz”。就从缓冲区拿吧。这时,一个StringObject已创建;但是如果 xyz 以前没有被使用过,那么一个对象将被创建并放入缓冲区,在这种情况下它将创建两个对象。至于String类是否继承,答案是否定的,因为String默认用final修饰,不能继承。
2、String和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,可以存储和操作字符串,即包含多个字符的字符数据。此String类提供了一个值不能更改的字符串。并且可以修改这个StringBuffer类提供的字符串。当你知道字符数据将要改变时,你可以使用StringBuffer。通常,可以使用StringBuffers动态构造字符数据。
3、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
对于以下代码:
字符串s1= a
字符串s2=s1 b
字符串s3= a b
system . out . println(S2== ab );
system . out . println(S3== ab );第一条语句的打印结果为假,第二条语句的打印结果为真。这说明javac编译可以优化字符串常量直接加法的表达式,不需要等到运行时再执行加法操作。而是在编译时去掉加号,直接编译成连接这些常量的结果。
标题中的第一行代码是编译器在编译时优化的,相当于直接定义了一个字符串“abcd”。因此,上面的代码应该只创建一个字符串对象。编写下面两行代码,
String s= a b c d
system . out . println(s== ABCD );最终打印出来的结果应该是真实的。
4、try {}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?
我们知道finally{}中的语句是一定会被执行的,所以这个可能在return之前正常脱口而出,return之后这个方法可能就出来了。天知道它去了哪里,但应该在返回中途执行得更准确。请查看以下程序代码的运行结果:
公共类测试{
公共静态void main(String[]args) {
System.out.println(newTest()。test());
}
静态int测试()
{
intx=1;
尝试
{
returnx
}
最后
{
x;
}
}
}
-实施的结果-。
运行1的结果是1。为什么?主函数调用子函数并得到结果的过程就像主函数准备一个空罐子。当子函数想要返回结果时,它首先将结果放入jar中,然后将程序逻辑返回给主函数。所谓返回,就是子函数说,我不运行了,你可以继续运行主函数。一点结果都没有。结果在说这话之前就被放进罐子里了。
(视频教程推荐:java课程)
5、final, finally, finalize的区别。
Final用于声明属性、方法和类,分别表示属性不可变、方法不可重写和类不可继承。类访问局部变量,局部变量必须定义为最终类型。
Finally是异常处理语句结构的一部分,这意味着总是执行。
Finalize是Object类的一个方法。垃圾收集器执行时会调用被收集对象的这个方法,这个方法提供垃圾收集时可以覆盖其他资源回收,比如关闭文件等。但是,JVM不保证总是调用这个方法。
6、运行时异常与一般异常有何异同?
它是指异常程序运行过程中可能出现的异常状态。运行时异常是指虚拟机正常运行时可能遇到的异常,是一种常见的运行错误。Java编译器要求方法必须声明抛出可能的非运行时异常,但不要求声明抛出未捕获的运行时异常。
7、error和exception有什么区别?
错误表示在不可能但困难的情况下,恢复不是一个严重的问题。比如内存溢出。期望程序处理这样的情况是不可能的。异常表明存在设计或实现问题。也就是说,如果程序正常运行,就永远不会发生。
8、简单说说Java中的异常处理机制的简单原理和应用。
异常是指java程序运行时(未编译)出现的异常情况或错误,与现实生活中的事件非常相似。现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示。Java使用面向对象的方法来处理异常,它将程序中发生的每一个异常封装到一个对象中来表示,其中包含异常信息。
Java异常被分类,不同类型的异常由不同的Java类表示。所有异常的根类都是java.lang.Throwable,从Throwable派生出两个子类:
而错误异常,错误意味着应用程序本身无法克服和恢复的严重问题。程序只崩溃,比如内存溢出、线程死锁等系统问题。
异常表示程序可以克服和恢复的问题,分为系统异常和普通异常:
系统异常是软件本身的缺陷导致的问题,也就是软件开发人员考虑不周导致的问题。软件用户无法克服和恢复这个问题,但在这个问题下,软件系统仍然可以运行或挂起,例如数组脚本越界(ArrayIndexOutOfBoundsException)、NullPointerException(NullPointerException)和类转换异常(ClassCastException);
普通异常是运行环境变化或异常导致的问题,是用户可以克服的问题。比如断网,硬盘空间不够。出现这种异常后,程序应该不会死亡。
Java为系统异常和普通异常提供了不同的解决方案。编译器强制try处理普通异常.通过throws声明catch或throw到上层调用方法,所以普通异常也叫检查异常,而系统异常可以处理也可以不处理。因此,编译器不会强制try处理它们.catch或throws声明,所以系统异常也称为未检查异常。
(推荐教程:java入门)
9、Java 中堆和栈有什么区别?
JVM中的堆和栈属于不同的内存区域,有不同的用途。堆栈通常用于保存方法框架和局部变量,而对象总是在堆上分配。栈通常比堆小,并且不在多个线程之间共享,而堆由整个JVM的所有线程共享。
Stack:函数中定义的一些基本类型的变量和对象的引用变量都分配在函数的堆栈内存中。当一个变量在代码块中定义时,Java在堆栈中为这个变量分配内存空间。当超出变量的作用域时,Java会自动释放为该变量分配的内存空间,可以立即用于其他用途。
堆:堆内存用于存储new创建的对象和数组。堆中分配的内存由Java虚拟机的自动垃圾收集器管理。在堆中生成数组或对象后,还可以在堆栈中定义一个特殊的变量,使这个变量在堆栈中的值等于数组或对象在堆内存中的第一个地址,堆栈中的这个变量成为数组或对象的引用变量。稍后,您可以使用堆栈中的引用变量来访问堆中的数组或对象,引用变量相当于数组或对象的名称。
10、能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?
我们可以强制转换,但是在Java中,int是32位,而byte是8位,所以如果强制转换,int类型的高24位将被丢弃,因为byte类型的范围是-128到127。以上是java高频基础面试题——(二)的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。