java常见面试题及答案

有些内容是复制的有什么错误还望大家指正。

1、String类为什么是final的。

首先,先得清楚 final 这个关键字。 
final的出现就是为了为了不想改变,而不想改变的理由有两点:设计(安全)或者效率。
final 修饰的类是不被能继承的,所以 final 修饰的类是不能被篡改的。 
了解了这一点,我们再看看问题:

1、从设计安全上讲, 
1)、确保它们不会在子类中改变语义。String类是final类,这意味着不允许任何人定义String的子类。
换言之,
如果有一个String的引用,它引用的一定是一个String对象,而不可能是其他类的对象。 
2)、String 一旦被创建是不能被修改的,

因为 java 设计者将 String 为可以共享的,但不可以改变。

2、HashMap的源码,实现原理,底层结构。

HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null 建和null 值, 因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并不能相同。HashMap是线程不安全的。

HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,依次来解决Hash冲突的问题,因为HashMap是按照Key的hash值来计算Entry在HashMap中存储的位置的,如果hash值相同,而key内容不相等,那么就用链表来解决这种hash冲突。
HashMap采用hash算法来决定Map中key的存储,并通过hash算法来增加集合的大小。hash表里可以存储元素的位置称为桶,如果通过key计算hash值发生冲突时,那么将采用链表的形式,来存储元素。HashMap的扩容操作是一项很耗时的任务,所以如果能估算Map的容量,最好给它一个默认初始值,避免进行多次扩容。HashMap的线程是不安全的,多线程环境中推荐是ConcurrentHashMap

3、说说你知道的几个Java集合类:list、set、queue、map实现类?

这张图简单揭示了Set、List与Map之间的相对关系。


Collection是Java中最基本的集合接口。它描述了一组有关集合操作的方法。
int Size(); //集合大小
boolean isEmpty(); //是否为空
boolean contains(Object o); //是否包含某个对象
Iterator<E> iterator(); //返回一个迭代对象,用来遍历集合中的元素
Object[] toArray(); //将集合中的元素以数组形式然后返回
<T> T[] toArray(T[] a); //上一个方法的泛型形式
boolean add(E e); //将对象e添加进集合,添加成功则返回true
boolean remove(Object o); //移除某个元素
boolean containsAll(Collection<?> c); //传入一个集合c,如果c中的元素都存在,则返回true
boolean addAll(Collection<? extends E> c); //将集合c中的元素全部添加进本集合
boolean removeAll(Collection<?> c); //本集合减去c集合中的元素
boolean retainAll(Collection<?> c); //取本集合和c集合的交集
void clear(); //清空集合
boolean equals(Object o); //判断相等
int hashCode(); //获取集合当前的hash值



Set接口
Set接口直接继承自Collection接口,并且方法接口上也一模一样。Set对添加的元素有一些要求,其不允许出现重复的元素,并且元素之间没有次序。这相当于一个不允许重复的离散的集合。因此,添加进Set的元素类型需要定义equals方法。若是使用自定义的类,则应该重写equals方法来确保实现自己需要的功能。
Set接口主要实现了两个类:HashSet,TreeSet。
HashSet是按照哈希来存取元素的,因此速度较快。HashSet继承自抽象类AbstractSet,然后实现了Set、Cloneable、Serializable接口。 
TreeSet也是继承自AbstractSet,不过不同的是其实现的是NavigableSet接口。而NavigableSet继承自SortedSet。SortedSet是一个有序的集合。其添加的元素必须实现了Comparable接口,因为其在添加一个元素的时候需要进行排序。NavigableSet则提供了更多的有关元素次序的方法。

List接口也是继承自Collection。与Set不同的是,List可以存储重复的元素。主要有两种实现:ArrayList和LinkedList。 
ArrayList没有什么好说的,就像传统的数组一样,有着很快的随机存取速度,但是插入删除的速度就很慢。 
LinkedList则与ArrayList恰恰相反,因为用链表来保存数据,所以插入删除元素的速度很快,但是访问数据的速度就不如ArrayList了。

Map接口

Map(映射)是一个存储键值对的容器接口。每一个元素包含一个key对象和value对象,且元素不允许重复。 
Map接口的实现有以下几个: 
HashMap是最常用的一个实现。HashMap使用hash映射来存取数据,这个速度是相当快,是O(1)的速度。其容量capacity,和负载因子load factor可以在一开始设定。当元素个数达到capacity*load factor的时候,就会进行扩容。 
LinkedHashMap和HashMap类似,只不过内部用链表来维护次序。因此遍历时候的顺序是其插入顺序。 
TreeMap是基于红黑树的Map,插入的数据被有次序保存,并且有很高的效率。因此在遍历输出的时候可以得到排序的数据。但是这要求插入的数据实现了comparable接口。

总结

  1. Collection、Set、List和Map都是接口,不能被实例化。
  2. Set和List都继承自Collection,而Map则和Collection没什么关系。
  3. Set和List的区别在于Set不能重复,而List可以重复。
  4. Map和Set与List的区别在于,Map是存取键值对,而另外两个则是保存一个元素。

4.Java中的队列都有哪些,有什么区别。

阻塞队列与普通队列的而区别在于,当队列是空时,从队列中获取元素的操作会被阻塞,或则当队列是满的时,往队列中增加元素会被阻塞,试图从空的队列中取元素的线程或从满的队列中添加元素的线程同样会被阻塞。

队列的两个基本操作是inserting(插入)一个数据项,即把一个数据项放入队尾,另一个是removing(移除)一个数据项,即移除队头的数据项。这类似于电影爱好者排队买票时先排到队尾,然后到达队头买票后离开队列。

5、反射中,Class.forName和classloader的区别


java中class.forName()和classLoader都可用来对类进行加载。
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。


6、Java8的新特性

Annotation 注解

在Java 8中支持多重注解了,先看个例子来理解一下是什么意思。首先定义一个包装类Hints注解用来放置一组具体的Hint注解:


Date API

Java 8 在包java.time下包含了一组全新的时间日期API。新的日期API和开源的Joda-Time库差不多,但又不完全一样,下面的例子展示了这组新API里最重要的一些部分:Clock 时钟

Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数。某一个特定的时间点也可以使用Instant类来表示,Instant类也可以用来创建老的java.util.Date对象。


Lambda 表达式

首先看看在老版本的Java中是如何排列字符串的:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

Collections.sort(names, new Comparator<String>() {    @Override    public int compare(String a, String b) {        return b.compareTo(a);    }});

只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。

在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:

Collections.sort(names, (String a, String b) -> {    return b.compareTo(a);});

看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短:

Collections.sort(names, (String a, String b) -> b.compareTo(a));

对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,但是你还可以写得更短点:

Collections.sort(names, (a, b) -> b.compareTo(a));

7、Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高

数组:
数组就像一个班级一样,一旦分完班,一个班多少人,每个人的学号啥的都是确定的啦,根据学号,喊一个学号就会有个人中,
这个学号就是下标,根据下标找人就是快。单个之间关系不大

链表:

链表就像一个铁链,一环扣一环,不能跳过一个,直接去找下一个,必须挨个找,根据节点的next的指向,查找,要查找就得一个个查。

根据下标定位的情况肯定是数组速度快,但是如果是谈到有增删的操作那肯定是链表更加方便。

8、Java内存泄露的问题调查定位:jmap,jstack的使用等等。

    参考答案:https://blog.csdn.net/gzh0222/article/details/8538727

9、string、stringbuilder、stringbuffer区别

   参考答案:http://www.cnblogs.com/xudong-bupt/p/3961159.html

10、hashtable和hashmap的区别

 参考答案:http://www.importnew.com/24822.html

https://blog.csdn.net/fujiakai/article/details/51585767

11、异常的结构,运行时异常和非运行时异常,各举个例子


14、String a= “abc” String b = "abc" String c = new String("abc") String d = "ab" + "c" .他们之间用 == 比较的结果

15、String 类的常用方法

16、Java 的引用类型有哪几种

17、抽象类和接口的区别

18、java的基础类型和字节大小。

19、Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题(建议熟悉 jdk 源码,才能从容应答)

20、如果不让你用Java Jdk提供的工具,你自己实现一个Map,你怎么做。说了好久,说了HashMap源代码,如果我做,就会借鉴HashMap的原理,说了一通HashMap实现

21、 Hash冲突怎么办?哪些解决散列冲突的方法?

22、HashMap冲突很厉害,最差性能,你会怎么解决?从O(n)提升到log(n)咯,用二叉排序树的思路说了一通

23、rehash

24、hashCode() 与 equals() 生成算法、方法怎么重写

 

二、Java IO

 

1、讲讲IO里面的常见类,字节流、字符流、接口、实现类、方法阻塞。

2、讲讲NIO。

3、String 编码UTF-8 和GBK的区别?

4、什么时候使用字节流、什么时候使用字符流?

5、递归读取文件夹下的文件,代码怎么实现

 

三、Java Web

 

1、session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。

2、servlet的一些相关问题

3、webservice相关问题

4、jdbc连接,forname方式的步骤,怎么声明使用一个事务。举例并具体代码

5、无框架下配置web.xml的主要配置内容

6、jsp和servlet的区别

 

四、JVM

 

1、Java的内存模型以及GC算法

2、jvm性能调优都做了什么

3、介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明

4、介绍GC 和GC Root不正常引用。

5、自己从classload 加载方式,加载机制说开去,从程序运行时数据区,讲到内存分配,讲到String常量池,讲到JVM垃圾回收机制,算法,hotspot。反正就是各种扩展

6、jvm 如何分配直接内存, new 对象如何不分配在堆而是栈上,常量池解析

7、数组多大放在 JVM 老年代(不只是设置 PretenureSizeThreshold ,问通常多大,没做过一问便知)

8、老年代中数组的访问方式

9、GC 算法,永久代对象如何 GC , GC 有环怎么处理

10、谁会被 GC ,什么时候 GC

11、如果想不被 GC 怎么办

12、如果想在 GC 中生存 1 次怎么办

 

五、开源框架

 

1、hibernate和ibatis的区别

2、讲讲mybatis的连接池。

3、spring框架中需要引用哪些jar包,以及这些jar包的用途

4. springMVC的原理

5、springMVC注解的意思

6、spring中beanFactory和ApplicationContext的联系和区别

7、spring注入的几种方式(循环注入)

8、spring如何实现事物管理的

9、springIOC

10、spring AOP的原理

11、hibernate中的1级和2级缓存的使用方式以及区别原理(Lazy-Load的理解)

12、Hibernate的原理体系架构,五大核心接口,Hibernate对象的三种状态转换,事务管理。

 

六、多线程

 

1、Java创建线程之后,直接调用start()方法和run()的区别

2、常用的线程池模式以及不同线程池的使用场景

3、newFixedThreadPool此种线程池如果线程数达到最大值后会怎么办,底层原理。

4、多线程之间通信的同步问题,synchronized锁的是对象,衍伸出和synchronized相关很多的具体问题,例如同一个类不同方法都有synchronized锁,一个对象是否可以同时访问。或者一个类的static构造方法加上synchronized之后的锁的影响。

5、了解可重入锁的含义,以及ReentrantLock 和synchronized的区别

6、同步的数据结构,例如concurrentHashMap的源码理解以及内部实现原理,为什么他是同步的且效率高

7、atomicinteger和volatile等线程安全操作的关键字的理解和使用

8、线程间通信,wait和notify

9、定时线程的使用

10、场景:在一个主线程中,要求有大量(很多很多)子线程执行完之后,主线程才执行完成。多种方式,考虑效率。

11、进程和线程的区别

12、什么叫线程安全?举例说明

13、线程的几种状态

14、并发、同步的接口或方法

15、HashMap 是否线程安全,为何不安全。 ConcurrentHashMap,线程安全,为何安全。底层实现是怎么样的。

16、J.U.C下的常见类的使用。 ThreadPool的深入考察; BlockingQueue的使用。(take,poll的区别,put,offer的区别);原子类的实现。

17、简单介绍下多线程的情况,从建立一个线程开始。然后怎么控制同步过程,多线程常用的方法和结构

18、volatile的理解

19、实现多线程有几种方式,多线程同步怎么做,说说几个线程里常用的方法

 

七、网络通信

 

1、http是无状态通信,http的请求方式有哪些,可以自己定义新的请求方式么。

2、socket通信,以及长连接,分包,连接异常断开的处理。

3、socket通信模型的使用,AIO和NIO。

4、socket框架netty的使用,以及NIO的实现原理,为什么是异步非阻塞。

5、同步和异步,阻塞和非阻塞。

6、OSI七层模型,包括TCP,IP的一些基本知识

7、http中,get post的区别

8、说说http,tcp,udp之间关系和区别。

9、说说浏览器访问www.taobao.com,经历了怎样的过程。

10、HTTP协议、  HTTPS协议,SSL协议及完整交互过程;

11、tcp的拥塞,快回传,ip的报文丢弃

12、https处理的一个过程,对称加密和非对称加密

13、head各个特点和区别

14、说说浏览器访问www.taobao.com,经历了怎样的过程。

 

八、数据库MySql

 

 

1、MySql的存储引擎的不同

2、单个索引、联合索引、主键索引

3、Mysql怎么分表,以及分表后如果想按条件分页查询怎么办(如果不是按分表字段来查询的话,几乎效率低下,无解)

4、分表之后想让一个id多个表是自增的,效率实现

5、MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog),读写分离

6、写SQL语句。。。

7、索引的数据结构,B+树

8、事务的四个特性,以及各自的特点(原子、隔离)等等,项目怎么解决这些问题

9、数据库的锁:行锁,表锁;乐观锁,悲观锁

10、数据库事务的几种粒度;

11、关系型和非关系型数据库区别

 

九、设计模式

 

1、单例模式:饱汉、饿汉。以及饿汉中的延迟加载,双重检查

2、工厂模式、装饰者模式、观察者模式。

3、工厂方法模式的优点(低耦合、高内聚,开放封闭原则)

 

十、算法

 

1、使用随机算法产生一个数,要求把1-1000W之间这些数全部生成。(考察高效率,解决产生冲突的问题)

2、两个有序数组的合并排序

3、一个数组的倒序

4、计算一个正整数的正平方根

5、说白了就是常见的那些查找、排序算法以及各自的时间复杂度

6、二叉树的遍历算法

7、DFS,BFS算法

9、比较重要的数据结构,如链表,队列,栈的基本理解及大致实现。

10、排序算法与时空复杂度(快排为什么不稳定,为什么你的项目还在用)

11、逆波兰计算器

12、Hoffman 编码

13、查找树与红黑树

 

十一、并发与性能调优

 

1、有个每秒钟5k个请求,查询手机号所属地的笔试题(记得不完整,没列出),如何设计算法?请求再多,比如5w,如何设计整个系统?

2、高并发情况下,我们系统是如何支撑大量的请求的

3、集群如何同步会话状态

4、负载均衡的原理

5、如果有一个特别大的访问量,到数据库上,怎么做优化(DB设计,DBIO,SQL优化,Java优化)

6、如果出现大面积并发,在不增加服务器的基础上,如何解决服务器响应不及时问题“。

7、假如你的项目出现性能瓶颈了,你觉得可能会是哪些方面,怎么解决问题。

8、如何查找 造成 性能瓶颈出现的位置,是哪个位置照成性能瓶颈。

9、你的项目中使用过缓存机制吗?有没用用户非本地缓存

 

十二、其他

 

1、常用的linux下的命令





  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值