Java面试题汇总(100题)Ⅰ

1 面向对象的特征有哪些方面?

抽象、继承、封装、多态

2 String是最基本的数据类型吗?

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

3 int和Integer有什么区别

Java提供两种不同的类型:引用类型和原始类型(内置类型)。为了能够将这些基本数据类型当成对象操作,java引入了引用类型。
int是java的原始数据类型,Integer是java为int提供的封装类。
java为每个原始类型提供了封装类:
boolean-Boolean
char-Character
byte-Byte
short-Short
int-Integer
long-Long
float-Float
double-Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。

4 什么是自动装箱和自动拆箱?为什么要使用它们?

自动装箱(autoboxing)是java编译器在java原生类型和对应的对象包装类型上做的自动转换。
自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出。

使用Java有一段时间的人都知道,有时需要将基本数据类型转换为对象。例如使用Map对象要操作put()方法时,需要传入的参数是对象而不是基本数据类型。

要使用打包类型(Wrapper Types)才能将基本数据类型包装为对象,在J2SE 5.0之前,要使用以下语句才能将int包装为一个Integer对象:Integer integer = new Integer(10);

在 J2SE 5.0之后提供了自动装箱的功能,你可以直接使用以下语句来打包基本数据类型:Integer integer = 10;

5 String和StringBuffer的区别

Java平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,包含多个字符的字符数据。
String 类的值不能改变,而StringBuffer可以改变。
String:适用于少量的字符串操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

6 运行时异常和编译时异常

异常表示程序运行过程中可能出现的非正常状态

  • 运行时异常:
    都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

  • 编译时异常
    是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
7 Servlet生命周期

Servlet被服务器实例化以后,web容器运行其init方法,请求到达时运行其service方法,service方法自动调用与请求对应的doGet/doPost方法,当服务器决定将实例销毁的时候调用其destroy方法。
servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且实例一般不会销毁。

8 说出ArrayList、Vector、LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便于增加和插入元素,它们都允许直接按序号查找元素,但是插入元素要涉及数组元素移动等内存操作,所以查找快而插入慢,同时Vector由于使用了synchronized方法通常性能较ArrayList差一些。

而LinkedList使用了双向链表实现存储,查找数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,插入速度较快,

9 为什么说ArrayList是线程不安全的

一个 ArrayList ,在添加一个元素的时候,它可能会有两步来完成:

  1. 在 Items[Size] 的位置存放此元素;
  2. 增大 Size 的值。

在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
而多线程的情况下,自然无法保证1-2会连续执行,所以ArrayList是不安全的
//sun公司希望Vector是线程安全的,而希望arraylist是高效的

10 Collection和Collections的区别

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

11 & 和&&的区别

& 是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)

12 HashMap和HashTable的区别

HashMap是HashTable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空键值,由于非线程安全,效率上可能高于HashTable。

HashMap允许将null作为一个entry的key或者value,而HashTable不允许。
HashMap把HashTable的contains方法去掉了,改成了containsValue和containsKey。因为contains方法容易让他引起误解。
HashTable继承自Dictionary类,而HashMap是Java1.2引进的Map Interface的一个实现。

最大的不同是,HashTable的方法是Synchronize的,而HashMap不是,在多个线程访问HashTable时,不需要自己为它的方法实现同步,而HashMap不是,在多个线程访问HashTable时,不需要自己为它的方法实现同步,而HashMap必须为之提供外同步。

HashTable与HashMap采用的hash/rehash算法差不多,所以性能不会有很大的差异。

13 final,finally,finalize的区别

final用于声明属性、方法和类,分别表示属性不可变,方法不可覆盖,类不可以继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是object类的一个方法,在GC执行的时候回调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

14 sleep()和wait()有什么区别

sleep是线程类thread的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后悔自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法或者notifyAll后本线程才进入对象锁定池准备获得对象锁进入运行状态。

15 Overload和Override的区别,Overload的方法是否可以改变返回值的类型?

方法的重写和重载是java多态性的不同表现。重写Override是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。
子类中定义了某方法与父类有相同的名称和参数,我们说该方法被重写了。
如果在一个类中定义了多个同名的方法,而参数个数或者类型不同,那么叫做方法的重写。

16 error与exception的区别

error指的是程序出错,比如内存溢出等等。
exception指的是一种预设的错误状态,如果程序运行正常就不会发生。

17 同步和异步有什么异同,在什么情况下分别使用他们?

如果数据再线程之间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步编程往往更加有效率。

18 abstract class和interface有什么区别

声明方法的存在而不去实现它的类被叫做抽象类abstract class ,它用于创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现抽象的方法,抽象类中可以存在非抽象的方法,此时这些方法可以被实现。
可以创建一个类型是抽象类的变量,并且让其指向具体子类的一个实例。
不可以有抽象构造函数或者抽象静态方法。

interface是抽象类的变体,在接口中所有方法都是抽象的。多继承性通过实现这样的接口而获得。接口只可以定义static final成员变量。
使用instanceof运算符可以用来决定某对象的类是否实现了接口。

abstract class类似于一个属性定义一样,比如定义你是人,你就不能是动物,所以只支持单继承。而interface类似动作,你可以吃饭,也可以睡觉等等,所以你可以继承无数interface。

19 heap和stack有什么区别

1、heap是stack的一个子集
2、stack存取速度仅次于寄存器,存储效率比heap高,可以共享存储数据,但是其中数据的大小和生存期必须咋运行前确定。
3、heap是运行时可动态分配的数据区,从速度看比stack慢,heap里面的数据不共享,大小和生存期都可以在运行时确定。
4、new关键字是运行在heap里边创建对象,每new一次都一定会创建新对象,因为堆数据不共享。
5、heap是一种线性集合,其天剑和删除元素的操作在同一端完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素。
总而言之,stack是jvm的内存指令区,java的基本数据类型和java指令代码、常量等都保存在stack中。
heap是jvm的内存数据区。每次分配不定长的内存空间,专门用来保存对象的实例,实际上也只是保存对象 实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法属于指令,保存在stack中)

20 forward和redirect的区别(转发和重定向)

forward是服务器请求资源,服务器直接访问目标地址的url,把目标地址的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪里来的,所以它的地址栏中还是原来的地址。在整个转发的过程中用的是同一个request。
redirect是服务端重新发送一次请求,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所有session、request参数都可以获取。
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且这样也有助于隐藏实际的链接。

21 Static Nested Class和Inner Class的不同

Static Nested Class 是被声明为静态static的内部类,它可以不依赖于外部类实例而被实例化。而通常的内部类,需要在外部类实例化后才能实例化。

22 JSP中动态include和静态include

动态include用jsp:include动作实现< jsp:include page=”included.jsp” flush=”true”/>它总是会检查所含文件中的变化,适合用于包含动态页面的情况,并且可以带参数。
静态include用include伪代码实现,不会检查所含文件的变化,适用于包含静态页面< %@include file =”included.html”>

23 使用assert()

assert(断言)在软件开发中是一种常用的调试模式。
断言的主要作用是“声称什么东西在作者的考虑范围内,什么东西不在作者的考虑范围内”。理解断言,核心问题不在于断言的用途本身,而是“在语义上算无遗着”这个理念。
在会发生问题的地方加断言,是很好的防止错误发生的方法。

24 GC是什么,为什么要有GC

GC是Gabage Collection的意思,内存处理是编程人员容易出问题的地方,忘记或者错误的内存回收会导致程序或者系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是都超过作用于从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显式操作方法。

25 short s1=1;s1=s1+1;有什么错?short s1=1;s1+=1;有什么错?

s1为short类型,s1+1运算结果为int类型,将int类型赋值给short类型需要强转。故第一条错了。
s1+=1是对的。+=是java语言规定的运算符,运算时会自动强转为左侧操作数类型。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值