不能被繼承,由於String類有final修飾符,而final修飾的類是不能被繼承的。
Java對String類的定義:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // 省略... }
七

八
一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實現了Set接口,它不容許集合中有重複的值,當咱們提到HashSet時,第一件事情就是在將對象存儲在HashSet以前,要先確保對象重寫equals()和hashCode()方法,這樣才能比較對象的值是否相等,以確保set中沒有儲存相等的對象。若是咱們沒有重寫這兩個方法,將會使用這個方法的默認實現。github
public boolean add(Object o)方法用來在Set中添加元素,當元素值重複時則會當即返回false,若是成功添加的話會返回true。面試
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的區別。編程
*HashMap* | *HashSet* |
HashMap實現了Map接口 | HashSet實現了Set接口 |
HashMap儲存鍵值對 | HashSet僅僅存儲對象 |
使用put()方法將元素放入map中 | 使用add()方法將元素放入set中 |
HashMap中使用鍵對象來計算hashcode值 | HashSet使用成員對象來計算hashcode值,對於兩個對象來講hashcode可能相同,因此equals()方法用來判斷對象的相等性,若是兩個對象不一樣的話,那麼返回false |
HashMap比較快,由於是使用惟一的鍵來獲取對象 | HashSet較HashMap來講比較慢 |
二數組
Object的直接子類網絡
三
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正常回收,致使內存泄露。
六
不能被繼承,由於String類有final修飾符,而final修飾的類是不能被繼承的。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // 省略... }
七
八