版权声明:欢迎转载 https://blog.csdn.net/qq_37875585/article/details/89333382
1. 谈谈你对Java平台的理解?“Java是解释执行”,这句话正确吗?
- Java本身是一种面向对象的语言,最显著的特性有两个方面:
- 一是所谓的“书写一次,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力
- 另外就是垃圾收集(GC, Garbage Collection),Java通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收
- 我们日常会接触到JRE(Java Runtime Environment)或者JDK(Java Development Kit),他们区别如下:
- JRE,也就是Java运行环境,包含了JVM和Java类库,以及一些模块等
- JDK可以看作是JRE的一个超集,提供了更多工具,比如编译器、各种诊断工具等
- 如果需要运行 Java 程序,只需安装 JRE 就可以了,如果需要编写 Java 程序,需要安装 JDK
- 对于“Java是解释执行”这句话,这个说法不太准确。我们开发的Java的源代码,首先通过Javac编译成为字节码(bytecode),然后,在运行时,通过Java虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。
2. “==”和“equals”的区别?
- == 对于基本类型来说是值比较,对于引用类型来说是比较的是引用
- equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等,把它变成了值比较,所以一般情况下 equals 比较的是值是否相等
- 两个对象的 hashCode() 相同,equals() 不一定 true,如:
结果:String str1 = "通话"; String str2 = "重地"; System.out.println("str1:" + str1.hashCode()); System.out.println("str2:" + str2.hashCode()); System.out.println(str1equals(str2));
str1:1179395 str2:1179395 false
3. 谈谈final、finally、finalize有什么不同?
- final可以用来修饰类、方法、变量,分别有不同的意义:
- final修饰的类叫最终类,该类不能被继承,
- final修饰的方法不能被重写(override)
- final修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改
- finally是Java保证重点代码一定要被执行的一种机制。我们可以使用try-finally或者try-catch-finally来进行类似关闭JDBC连接、保证unlock锁等动作
- finalize是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收finalize机制现在已经不推荐使用,并且在JDK 9开始被标记为deprecated,Java平台目前在逐步使用java.lang.ref.Cleaner来替换掉原有的fnalize实现
- 关于finally,列几个finally不会被执行的情况:
- try-cach异常退出。
try{ system.exit(1) }fnally{i print(abc) }
- 无限循环
try{ while(ture){ print(abc) } }finally{ print(abc)
- 线程被杀死
当执行try,finally的线程被杀死时。finally也无法执行 - 总结:
- 不要在finally中使用return语句
- finally总是执行,除非程序或者线程被中断
- try-cach异常退出。
4. Java 中操作字符串都有哪些类?它们之间有什么区别?
- Java 中操作字符串的类有:String、StringBuffer、StringBuilder
- String 和 StringBuffer、StringBuilder 的区别在于:
- String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象
- StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String
- StringBuffer 和 StringBuilder 最大的区别在于:
- StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的
- StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
- 总结:
- 在字符串内容不经常发生变化的业务场景优先使用String类。例如:常量声明、少量的字符串拼接操作等。如果有大量的字符串内容拼接,避免使用String与String之间的“+”操作,因为这样会产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)
- 在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程环境下,建议使用StringBufer,例如XML解析、HTTP参数解析与封装
- 在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在单线程环境下,建议使用StringBuilder,例如SQL语句拼装、JSON封装等
5. abstract class和interface有什么区别?
- 含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象
- abstract class类中定义抽象方法必须在具体子类中实现
- 如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型
- 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final
- .接口是否可以继承接口?抽象类是否可以实现(implements)接口? 抽象类是否可以继承具体类?
- 接口可以继承接口,可以继承多个接口
- 抽象类可以实现接口,可以实现多个接口
- 抽象类可以继承具体类,但只能继承一个类
6. GC是什么?GC的作用?
- GC是垃圾回收的意思
- Java提供的GC功能可以自动监测回收不被引用的对象,释放其占用的内存
- 垃圾收集器会自动进行管理
- 如果要请求垃圾收集,可以调用下面的方法之一:System.gc()或者Runtime.getRuntime().gc(),这些方法会通知GC尽快进行内存垃圾回收
- 在对象使用以后要及时释放其引用,有利于垃圾回收,可以有效的防止内存泄露
7. Overload(重载)和Override(重写)的区别?
- 重写必须继承,重载不用
- 重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同
- 重写的方法修饰符大于等于父类的方法,重载和修饰符无关
- 重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常
8. 静态变量和实例变量的区别?
- 在语法定义上的区别:
- 静态变量前要加static 关键字,而实例变量前则不加。
- 在程序运行时的区别:
- 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
- 静态变量不属于某个实例对象,而是属于类,所以也称为类变量。
- 实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
9. 面向对象的特征有哪些方面?
- 面向对象的三大特性是:封装,继承,多态
- 所谓封装,也就是把客观事物抽象封装成类。封装是面向对象的特征之一。
- 简单的说,一个类就是一个封装了数据以及操作这些数据的算法。
- 对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
- 所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。
- 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
- 子类是对父类功能的扩展
- 实际开发中父类往往是从子类泛化而来,父类中的属性和方法是从子类中抽象来的。
- 所谓多态就是指一个父类具体子类实例的相同方法执行出不同表现。
- 多态机制使具有不同对象可以共享相同的外部接口方法。
- 这意味着,可以通过相同的方式调用具体对象功能不同方法。
- 多态的表现形式:重写和重载,向上造型
10. BIO、NIO、AIO 有什么区别?
- BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
- NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
- AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。