Java面试基础(二)

1、String,StringBuffer以及StringBuilder的区别

String是不可变类,每次操作都会产生新的对象,StringBuffer和StringBuilder是可变的,前者是线程安全的,后者是线程不安全的,所以后者具有速度优势,推荐使用StringBuilder

如果要操作少量的数据用 String;

多线程操作字符串缓冲区下操作大量数据 StringBuffer;

单线程操作字符串缓冲区下操作大量数据 StringBuilder。

2、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

一个,先连接,再创建字符串,相当于直接定义一个"abcd"字符串

字符串相加:先连接,在常量池找,找不到就创建对象

字符串变量相加,先在常量池开一个空间,在连接创建新的对象

3、try {}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?

会,return中间

try里面的i : 1

进入finally...

fianlly里面的i : 2

结果: 1


public class Test {

    public static void main(String[] args) {
        System.out.println("结果: " + new TestC().test());//5
    }
    
    static int test(){
        int i = 1;
        try {
            System.out.println("try里面的i : " + i);// 1
            return i;//2
        }finally{
            System.out.println("进入finally...");// 3
            ++i;
            System.out.println("fianlly里面的i : " + i); //4
        }
    }
}

程序执行顺序为:1  2  3  4  2  5

4、final, finally, finalize的区别。 

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,JVM执行可恢复对象的finalize方法时,此对象可以重新变为可达状态,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。但是JVM不保证此方法总被调用

5、运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

6、error和exception有什么区别?

error 表示恢复不是不可能但很困难的情况下的一种严重问题,是一种错误,比如说内存溢出。不可能指望程序能处理这样的情况。exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

7、简单说说Java中的异常处理机制的简单原理和应用。

8、Java 中堆和栈有什么区别?

 JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

        栈:在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。

        堆:堆内存用来存放由 new 创建的对象和数组,动态的分配内存大小,速度慢,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。

9、能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?

可以强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化,int 类型的高 24 位将会被丢弃,因为byte 类型的范围是从 -128 到 128。

10、

11、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?

a.hashCode()求对象a的hash值,a.equals(b)求两个对象相等,首先会比较他的hash值

equals相等两个对象,则hashcode一定要相等。但是hashcode相等的两个对象不一定equals相等。

12、字节流与字符流的区别

底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进行写入。字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,这为我们向IO设备写入或读取字符串提供了一点点方便。

13、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。

14、描述一下JVM加载class文件的原理机制?

JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

15、heap和stack有什么区别。

栈内存存放基本数据类型变量,自动分配,内存小,速度快,先进后出,堆存放数组和对象,内存大,需要申请内存

16、GC是什么?为什么要有GC?

garbage collection,垃圾回收,Java不像C++中有析构函数,Java需要手动垃圾回收,内存如果不回收,那么可能会不够用

17、垃圾回收的优点和原理。并考虑2种回收机制。

垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

        回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

18、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。

        程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。不一定会马上执行回收内存

19、Java 中,throw 和 throws 有什么区别

throw 用于抛出 java.lang.Throwable 类的一个实例化对象,意思是说你可以通过关键字 throw 抛出一个Exception,如:
throw new IllegalArgumentException(“XXXXXXXXX″)

        而throws 的作用是作为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。Java 中,任何未处理的受检查异常强制在 throws 子句中声明。

20,java中会存在内存泄漏吗,请简单描述。

内存泄露是指一个不再被程序使用的对象或变量一直被占据在内存中。

java中有垃圾回收机制,它可以保证当对象不再被引用的时候,对象将自动被垃圾回收器从内存中清除掉。

        由于Java使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达,那么GC也是可以回收它们的。

        java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。

发布了10 篇原创文章 · 获赞 0 · 访问量 88

猜你喜欢

转载自blog.csdn.net/qq_22193699/article/details/100667749