Java面试题汇总---每日更新

每日一条面试题,题目大多数来源于课堂和网络。

1.简述一下final ,finally  和finalize的区别?

 final修饰类不能被继承,修饰方法不能被重写,修饰变量不能被修改。

finally 通常和try catch搭配使用,保证不管有没有发生异常,资源都能够

被释放(释放连接,关闭IO流)

finalize是object类中的一个方法,子类可以重写finalize()方法实现对资源的回收

2.Error,Exception,运行时异常(Runtime Exception),IO异常(CheckedException)和一般的异常和什么区别?

Error:主要是Jvm虚拟机侦测到的无法预期改变的错误,Jvm层次发生严重的错误,使Jvm无法继续运行,这种错误无法恢复,不可捕捉,只能显示错误。

Exception:这种错误是可以恢复的,并且是可以捕捉到的。

RuntimeException:运行时异常,由虚拟机接管处理,我们可以不处理,比如(NullPointerException)

CheckedException:IO异常,这种异常需要我们进行catch操作来应对JAVA编译器,去处理发生的异常。例如(SQl异常)。

3.int a =1, b= 2,如何让1和2交换值?

a=a^b;

b=a^b;

a=a^b;

(详解:a=0001;

b=0010;

a^=b^=a^=b先执行a^=b即a=a^b之后a=0011;在执行b^=a后b=0001,最后执行a^=b后,a=0010=2.

4.Arraylist,LinkList与hashMap的默认空间是多少?

    1.ArrayList的底层是由一个Object[]数组构成的,Object[]数组默认的长度是10,如过这样的话ArrayList长度容量即为10

如果是size()方法,即“逻辑”长度,是指内存已存在的“实际元素的长度” 而“空元素不被计算”

即:当你利用add()方法,向ArrayList内添加一个“元素”时,逻辑长度就增加1位。 而剩下的9个空元素不被计算。

如下代码:

ArrayList<String> list = new ArrayList<String>();  
System.out.println("size = " + list.size());

输出结果为0,所以ArrayList 默认size()是0.

    2.LinkedList 是一个双向链表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增。 

   3.HashMap 初始化大小是 16 ,扩容因子默认为0.75(可以指定初始化大小,和扩容因子) 扩容机制(当前大小 和 当前容量 的比例超过了 扩容因子,就会扩容,扩容后大小为 一倍。例如:初始大小为 16 ,扩容因子 0.75 ,如果容量为12的时候,比例已经是0.75 ,所以会触发扩容,扩容之后的大小为 32)。

5.String 是基本数据类型吗?

    不是。java中的基本数据类型只有8个:byte,short,char,int ,long ,float,double,boolean

                除了基本数据类型和枚举类型,剩下的都是引用类型。

6.是否可以继承String类?

    不可以,String类是final类,不可以被继承。

7.String和StringBuilder、StringBuffer的区别?

    答:Java平台提供了两种类型的字符串:

     String和StringBuffer/StringBuilder,它们可以储存和操作字符串。

其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。

而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,

它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,

因此它的效率也比StringBuffer要高。

StringBuffer更安全。

8、String s = new String(“xyz”);创建了几个字符串对象?

答:两个对象,一个是静态区的”xyz”,一个是用new创建在堆上的对象。

9.描述一下JVM加载class文件的原理机制?

答:JVM类的装载是由类加载器和他的子类来实现的,Java中的类加载器是一个重要的Java运行时

系统组件,他负责在运行时查找和装入类文件中的类。

由于Java的跨平台性,经过编译的Java源程序并不是一个可执行的程序,而是一个或者多个类文件

当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。
类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。
加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,
这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。

最后JVM对类进行初始化,包括:

1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;

2)如果类中存在初始化语句,就依次执行这些初始化语句。

10.Java分母为零时,会出现什么情况?

 
  当分母为零时,分为以下四种情况:
  一、当且仅当分子分母同时为整数零时,即(0/0),运行结果抛出异常: java.lang.Aritmeticxtio: by zero

 二、  当分子分母同时为零,但不同时为整数零时,即(0.0/0、0/0.0、0.0/0.0),运行结果 为 NaN  (not an number); 任何数与NaN相比较都为false,包括NaN==NaN也为false

  三、当分子为正数时,结果为正无穷大(infinity),两个正无穷大比较结果为true

  四、当分子为负数时,结果为负无穷大(-infinity),两个负无穷大比较结果为true



Infinity 无穷大



11.ArrayList和LinkedList有什么区别?

ArrayList和LinkedList都实现了List接口。

不同点:ArrayList是基于索引的数据接口,他的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。

LinkedList是以元素列表的形式存储他的数据,查找某个元素的时间复杂度为O(n).所以插入,添加,删除操作速度更快,但是更占内存,因为linkedList为每个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

12、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。
Java对于eqauls方法和hashCode方法是这样规定的:
(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同,它们并不一定相同。当然,你未必要按照要求去做,
但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,
同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。

13、Java集合类框架的基本接口有哪些?

Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。

Java集合类里面最基本的接口有:

    Collection:代表一组对象,每一个对象都是它的子元素。

    Set:不包含重复元素的Collection。

    List:有顺序的collection,并且可以包含重复元素。

    Map:可以把键(key)映射到值(value)的对象,键不能重复。

14.equals和==的区别?

equals是值比较,并且equals是可以自定义的。

==是引用比较(对象比较)

15.List、Set、Map是否继承自Collection接口?

答:Set 、List 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,

而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

16、Collection和Collections的区别?

答:Collection是一个接口,它是Set、List等容器的父接口;

Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。

17、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

    Array和ArrayList的不同点:

    Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

    Array大小是固定的,ArrayList的大小是动态变化的。

    ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

    对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

18、创建线程有哪些方式?

    1)继承Thread类创建线程

    2)实现Runnable接口创建线程

    3)使用Callable和Future创建线程

19、哪些集合类是线程安全的?

     1、Vector 

     2、HashTable  

     3、Properties  

     4、Stack         

      上述四种是同步类,所以它们是线程安全的,可以在多线程环境下使用。

Java1.5并发API包括一些集合类,允许迭代时修改,因为它们都工作在集合的克隆上,所以它们在多线程环境中是安全的。

20.I++和++I有什么区别?

        如果有表达式 a = i++  它等价于 a = i ; i = i + 1;

        如果有表达式 a = ++i  它等价于   i = i + 1; a = i;

       1 首先两者的区别是:前者是先赋值,然后再自增;后者是先自增,后赋值


21.Struts2和SpringMvc有什么区别?

1.    Struts2 的核心是基于一个过滤器即StrutsPreparedAndExcuteFilter

       SpringMvc的核心是基于一个Servlet即DispatcherServlet前段控制器


2.    Struts2是基于类开发的,传递的参数是通过类的属性传递(属性驱动和模型驱动),所以只能设计成多例


       SpringMvc是基于类中的方法开发的,也就是一个url对应一个方法,传递参数是传到方法的形参上面,所以既可以是单例模式也可以是多例模式


3.    Struts2采用的是值栈存储请求以及响应数据,OGNL存取数据

       SpringMvc采用request来解析请求内容,然后由其内部的getParameter给方法中形参赋值,再把后台处理过的数据通过ModelAndView对象存储,Model存储数据,View存储返回的页面,再把对象通过request传输到页面去。


22、HashMap和Hashtable有什么区别?

相同点:

1. HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。

不同点:

HashMap允许键和值是null,而Hashtable不允许键或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。

22. int与Integer的基本使用对比,Integer缓存值范围?

(1)Integer是int的包装类;int是基本数据类型; 
(2)Integer变量必须实例化后才能使用;int变量不需要; 
(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; 

(4)Integer的默认值是null;int的默认值是0。

(5)Integer缓存值范围-128—127

23.Http请求的get和post方式的区别?

Http 定义了与服务器交互的不同方法,最基本的方法有 4 种,分别是 GET,POST,
PUT,DELETE。URL 全称是资源描述符,我们可以这样认为:一个 URL 地址,它用于
描述一个网络上的资源,而 HTTP 中的 GET,POST,PUT,DELETE 就对应着对这个资
源的查,改,增,删 4 个操作。GET 一般用于获取/查询资源信息,而 POST 一般用于更

新资源信息。

1)  GET 请求,请求的数据会附加在 URL 之后,以?分割 URL 和传输数据,多个参数用&

连接。URL 的编码格式采用的是 ASCII 编码,而不是 uniclde,即是说所有的非
ASCII 字符都要编码之后再传输。POST 请求:POST 请求会把请求的数据放置在
HTTP 请求包的包体中。因此,GET 请求的数据会暴露在地址栏中,而 POST 请求则
不会



2)  传输数据的大小:在 HTTP 规范中,没有对 URL 的长度和传输的数据大小进行限

制。但是在实际开发过程中,对于 GET,特定的浏览器和服务器对 URL 的长度有限
制。因此,在使用 GET 请求时,传输数据会受到 URL 长度的限制。对于 POST,由
于不是 URL 传值,理论上是不会受限制的,但是实际上各个服务器会规定对 POST
提交数据大小进行限制,Apache、IIS 都有各自的配置。



3)  安全性 POST 的安全性比 GET 的高。这里的安全是指真正的安全,而不同于上面

GET 提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,
在进行登录操作,通过 GET 请求,用户名和密码都会暴露再 URL 上,因为登录页面
有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码
就很容易被他人拿到了。除此之外,GET 请求提交的数据还可能会造成 Cross-site

request frogery 攻击

23.throw和throws有什么区别?

       1、 throw关键字用来在程序中明确的抛出异常

        2、throws用于用户程序不能处理的异常。

       3 、每一个方法都必须指定那些异常不能处理,所以方法的调用者才能确保处理可能发生的异常。

       4 、多个异常用逗号隔开。



猜你喜欢

转载自blog.csdn.net/qq_41264674/article/details/79895911