Java面试---基础篇

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是一个可以执行Java字节码的虚拟机进程。
Java源文件被编译成能被Java虚拟机执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。
Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
 
2.JDK和JRE的区别是什么?
Java运行时环境(JRE)。它包括Java虚拟机、Java核心类库和支持文件。
它不包含开发工具(JDK)--编译器、调试器和其他工具。
Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。
 
3.static关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
static关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。
static方法跟类的任何实例都不相关,所以概念上不适用。 
java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。
 
4.是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
 
5.Java支持的数据类型有哪些?什么是自动拆装箱?
Java语言支持的8种基本数据类型是:byte short int long float double boolean char 
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。
比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。 
Java支持的数据类型包括两种:
一种是基本数据类型,包含byte,char,short, boolean ,int , long, float,double;
另一种是引用类型:如String等,其实是对象的引用,JVM中虚拟栈中存的是对象的地址,创建的对象实质在堆中,通过地址来找到堆中的对象的过程,即为引用类型。
自动装箱就是Java编译器在基本数据类型和对应的对象包装类型间的转化,即int转化为Integer,自动拆箱是Integer调用其方法将其转化为int的过程
 
6.==和equals的区别?==比较的是什么?为什么重写equals方法以后,一般要重写hashcode方法?
 
7.什么是值传递和引用传递?
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 
一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递
 
8.抽象类和接口的区别?
抽象类中可以没有抽象方法;
接口中的方法必须是抽象方法;
抽象类中可以有普通的成员变量;
接口中的变量必须是 static final 类型的,必须被初始化 , 接口中只有常量,没有变量。 抽象类只能单继承,接口可以继承多个父接口; 
Java8 中接口中会有 default 方法,即方法可以被实现。
 
9.Java 反射?如何通过反射获取和设置对象私有字段的值?
 
10.Java泛型?
 
11.Java异常处理?
 
12.Java8新特性?
    lambda
    hashmap的优化:引入红黑树
 
13.说一说Lamda表达式优缺点?
 
14.String,StringBuffer和StringBuilder的区别?
a.可变与不可变:
因为有final修饰字符数组,所以可以知道string对象是不可变的。
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串(没有使用final修饰),可知这两种对象都是可变的。
b.运行速度:
StringBuilder > StringBuffer > String
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
String的优化(JDK5时的优化):+拼接时,使用StringBuilder来实现,但每次都会创建一个新的StringBuilder对象
c.线程安全
StringBuilder是线程不安全的,而StringBuffer,String是线程安全的
 
15.final, finally, finalize的区别?
 
 
16.如何判断两个String是否相等?
分别说明什么时候可以使用==,什么时候使用equals
 
17.String是不可变类,有什么好处?
线程安全
 
 
18.什么是字符串池?String str = new String("Cat");会创建几个字符串?
常量池,存在于堆内存中
如果字符串池中没有cat字符串,会在字符串池中创建,并且在堆内存中创建
如果字符串池中已存在,则只在堆内存中创建
 
19.String的intern()方法?
    调用intern方法时,如果池中已经包含一个与该String确定的字符串相同equals(Object)的字符串,则返回该字符串。否则,将此String对象添加到池中,并返回此对象的引用。
 
20.String是线程安全的吗?
    String是不可变类,线程安全
 
21.String是真的不可变吗?
    String底层是由char[] value 字符数组构成
    value 被 final 修饰,只能保证引用不被改变,但是 value 所指向的堆中的数组,才是真实的数据,只要能够操作堆中的数组,依旧能改变数据。而且 value 是基本类型构成,那么一定是可变的,即使被声明为 private,我们也可以通过反射来改变。
    但我们几乎不会使用反射去修改String的值,所以通常认为String类是不可变的
 
 
 
 
 
 
 
 
 
    
 
 
 
原文地址:https://www.cnblogs.com/wangzepu/p/13807335.html