栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

面试常见问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面试常见问题

基础部分

1、面向对象的特征:
1)抽象
抽象就是在一个主题中,忽略与目标无关的那些方面。以便充分注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中一部分,暂时不用考虑其他细节。抽象有两个方面:一个是过程抽象,一个是数据抽象。
2)封装
把数据和过程包围起来,对数据的访问只能通过已定义的界面。
面向对象始于这个基本概念。
3)继承
继承是一种联结类的层次模型,它明确提供了一种表达共性的方法。
新类可以从现有的类中派生,派生的类拥有父类
4)多态
狭义:前提是继承和重写
重写是派生类多态体现
重载是同类中方法的多态性体现
广义:
java和c++多态性的不同
c++把类型信息和虚拟函数信息都放在一个虚拟函数表中,利用其它技术区别
java中,把类型信息和虚拟函数信息分开存放。继承后,派生类会重新设置虚拟函数表,这个虚拟函数表有两部分,一部分是父类的虚拟函数信息,另一部分是派生类自己的虚拟函数信息。
虚拟函数调用都是通过虚拟函数表间接调用的。
序列化:将对象转换为字节IO
广义:将对象转换为指定格式的字符串
2、java中四种引用类型
1)强引用
在java中常见的引用类型。把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当对象处于强引用状态时,它处于可达状态,不会被垃圾回收CG回收,即使不会用到JVM也不会回收。因此强引用是造成java内存泄漏的主要原因之一。
2)软引用
软引用需要用 SoftReference类来实现,内存足够时不会被回收,内存不够时会被回收。软引用通常用在对内存敏感的程序中。
3)弱引用
用WeakReference 类来实现,比软引用的生存期更短,对于只有软引用的对象来说,只要垃圾回收运行,不管JVM是否有足够的内存,都会回收该对象占用的内存
4)虚引用
PhantomReference类来实现。它不能单独使用,必须和引用队列联合使用。主要作用是跟踪对象被垃圾回收的状态。
3、nacos、eureka
nacos:5s心跳包 间隔15s无心跳服务处于不健康状态,间隔30s无心跳,服务死掉
eureka:心跳包默认间隔时间30s
4、String和StringBuffer、StringBuilder的区别
1)String的长度不可变,String类是被final修饰的。底层维护的是char数组。
2)StringBuffer,线程安全的可变字符序列。AbstractStringBuilder它的父类。主要操作append和insert方法。append继承自父类。
3)StringBuilder,线程非安全的。与StringBuffer类似。StringBuffer很多方法用Synchronized修饰。但是StringBuilder速度比StringBuffer快。
4)三者在速度方面的比较:StringBuilder>StringBuffer>String
5、重载和重写的区别:
1)两者都是java多态性的不同体现。
2)重写是父类和子类多态性的一种体现。
3)重载是一个类中方法多态性的一种表现。
4)重写遵循:两同两小一大:方法名、参数类型相同,方法返回类型、方法抛出的异常子类要小于父类,方法修饰符子类要大于父类(访问权限)
5)重载的条件:参数类型不同,参数位置不同,参数个数不同。
6)重载的思想:一物多用。运算符也是可以重载的。例如:运算符“<<”和“>>”既可以作为移位运算符,又可以作为输出流中的插入运算符和输入流中的提取运算符。
6、抽象类和接口的区别
1)抽象类中既可以全是普通方法也可以全是抽象方法
2)接口中全是抽象方法,在jdk8之前,接口中的变量必须是public、final、static的,方法必须是public和abstract的。
在jdk8以后,允许在接口中定义static或defalut方法。
为了解决接口升级的问题:一个接口有多个实现类,当在接口中再次定义抽象方法的时候可能会导致其他的实现类出现错误,这个时候接口升级能更好的减少这种情况的出现
在jdk1.9以后,接口中允许定义私有方法
1、普通私有方法
2、静态私有方法

接口补充

1、接口没有静态代码块,不能有构造方法
2.一个类可以实现多个接口
3.如果实现类所有实现的多个接口中,存在重复的抽象方法,覆盖重写一次即可
4.如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么这个实现类必须是一个抽象类
5.接口可以多继承,但是如果继承来多个defalut方法相同,那么必须对冲突的defalut方法进行覆盖重写
6.一个类如果直接继承父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类的方法

7、threadlocal相关问题

1)ThreadLocalMap是ThreadLocal的静态内部类。
2)使用方式上:1.两者都是Key和Value的形式,但是ThreadLocalMap的Key是指定的(ThreadLocal),HashMap的是任意值。
2.都是使用了数组去存储数据。
3.set或者put的值的时候,使用的哈希算法不一样。
4.解决哈希冲突的算法不一样。HashMap使用的是链地址法。ThreadLocalMap使用的是开放寻址法。
开放地址法:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。缺点:只能向下寻找。为了解决这个问题,引入链地址法

Hi=(H(key)+di) % m,i=1,2,……k(km-1)
其中:H(key)——哈希函数
m——哈希表表长
di——增量序列
分类
线性探测再散列:di=1,2,3,……m-1
二次探测再散列:di=1²,-1²,2²,-2²,3²,……±k²(km/2)
伪随机探测再散列:di=伪随机数序列

开放地址法有一次探测和二次探测。具体了解:

参考:https://www.cnblogs.com/gavanwanggw/p/7307596.html

链地址法 :适合用在冲突比较严重的情况 。也被称作拉链法。
在哈希表中每一个元素都设置链表,同时用指针数据存放每个链表的头指针
将所有关键字为同义词的记录存储在单链表中,并用一堆数组存放头指针

补充:经常使用的哈希函数

1、直接寻址法
H(key)的地址上如果有值,就往下一个位置寻找没有值的位置,把值存放进去
2、数字分析法
找到数据中差异相对较大的数字,找到数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址(比较常用)
3、平方取中法
取哈希key中关键词的平方后的后几位作为散列地址,该方法适用于key关键词中的每一位取值都不够分散或者分散的位数小于哈希地址所需要的的位数的情况
4、折叠法
折叠法即将keyword切割成位数同样的几部分,最后一部分位数能够不同,然后取这几部分的叠加和(注意:叠加和时去除进位)作为散列地址.数位叠加能够有移位叠加和间界叠加两种方法.移位叠加是将切割后的每一部分的最低位对齐,然后相加;间界叠加是从一端向还有一端沿切割界来回折叠,然后对齐相加.
5、随机数法
选择一个随机数,取keyword的随机值作为散列地址,经常使用与keyword长度不同的场合。
6、除留余数法
取keyword被某个不大于散列表表长m的数p除后所得的余数为散列地址.即H(Key)=Key MOD p,p<=m.不仅能够对keyword直接取模,也可在折叠、平方取中等运算之后取模。对p的选择非常重要,一般取素数或m,若p选得不好。则非常easy产生冲突。

一般p取值为表的长度tableSize。

8、List、Set和Map

参考:http://www.cnblogs.com/jycboy/p/javalist.html

补充:String s2 = new String(s1.getBytes(“GB2312”), “ISO-8859-1”);
可以将s1从GB2312编码转换为ISO-8859-1

List集合

元素有序、可重复。每个元素都有对应的顺序索引。
1)void add(int index,E element ) 在列表的指定位置插入该元素。
2)boolean addAll(int index,Collection c) 将集合c包含的所有元素都插入到List集合的index处。
3) Object get(int index) 返回集合index索引出的元素

1.ListIterator接口

List额外提供的一个listIterator()方法,提供了专门操作List的方法
1)boolean hasPrevious(): 返回该迭代器关联的集合是否还有上一个元素。
2)Object previous(): 返回该迭代器的上一个元素。
3)void add((E e): 在指定位置插入一个元素。

2.ArrayList实现类和Vector实现类

ArrayList和Vector是基于数组实现的list类,所以ArrayList和Vector封装了一个动态的,允许再分配的Object[]数组,不指定的话长度默认为10。ArrayList和Vector对象使用initialCapacity参数来设置该数组的长度,当向集合添加大量元素时,可以使用ensureCapac(int minCapacity)方法一次性的增加initialCapacity。
ArrayList和Vector在用法上几乎完全相同,但Vector比较古老,方法名比较长,最好是不使用。ArrayList是线程不安全的,Vector是线程安全的。

Queue集合

Queue用于模拟队列这种数据结构,先进先出。
.PriorityQueue实现类:按队列元素的大小进行重新排序。
Deque接口与ArrayQueue实现类:
1)Deque接口是Queue接口的子接口,它代表一个双端队列,Deque接口里定义了一些双端队列的方法,允许从两端来操作队列的元素。
2)ArrayQueue是Deque接口的典型实现类,他是一个基于数组实现的双端队列,底部也是采用动态的、可重新分配的Object[]数组存储集合元素

linkedList实现类

linkedList实现了List接口和Deque接口,因此他是一个List集合还可以被当成双端队列来使用。
linkedList与ArrayList,ArrayDeque的实现机制完全不同,ArrayList、ArrayDeque内部以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的性能;而linkedList内部以链表的形式来保存集合中的元素,因此随机访问性能较差,但是插入、删除元素时非常快。
linkedList可以实现双端队列和栈的用法。

Map集合

map用于保存具有映射关系的数据

HashMap和Hashtable实现类

HashMap和Hashtable都是Map接口的典型实现类,它们之间的关系完全类似于Arraylist和Vecctor的关系。
1)hashmap线程不安全,hashtable线程安全。但是hashmap性能更高
2)hashtable不允许null作为key和value。hashmap允许。
3)hashmap和hashtable判断value相等的标准:两个对象通过equals方法比较返回true即可。

linkedHashMap实现类

linkedHashMap实现类使用链表来维护key-value的次序,可以记住键值对的插入顺序。

SoetedMap接口和TreeMap实现类

TreeMap存储key-value键值对时,需要根据key对节点进行排序。TreeMap可以保证所有的key-value对处于有序状态。
排序方式:1)自然排序 2)定制排序

注:
1)hashmap和hashtable效率大体相同,实现机制一样,hashmap线程不安全,效率更高
2) TreeMap中所有的key-value对处于有序状态,所以TreeMap比HashMap,Hashtable要慢(尤其是插入、删除),因为TreeMap底层采用红黑树来管理key-value对。
3)linkedHashMap使用链表维护键值对,所以比HahMap慢一点。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/337372.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号