前言
从知乎上找的大厂面试题,尝试用自己的话输出一下。
Java基础
1、你能否详细的说一下你所理解的Java?
Java来自于1991年,James Gosling博士启动的一个计划,目的是开发一种能够在各种消费电子产品上运行的程序架构,对电子产品进行控制和通信,最终该计划的产物是"osk",之后由于市场部景气,遂放弃。但是Sun公司看见了Osk互联网上应用的前景,于是改造了Osk,1995年5月23日开始发行Java。
当时的口号是“Write Once, Run Anywhere.”,这也是Java和其他的高级语言相比最具有优势的一点,即Java的跨平台特性。当你写好一个Java程序后,会被编译为字节码文件,然后会交给JVM运行。不同的平台环境对应不同的JVM,但字节码都是相同的,所以其实是Java语言跨平台,JVM是不跨平台的。
2、JDK和JRE有什么区别?
JDK和JRE是包含关系,JRE是Java的运行环境,JDK是Java的运行环境以及开发工具包。
Java的源程序被编译为字节码文件后,会交给JVM运行。JRE和JDK都是含有JVM的。
如果你只想运行Java程序,只需要JRE即可,但如果想编写Java程序,就需要JDK。
3、==和equals有什么区别?
关于==,在Java中有8种基本数据类型,Java规定,当我们用==来比较这8种基本数据类型时,它比较的是数值之间的关系。
关于equals,除了8种基本数据类型以外,在Java中,一切皆对象,对于对象间的比较,必须使用对象都使用的equals方法。如果你坚持使用==进行比较,那么JVM比较的就是对象的内存地址。
4、两个对象的hashCode相同,则equals也一定为true,对吗?
先说结论,不一定。
hashCode顾名思义,表示一个对象的散列代码。
hash作为一种数据结构,两个不同的值拥有相同hash的可能性是存在的,这取决于hash算法设计的合理性。
故两个不同的对象是有一定概率拥有相同的hashCode的,所以两个hashCode相同的对象不一定是相同的对象,所以他们的equals有可能不相同(用可能是因为即便是两个不同的对象也有可能值相等)。
5、String str = "i" 与 String str = new String("i")一样吗?
先说结论,不一样。
String str = "i",Java读到这段代码后,JVM会先将"i"存到常量池中,然后在堆区创建一个String对象叫做"str",指向常量池中的"i"。
String str = new String("i"),JVM会先将"i"存到常量池中,然后在堆区创建一个匿名String对象内部指向常量池中的"i",然后再创建一个String对象"str",指向匿名的String对象,而匿名String对象又指向"i",所以最终的结果就是str对象直接指向常量池的"i"的引用。
相比上一个,第二个会多创建一个不必要的String对象。
6、如何将字符串反转?
return new StringBuilder(str).reverse().toString();
7、String属于基础数据类型么?
不属于,8个基本数据类型是:int,long,float,double,boolean,char,byte,short
他们的包装类型是:Integer、Long、Float、Double、Boolean、Character、Byte、Short。
String的底层对一个char数组进行操作来代替字符串。
8、HashMap的实现原理?
HashMap采用数组+链表+红黑树实现,当你插入一个对象时,会计算hash值映射到了哪个数组中,这样get和set的时间复杂度都为O(1),如果产生了hash碰撞(当A!=B,Hash(A)==Hash(B),就可以说产生了Hash碰撞),就会在当前位置用链表顺延下去,当链表太长就会转换为二叉树。因为二叉树的查询效率为logN,1亿个记录最多只需要查找10000次,这里会遇到一个二叉树的问题,我们都知道二叉树的特点是根节点大于左孩子而小于右孩子,如果插入的是一个顺序的数,比如1、2、3、4...这样,每次插入,都会往根节点的右边插入,二叉树的高度就等于数的长度,这样查询复杂度为O(N),插入也为O(N)。所以这里用到了红黑树的概念,红黑树是一种自平衡的二叉树,比如我插入1、2、3时,普通的二叉树先插入1,然后2作为1的右孩子,3作为2的右孩子,最多需要3次才能查到数据,红黑树会自旋将树变为一棵平衡树。这样最多只需要2次就能查到想要的数据。
9、ArrayList和LinkedList、Vector的区别
ArrayList内部使用数组实现,LinkedList内部使用链表来实现。
数组的特点是get时间复杂度为O(1),但delete和insert的时间复杂度为O(n),链表的insert和delete时间复杂度为O(1),但get时间复杂度为O(n)。
10、并发和并行的区别?
并发和并行区别挺大的。
我们使用的操作系统,比如windows10,我可以一边听网易云,一边看电影,一边打游戏。看起来好像同一个时间做了很多事,其实在最最底层的微观世界,同一个时间点只会做一件事,我们的操作系统通过各种调度算法让我们产生了这些事在同时做的错觉而已。
而上文所说的,一边听歌一边打游戏一边看电影,对于一个单核CPU来说,就叫并发,因为你只有一个核心,你微观底层同一个时间点只能做一件事。而如果你是多核的,那你可以听歌看电影可以在单位微观时间内同时进行,这就是并行的概念了。