Java 基础常见面试题

Java 基础常见面试题 第一次写博客 记录一下

1、什么是JVM?为什么成JAVA为跨平台的编程语言?
Java虚拟机是一个可以执行Java字节码的虚拟机进程。每个Java源文件被编译成能被Java虚拟机执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译,不同平台的JVM是不同的。但这些JVM遵循着相同的标准,即:只要是标准的.class文件,就可以在不同的JVM上运行,而且运行的效果相同。这样,就实现了所谓的“一次编程到处使用”。

2、JDK和JRE的区别是什么?

JDK(Java Development Kit)即为Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。开发工具如:用于编译java程序的javac命令、用于启动JVM运行java程序的java命令、用于生成文档的javadoc命令以及用于打包的jar命令等等
JRE(Java Runtime Environment)即为Java运行环境,提供了运行Java应用程序所必须的软件环境,包含有Java虚拟机(JVM)和丰富的系统类库。系统类库即为java提前封装好的功能类,只需拿来直接使用即可,可以大大的提高开发效率。

3、”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
static关键字可以修饰成员变量,它所修饰的成员变量不属于对象的数据结构,而是属于类的变量,通常通过类名来引用static成员。
当创建对象后,成员变量是存储在堆中的,而static成员变量和类的信息一起存储在方法区, 而不是在堆中,一个类的static成员变量只有“一份”(存储在方法区),无论该类创建了多少对象。
java中的private方法不能被重写,在java中所有的private方法默认都是final的,即不可继承,所以子类继承父类时,父类的private方法不能被继承,即使在子类中有一个同名方法,也不属于重写,子类这个同名方法是属于子类自己的方法.
Java中static方法不能被覆盖,因为方法覆盖(重写)是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例对象都不相关,所以概念上不适用。

4、是否可以在static环境中访问非static变量?

不可以,static变量在Java中是属于类的,当类被Java虚拟机载入的时候,会对static变量进行初始化分配内存区域,在方法区,而非静态变量和方法在new对象时才会被分配内存区域,他们的分配时间不一样,这个时候要访问非静态变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

5、Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。
重载:编译期绑定,根据参数变量类型判断调用哪个方法.
重写:运行期绑定,根据引用类型变量所指向的实际对象类型来调用方法.

6、Java支持多继承么?
Java类不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。但是接口可以继承多个接口

7、List,Set,Map都继承了Conllection吗?他们有什么区别?
List,Set是,Map不是。 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java JDK不能提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的"子接口",如:List和Set。
Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当做一组key集合,一组value集合,或者一组key-value映射。
List特点:元素有序可重复
Set特点:元素无序不可重复
Map特点:元素按键值对存储,key和value键值对,无放入顺序

8、servlet生命周期?
共四个阶段:
1.实例化:在第一次访问或启动tomcat时,tomcat会调用此默认构造器实例化servlet
2.初始化:tomcat在实例化此servlet后,会立刻调用init方法初始化servlet
3.就绪:容器收到请求后会调用servlet的service方法来处理请求
4.销毁:容器依据自身算法删除servlet对象,删除前会调用destroy方法
其中实例化,初始化和销毁只执行一次,service方法执行多次。

9、什么是cookie?session和cookie的区别?
Cookies是一种能够让网站服务器把少量数据储存到浏览器中,或是从客户端的硬盘读取数据的一种技术。它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

10、java中equals和的区别?
比较基本数据类型时比较的时值是否相等,比较引用类型时比较的是对象的地址值是否相同,是否是同一对象。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String(“foo”);
String b=new String(“foo”);
两条new语句创建了两个对象,然后用a/b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a
b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
重写后的equals和
用法相同。

11、final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。

12、throw和throws的区别?
throw是在代码块内的,即在捕获方法内的异常并抛出时用的,则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛
throws是针对方法的,即将方法的异常信息抛出去,通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
可以理解为throw是主动(在方法内容里我们是主动捕获并throw的),而throws是被动(在方法上是没有捕获异常进行处理,直接throws的)
例子:
public void str2int(String str) throws Exception { //这里将得到的异常向外抛出
try {
System.out.println(Integer.parseInt(str));

} catch(NumberFormatException e) {
//TODO 这里可以做一些处理,处理完成后将异常报出,让外层可以得到异常信息
throw new Exception(“格式化异常”);
}

13、解释序列化和反序列化?
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

14、接口和抽象类的不同?
下面比较一下两者的区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。

15、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。

16、Java有没有goto?
java中的保留字,现在没有在java中使用。

17、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

18、在JAVA中如何跳出当前的多重嵌套循环?
在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。

19、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的另外final修饰的方法不能被重写,修饰的类不可被继承,修饰的成员变量不可改变。

20、内存管理?
JVM会将申请的内存从逻辑上划分为三个区域:堆、栈、方法区。这三个区域分别用于存储不同的数据。
堆:用于存储使用new关键字所创建的对象。
栈:用于存储程序运行时在方法中声明的所有的局部变量。
方法区:用于存放类的各种信息(包括方法)都在方法区存储。

21、java Bean规范?
创建一个类时要遵循java Bean规范:
1)实现可序列化接口。
2)私有属性(成员变量)和公有方法。
3)无参构造器。
4)GET和SET方法。
其中:get和set方法后面跟着的属性是Bean属性,比如:getName/setName中的Name.

22、成员变量和局部变量以及java Bean规范中的bean属性?
局部变量:

  1. 定义在方法中;
  2. 没有默认值,必须自行设定初始值;
  3. 方法被调用时,存在栈中,方法调用结束时局部变量从栈中清除;
    成员变量:
  4. 定义在类中,方法外;
  5. 由系统设定默认初始值,可以不显式初始化;
  6. 所在类被实例化后,存在堆中,对象被回收时,成员变量失效;
    Bean属性:
    get和set方法中,get/set后面跟着的属性是Bean属性,比如:getName/setName中的Name.

23、向上造型?
父类的引用指向子类对象。

24、面向对象的特征。
封装,继承,多态,抽象。

25、内部类可以引用它的包含类的成员吗?有没有什么限制?
完全可以。如果不是静态内部类,那没有什么限制!
如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员。

26、String是最基本的数据类型吗?
不属于,基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类。

27、什么是内部类?Static Nested Class和Inner Class的不同。
内部类就是在一个类的内部定义的类,内部类中不能定义静态成员,内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中。

28、包装类的自动拆装箱?
自动拆装箱是JDK1.5以后的一个新特性:
基本类型转换为包装类叫自动装箱,比如int转换成Integer
包装类转换成基本类型叫自动拆箱,比如Integer转换成int。

29、Integer与int的区别?
int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。

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

31、List和 Map区别?
一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。

32、List, Set, Map是否继承自Collection接口?
List,Set是,Map不是。

33、说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。

34、Collection和 Collections的区别。
Collection是集合类的上级接口,继承与他的接口主要有Set和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

35、set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用还是equals()?它们有何区别?
Set里的元素是不能重复的,元素重复与否是使用equals()方法进行判断的。
equals()和
方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

36、GC的垃圾回收机制
垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用所指向的对象。
GC线程会从栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的,若GC无法跟踪到某一块堆内存,那么GC就认为这块内存不再使用了,即为可回收的。但是,java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。
GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象就立即回收。一般情况下,当我们需要GC线程即刻回收无用对象时,可以调用System.gc()方法。此方法用于建议JVM马上调度GC线程回收资源。

37.Java程序的内存泄露问题
内存泄露是指,不再被使用的内存没有被及时的回收,严重的内存泄露会因过多的内存占用而导致程序的崩溃。在程序中应该尽量避免不必要的内存浪费。
GC线程判断对象是否可以被回收的依据是该对象是否有引用来指向,因此,当确定该对象不再使用时,应该及时的将其引用设置为null,这样,该对象即不再被引用,属于可回收的范围。

38、启动一个线程是用run()还是start()? .
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法执行是该线程所关联的代码。

39、sleep()和 wait()有什么区别?
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间进入阻塞状态,主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

40、Java里的传引用和传值的区别是什么?
答案:传引用是指传递的是地址而不是值本身,传值则是传递值的一份拷贝。

41、设计模式之单例模式?
模式单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。
说到单例模式,第一个想到的是该类中有一个初始化为null的自身引用,且被private修饰符修饰,其它类不得直接访问。除此之外,单例模式的类还需要有private的构造方法,这一点不难理解,如果构造方法是public的,那么类外部可以直接调用该类的构造方法,如此一来便不具备单例的特性.
怎么获取该类唯一的实例呢?这就需要一个公有的获取器,该方法返回值类型是单例模式类,返回的结果自然是该类中唯一的实例。
案例:请将如下代码务必写熟练(笔试题)
public class Singleton{

//初始化为null的单例
private static Singleton single=null;

//private的构造方法
private Singleton(){

}

//public的获取器
public Static Singleton getSingleton(){
//如果当前的实例为null则创建对象
if(single==null){
single=new Singleton();
}
return single;
}
}

42、Servlet中Http的请求方式有哪几种?有什么不同?
get和post这是http协议的两种请求方式:
这两种请求有本质的区别,get通过路径传参,参数附加在url后,大小个数有严格限制且只能是字符串,隐私性差。
post的参数是通过实体传参,不通过url,隐私性好,传递参数不受限制。
如果未设置请求方式的情况下默认是get请求方式,会调用doGet()方法执行请求。
如果设置请求方式为post,则会调用doPost方法执行请求。

转自 作者:likaihai918 :https://blog.csdn.net/lixiaohai_918/article/details/79950369

发布了2 篇原创文章 · 获赞 0 · 访问量 268

猜你喜欢

转载自blog.csdn.net/weixin_43682921/article/details/94634276