欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java面试题

程序员文章站 2022-04-11 18:44:45
...
  1. 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
    使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的

  2. 静态变量和实例变量的区别?
    在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
    在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
    例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。

  3. 是否可以从一个static方法内部发出对非static方法的调用?
    不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。

  4. 请说出作用域public,private,protected,以及不写时的区别
    这四个作用域的可见范围如下表所示。
    说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。
    作用域 当前类 同一package 子孙类 其他package
    public √ √ √ √
    protected √ √ √ ×
    friendly √ √ × ×
    private √ × × ×

  5. ClassLoader如何加载class 。
    jvm里有多个类加载,每个类加载可以负责加载特定位置的类,例如,bootstrap类加载负责加载jre/lib/rt.jar中的类, 我们平时用的jdk中的类都位于rt.jar中。extclassloader负责加载jar/lib/ext/*.jar中的类,appclassloader负责classpath指定的目录或jar中的类。除了bootstrap之外,其他的类加载器本身也都是java类,它们的父类是ClassLoader。

  6. 分层设计的好处;把各个功能按调用流程进行了模块化,模块化带来的好处就是可以随意组合,

  7. 下面的代码有什么不妥之处
    1、if(username.equals(“zxx”){}
    username可能为NULL,会报空指针错误;改为”zxx”.equals(username)
    2、int x = 1;
    return x==1?true:false; 这个改成return x==1;就可以!

  8. 构造器Constructor是否可被override?
    构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。

  9. 接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?抽象类中是否可以有静态的main方法?
    接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承具体类。抽象类中可以有静态的main方法。

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

  11. 是否可以继承String类?
    String类是final类故不可以继承。

  12. 数组有没有length()这个方法? String有没有length()这个方法?
    数组没有length()这个方法,有length的属性。String有有length()这个方法。

  13. 下面这条语句一共创建了多少个对象:String s=”a”+”b”+”c”+”d”;
    上面的代码应该只创建了一个String对象。写如下两行代码,
    String s =”a” + “b” + “c” + “d”;
    System.out.println(s== “abcd”);
    最终打印的结果应该为true。

  14. 下面的程序代码输出的结果是多少?

public class  smallT{
       public staticvoid  main(String args[]) {
              smallT t  = new smallT();
              int  b =  t.get();
              System.out.println(b);
       }
       public int  get(){
              try {
                     return1 ;
              }
              finally {
                     return2 ;
              }
       }
}

返回的结果是2。
我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

16 、final, finally, finalize的区别。

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

17、多线程有几种实现方法?同步有几种实现方法?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify

18、ArrayList和Vector的区别
a、这两个类都实现了List接口(List接口继承了Collection接口),
b、都是采用数组格式存储数据,索引数据块插入数据慢。
c、他们都是有序集合
d、Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。

19、ArrayList和LinkedList的大致区别:
(1)ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
(2)对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
(3)对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。

20、java容器

java面试题
Map、Set、List的比较:
List(interface): 次序是List最重要的特点;它确保维护元素特定的顺序。ArrayList、LinkedList。

Map(interface): 主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。Hashmap 、Hashtable、LinkedHashMap

Set(interface): 存入Set的每个元素必须是唯一的,Set接口不保证维护元素的次序。 HashSet、TreeSet、LinkedHashSet

21、HashMap和HashTable比较:
(1)HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口
(2)底层都是由数组+链表组成
(3)HashMap是非线程安全的,HashTable是线程安全的。
(4)HashMap的键和值都允许有null存在,而HashTable则都不行。
(5)因为线程安全的问题,HashMap效率比HashTable的要高,HashTable已被淘汰。
(6)HashMap默认初始化数组的大小为16,HashTable为11。前者扩容时乘2,使用位运算取得哈希,效率高于取模。而后者为乘2加1,都是素数和奇数,这样取模哈希结果更均匀。

22、HashTable和ConCurrentHashMap的对比
(1)二者都是线程安全的,但ConCurrentHashMap性能更好
(2)HashTable里使用的是synchronized关键字,这其实是对对象加锁,锁住的都是对象整体,当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。
(3)ConcurrentHashMap引入了分割(Segment),上面代码中的最后一行其实就可以理解为把一个大的Map拆分成N个小的HashTable。内部使用的同步机制是基于lock操作的,这样就可以对Map的一部分(Segment)进行上锁,这样影响的只是将要放入同一个Segment的元素的put操作,保证同步的时候,锁住的不是整个Map(HashTable就是这么做的),相对于HashTable提高了多线程环境下的性能

23、HashMap和ConCurrentHashMap的对比
(1)HashMap没有锁机制,不是线程安全的
(2)HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。

24、HashMap与TreeMap的对比
(1)HashMap与TreeMap都继承了AbstractMap类。
(2)线程都不安全
(3)HashMap根据hash表实现、TreeMap根据红黑树实现。
(4)TreeMap实现SortMap接口,有序;HashMap无序
(5)二者的key都不能重复;TreeMap的键、值都不能为null
(6)HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用

25、LinkedHashMap
(1)LinkedHashMap 是HashMap的子类,保存了记录的插入顺序。在HashMap的基本元素 Entry增加before、after用于维护Entry整个双向列表的插入顺序。

(2)a、在Map 中插入、删除和定位元素,HashMap 是最好的选择。
   b、TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
   c、LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同。

26、什么是IO流?
它是一种数据的流从源头流到目的地。比如文件拷贝,输入流和输出流都包括了。输入流从文件中读取数据存储到进程(process)中,输出流从进程中读取数据然后写入到目标文件。

26、什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征?
答案
节点流 直接与数据源相连,用于输入或者输出
处理流:在节点流的基础上对之进行加工,进行一些功能的扩展
处理流的构造器必须要 传入节点流的子类

27、如果我要对字节流进行大量的从硬盘读取,要用那个流,为什么?
答案
BufferedInputStream 使用缓冲流能够减少对硬盘的损伤

28、如果我要打印出不同类型的数据到数据源,那么最适合的流是那个流,为什么
答案
Printwriter 可以打印各种数据类型

29、怎么样把我们控制台的输出改成输出到一个文件里面,这个技术叫什么
答案
SetOut(printWriter,printStream)重定向

30、 怎么样把输出字节流转换成输出字符流,说出它的步骤
答案
使用 转换处理流OutputStreamWriter 可以将字节流转为字符流
New OutputStreamWriter(new FileOutputStream(File file));

31、把包括基本类型在内的数据和字符串按顺序输出到数据源,或者按照顺序从数据源读入,一般用哪两个流
答案
DataInputStream DataOutputStream

32、把一个对象写入数据源或者从一个数据源读出来,用哪两个流
答案
ObjectInputStream ObjectOutputStream

33、什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作
答案
对象序列化,将对象以二进制的形式保存在硬盘上
反序列化;将二进制的文件转化为对象读取
实现serializable接口

不想让字段放在硬盘上就加transient

34、如果在对象序列化的时候不想给一个字段的数据保存在硬盘上面,采用那个关键字?
答案
transient关键字

35、在实现序列化接口是时候一般要生成一个serialVersionUID字段,它叫做什么,一般有什么用
答案
是版本号,要保持版本号的一致来进行序列化
为了防止序列化出错

36、InputStream里的read()返回的是什么,read(byte[] data)是什么意思,返回的是什么值
答案
返回的是所读取的字节的int型(范围0-255)
read(byte [] data)将读取的字节储存在这个数组
返回的就是传入数组参数个数

Read 字节读取字节 字符读取字符

37、OutputStream里面的write()是什么意思,write(byte b[], int off, int len)这个方法里面的三个参数分别是什么意思
答案
write将指定字节传入数据源
Byte b[ ]是byte数组
b[off]是传入的第一个字符
len是实际长度

38、如果有多个流互相调用传入是怎么关闭的?
答案
多个流互相调用只关闭最外层的流

39、Java中的所有的流可以分为几大类,它们的名字是什么,各代表什么
答案
分为 字节输入流 InputStream
字节输出流 OutputStream
字符输入流 Reader
字符输出流 Writer
所有流都是这四个流的子类

说下常用的io流
InputStream,OutputStream,
FileInputStream,FileOutputStream,
BufferedInputStream,BufferedOutputStream
Reader,Writer
BufferedReader,BufferedWriter

40、 io流怎样读取文件的?
使用File对象获取文件路径,通过字符流Reader加入文件,使用字符缓存流BufferedReader处理Reader,再定义一个字符串,循环遍历出文件。代码如下:

File file = new File("d:/spring.txt");
try {
    Reader reader = new FileReader(file);
    BufferedReader buffered = new BufferedReader(reader);
    String data = null;
    while((data = buffered.readLine())!=null){
    System.out.println(data);
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

41、 说说你对io流的理解
Io流主要是用来处理输入输出问题,常用的io流有InputStream,OutputStream,Reader,Writer等

42、用什么把对象动态的写入磁盘中,写入要实现什么接口。
ObjectInputStream,需要实现Serializable接口

28 PrintStream、BufferedWriter、PrintWriter的比较?
PrintStream类的输出功能非常强大,通常如果需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream
BufferedWriter:将文本写入字符输出流,缓冲各个字符从而提供单个字符,数组和字符串的高效写入。通过write()方法可以将获取到的字符输出,然后通过newLine()进行换行操作。BufferedWriter中的字符流必须通过调用flush方法才能将其刷出去。并且BufferedWriter只能对字符流进行操作。如果要对字节流操作,则使用BufferedInputStream。
PrintWriter的println方法自动添加换行,不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生,PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush);

43、System.out.println()是什么?
println是PrintStream的一个方法。out是一个静态PrintStream类型的成员变量,System是一个java.lang包中的类,用于和底层的操作系统进行交互。

44、在文件拷贝的时候,那一种流可用提升更多的性能?
在字节流的时候,使用BufferedInputStream和BufferedOutputStream。
在字符流的时候,使用BufferedReader 和BufferedWriter

45、说说管道流(Piped Stream)
有四种管道流, PipedInputStream, PipedOutputStream, PipedReader和 PipedWriter.在多个线程或进程中传递数据的时候管道流非常有用。

46、合并流SequenceInputStream的作用?
在拷贝多个文件到一个目标文件的时候是非常有用的。可用使用很少的代码实现

47、什么是Filter流?
Filter Stream是一种IO流主要作用是用来对存在的流增加一些额外的功能,像给目标文件增加源文件中不存在的行数,或者增加拷贝的性能。

48、说一说Servlet的生命周期?
答:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。

49、jsp有哪些内置对象?作用分别是什么?分别有什么方法?
答:JSP共有以下9个内置的对象:
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外

50、jsp有哪些动作?作用分别是什么?
(这个问题似乎不重要,不明白为何有此题)
答:JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

51、JSP中动态INCLUDE与静态INCLUDE的区别?
答:动态INCLUDE用jsp:include动作实现
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数 静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面 <%@include file=included.htm %>

52、MVC的各个部分都有那些技术来实现?如何实现?
答:MVC是Model-View-Controller的简写。Model代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),View是应用的表示面(由JSP页面产生),Controller是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。