Java面试题整理1

Java基础部分

JDK和JRE有什么区别?

JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

==和equals的区别
对于==,
基本类型:比较的是值是否相同;
引用类型:比较的是引用是否相同;

String x = "string";

String y = "string";

String z = new String("string");

System.out.println(x==y); // true
System.out.println(x==z); // false 

System.out.println(x.equals(y)); // true

System.out.println(x.equals(z)); // true

 

对于equals,

本质上其实也是==,只是对于String,Integer(等)包装类,都有重写equals,所以对于这些对象引用的比较,实际上也就是我们认为的值比较。

JDK 11中String类的equals方法

public boolean equals(Object anObject) {
    if (this == anObject) { return true; } 
    if (anObject instanceof String) { 
        String aString = (String)anObject; 
        if (coder() == aString.coder()) { 
            return isLatin1() ? StringLatin1.equals(value, aString.value) :StringUTF16.equals(value, aString.value); 
     } }
return false; }

两个对象的 hashCode()相同,则 equals()也一定为 true?

我们知道equals比较的是引用或值,但是无论是引用还是值,对于不同的值或引用,总会有几率出现相同的hashCode(hash冲突),此时equals为false

final 在 java 中有什么作用?

final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

Java中的String类其实就是个immutable参数,每一次对String对象进行修改操作都是改变了引用指向的对象

JDK 11

string

String 属于基础的数据类型吗?

String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

java 中操作字符串都有哪些类?它们之间有什么区别?

操作字符串的类有:String、StringBuffer、StringBuilder。

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

String str="i"与 String str=new String("i")区别?

str=“i”会将其引用对象直接分配至常量池,而new String("i")会分配至堆内存,new出的String对象可通过intern方法加入常量池。

将字符串反向  

StringBuilder 或者 stringBuffer 的 reverse() 方法。

String 类的常用方法

indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。

抽象类和普通类的区别

普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。

接口和抽象类有什么区别?

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

BIO、NIO、AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

 

容器部分 

java有哪些容器?

collection和collections有什么区别?

collection是集合的顶层接口,提供了对集合的基本操作的通用接口方法,直接继承接口有List和set。

collections是集合类的工具类,提供了一系列对集合元素排序、搜索等一系列静态方法。

HashMap的实现原理

HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 

HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

HashSet实现原理

HashSet底层由HashMap实现,HashSet的值存放在HashMap的key上,value值均为PRESENT

ArrayList和LinkedList的区别

ArrayList底层为数组,支持随机访问,LinkedList底层数据结构是双向循环列表,所以查找对象的时间复杂度是O(n),ArrayList为O(1).

ArrayList和Vector的区别

Vector是同步的,ArrayList不是,所以ArrayList的速度优于vector

在迭代时对列表进行修改应使用CopyOnWriteArrayList

Array和ArrayList的区别

首先Array是一个数组,数组大小在初始化时就定义好了,无法做扩容操作,其次数组是可以容纳基本类型和对象的,但是ArrayList只能容纳对象。

Queue中poll方法和remove方法有什么区别?

poll()和remove()都是从队列中取出一个元素,但是poll()在获取元素失败的时候会返回空但是remove()失败的时候会抛出异常。

线程安全的集合类有哪些?

Vector;statck:堆栈类,先进后出;HashTable;enumeration:枚举,相当于迭代器。

迭代器(Iterator)是什么?

迭代器是一种设计模式,是一个轻量级对象,创建消耗少。用于遍历选择序列中的对象

 Iterator怎么使用?有什么特点?

使用next()获取序列中的下一个元素;使用hasNext()检查是否还有下一个元素;

特点:只能单向迭代

Iterator和ListIterator的区别

ListIterator支持双向遍历,只能遍历List。并且相比Iterator多了增加元素替换元素等方法

注:资料转载于公众号“Java团长”,是一个学习技术值得关注的公众号!!!

 

posted @ 2019-04-01 20:09  水滴石穿007  阅读(306)  评论(0编辑  收藏  举报