Java 面试题总结(复答案仅供参考)

面试首先是一个双向选择, 这个一定要牢记. 公司招聘你主要是看你能否为公司带来价值.所以你面试的时候只要让面试官觉得你能带来价值即可

首先面试者需要确认自己的target:

1、明确项目是做什么的

2、明确项目的价值。(为什么做这个项目,它解决了用户什么痛点,它带来什么价值?)

3、明确项目的功能。(这个项目涉及哪些功能?)

4、明确项目的技术。(这个项目用到哪些技术?)

5、明确个人在项目中的位置和作用。(你在这个项目的承担角色?)

6、明确项目的整体架构。

7、明确项目的优缺点,如果重新设计你会如何设计。

8、明确项目的亮点。(这个项目有什么亮点?)

9、明确技术成长。(你通过这个项目有哪些技术成长?)

--------------------正文分割线--------------------

介绍一下Collection中的list和set?

原文

接口Collection

      Collection是java.util下的一个接口,它继承的类是Iterable<E>。它是关于集合方面的一个跟接口,也就是java中所有处理集合的数据方面都是直接或者间接实现Collection接口。其中java中提供了详细的Collection的API。
      Collection接口有很多的子接口,其中包括最常用的子接口就是List和Set。
      所以,针对List和Set的联系在于,它们都是Collection的子接口。
      至于区别在于哪里,下面做一下详细的介绍。
     List:这个接口能够精准的记录每一个元素的插入位置(换句话说就是这个接口内容所有元素是按照顺序去保存的),使用者可以通过索引的方式去取得某个元素的值,这个跟java中数组有点类似,List中保存的所有数据允许重复。
     Set:这个接口无法记录每一个元素的具体位置,整个集合中所有元素是无序排列的,并且Set存储数据集合是不允许有重复的元素的。
 
     既然List和Set均为接口,那么就不能直接实例化,需要借助实现他们接口的子类进行实例化,由此来使用接口中提供的各种方法。
   
     实现List接口的子类中包括:ArrayListLinkedListVector。其中ArrayList这个类是类似数组形式的集合实例化,而LinkedList类则是链表形式的实例化,具体的差别在于数据结构上面的不同。Vector 类非常类似ArrayList,两者的不同之处在于Vector是同步的方法,在多线程操作的时候可能会抛出ConcurrentModificationException。
    实现Set接口的子类中包括:HasSet。
记住下面两张图:

 

 

 

介绍一下线程安全和非线程安全?

原文:

ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题。面对这样的问题,回答是:ArrayList是非线程安全的,Vector是线程安全的;HashMap是非线程安全的,HashTable是线程安全的;StringBuilder是非线程安全的,StringBuffer是线程安全的。因为这是昨晚刚背的《Java面试题大全》上面写的。此时如果继续问:什么是线程安全?线程安全和非线程安全有什么区别?分别在什么情况下使用?这样一连串的问题,一口老血就喷出来了…

非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。

线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低

所以在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList。

非线程安全!=不安全

有人在使用过程中有一个不正确的观点:我的程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。

非线程安全并不是多线程环境下就不能使用。注意我上面有说到:多线程操作同一个对象。注意是同一个对象。比如最上面那个模拟,就是在主线程中new的一个ArrayList然后多个线程操作同一个ArrayList对象。

如果是每个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么肯定是没问题的。

 

 介绍一下hashmap?

原文

本博客链接

 HashSet 去重逻辑?

去重首先要看什么才算是重复。 也就是说对象怎么样才算是相等?

这里有两个相等性: 引用相等性 和 对象相等性。

引用相等性指的是:堆上同一个对象的两个引用。 如果对两个对象进行调用hashcode算法, 会得到相等的值。 hashcode()默认的行为会返回对象特殊的序号, 大部分的java版本是根据内存位置计算的序号,所以一般不会有相同的hashcode。

如果想知道两个对象的引用是否相等,可以使用 == 来比较。

对象相等性指的是: 堆上两个不同对象在意义上是相等的。

如果想要将两个不同的对象视为相等的,就必须覆盖从Object继承下来的hashcode算法和equals算法。

所以hashset是如何检查重复的, 就是要看怎么覆盖的hashcode()算法以及equals()

逻辑: 当你把对象加入到hashset时, 会使用对象的hashcode值来判断对象加入的位置和已经加入hashset的对象的hashcode值进行比对, 如果没有找到相同的值, 则hashset会先认为没有重复的值。

但是如果找到了有相同的hashcode的值得对象, 那么也不一定代表两个对象相等。 要进一步使用equals方法检查hashcode相等的对象是否真的相同。如果真的相同,会返回给用户一个false。

为什么不同的对象会有相同的hashcode的可能?

这要根据hashcode的算法说起, hashcode算法不好会造成hashcode碰撞, 算法好则会将对象散列均匀的分布在内存中。

 

posted @ 2018-04-19 22:36  YanyuWu  阅读(131)  评论(0)    收藏  举报