其餘

html

HashMap和HashSet的區別是Java面試中最常被問到的問題。若是沒有涉及到Collection框架以及多線程的面試,能夠說是不完整。而Collection框架的問題不涉及到HashSet和HashMap,也能夠說是不完整。HashMap和HashSet都是collection框架的一部分,它們讓咱們可以使用對象的集合。collection框架有本身的接口和實現,主要分爲Set接口,List接口和Queue接口。它們有各自的特色,Set的集合裏不容許對象有重複的值,List容許有重複,它對集合中的對象進行索引,Queue的工做原理是FCFS算法(First Come, First Serve)。java

首先讓咱們來看看什麼是HashMap和HashSet,而後再來比較它們之間的分別。git

什麼是HashSet

HashSet實現了Set接口,它不容許集合中有重複的值,當咱們提到HashSet時,第一件事情就是在將對象存儲在HashSet以前,要先確保對象重寫equals()和hashCode()方法,這樣才能比較對象的值是否相等,以確保set中沒有儲存相等的對象。若是咱們沒有重寫這兩個方法,將會使用這個方法的默認實現。github

public boolean add(Object o)方法用來在Set中添加元素,當元素值重複時則會當即返回false,若是成功添加的話會返回true。面試

什麼是HashMap

HashMap實現了Map接口,Map接口對鍵值對進行映射。Map中不容許重複的鍵。Map接口有兩個基本的實現,HashMap和TreeMap。TreeMap保存了對象的排列次序,而HashMap則不能。HashMap容許鍵和值爲null。HashMap是非synchronized的,但collection框架提供方法能保證HashMap synchronized,這樣多個線程同時訪問HashMap時,能保證只有一個線程更改Map。算法

public Object put(Object Key,Object value)方法用來將元素添加到map中。數據庫

你能夠閱讀這篇文章看看HashMap的工做原理,以及這篇文章看看HashMap和HashTable的區別。編程

HashSet和HashMap的區別

*HashMap* *HashSet*
HashMap實現了Map接口 HashSet實現了Set接口
HashMap儲存鍵值對 HashSet僅僅存儲對象
使用put()方法將元素放入map中 使用add()方法將元素放入set中
HashMap中使用鍵對象來計算hashcode值 HashSet使用成員對象來計算hashcode值,對於兩個對象來講hashcode可能相同,因此equals()方法用來判斷對象的相等性,若是兩個對象不一樣的話,那麼返回false
HashMap比較快,由於是使用惟一的鍵來獲取對象 HashSet較HashMap來講比較慢

數組

Object的直接子類網絡

Boolean
Character
Character.Subset
Class
ClassLoader
Compiler
Enum
Math
Number
Package
Permission
Process
PfocessBuilder
Runtime
SecurityManager
StackTraceElement
StrictMath
String
StringBuffer
StringBuilder
System
Thread
ThreadGroup
ThreadLocal
Throwable
Void

 三

Vector,ArrayList和LinkedList的大體區別以下:

一、Vector、ArrayList都是以相似數組的形式存儲在內存中,LinkedList則以鏈表的形式進行存儲。

二、List中的元素有序、容許有重複的元素,Set中的元素無序、不容許有重複元素。

三、Vector線程同步,ArrayList、LinkedList線程不一樣步。

四、LinkedList適合指定位置插入、刪除操做,不適合查找;ArrayList、Vector適合查找,不適合指定位置的插入、刪除操做。

五、ArrayList在元素填滿容器時會自動擴充容器大小的50%,而Vector則是100%,所以ArrayList更節省空間。

java中建立線程的四種方法以及區別
Java使用Thread類表明線程,全部的線程對象都必須是Thread類或其子類的實例。Java能夠用四種方式來建立線程,以下所示:

1)繼承Thread類建立線程

2)實現Runnable接口建立線程

3)使用Callable和Future建立線程

4)使用線程池例如用Executor框架

內存泄露 memory leak,是指程序在申請內存後,沒法釋放已申請的內存空間,一次內存泄露危害能夠忽略,但內存泄露堆積後果很嚴重,不管多少內存,早晚會被佔光。

一、靜態集合類引發內存泄露: 
像HashMap、Vector等的使用最容易出現內存泄露,這些靜態變量的生命週期和應用程序一致,他們所引用的全部的對象Object也不能被釋放,由於他們也將一直被Vector等引用着。

二、當集合裏面的對象屬性被修改後,再調用remove()方法時不起做用。

三、監聽器 
在java 編程中,咱們都須要和監聽器打交道,一般一個應用當中會用到不少監聽器,咱們會調用一個控件的諸如addXXXListener()等方法來增長監聽器,但每每在釋放對象的時候卻沒有記住去刪除這些監聽器,從而增長了內存泄漏的機會。

四、各類鏈接 
好比數據庫鏈接(dataSourse.getConnection()),網絡鏈接(socket)和io鏈接,除非其顯式的調用了其close()方法將其鏈接關閉,不然是不會自動被GC 回收的。對於Resultset 和Statement 對象能夠不進行顯式回收,但Connection 必定要顯式回收,由於Connection 在任什麼時候候都沒法自動回收,而Connection一旦回收,Resultset 和Statement 對象就會當即爲NULL。可是若是使用鏈接池,狀況就不同了,除了要顯式地關閉鏈接,還必須顯式地關閉Resultset Statement 對象(關閉其中一個,另一個也會關閉),不然就會形成大量的Statement 對象沒法釋放,從而引發內存泄漏。這種狀況下通常都會在try裏面去的鏈接,在finally裏面釋放鏈接。

六、單例模式

若是單例對象持有外部對象的引用,那麼這個外部對象將不能被jvm正常回收,致使內存泄露。

 六

Java中的String類可否被繼承?爲何?

不能被繼承,由於String類有final修飾符,而final修飾的類是不能被繼承的。

Java對String類的定義:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    // 省略... 
}

 

 

相關文章
相關標籤/搜索