撩課-Java每天10道面試題第5天

来源:https://www.cnblogs.com/gxq666/archive/2018/11/14/9955915.html
-Advertisement-
Play Games

41.Iterator、ListIterator 和 Enumeration的區別? 迭代器是一種設計模式, 它是一個對象, 它可以遍歷並選擇序列中的對象, 而開發人員不需要瞭解 該序列的底層結構。 迭代器通常被稱為“輕量級”對象, 因為創建它的代價小。 Java中的Iterator功能比較簡單, ...


41.Iterator、ListIterator 和 Enumeration的區別?
迭代器是一種設計模式,
它是一個對象,
它可以遍歷並選擇序列中的對象,
而開發人員不需要瞭解
該序列的底層結構。
迭代器通常被稱為“輕量級”對象,
因為創建它的代價小。
Java中的Iterator功能比較簡單,
並且只能單向移動:
(1) 使用方法iterator()要求容器返回一個Iterator。
第一次調用Iterator的next()方法時,
它返回序列的第一個元素。
註意:iterator()方法是java.lang.Iterable介面
被Collection繼承。
(2) 使用next()獲得序列中的下一個元素。
(3) 使用hasNext()檢查序列中是否還有元素。
(4) 使用remove()將迭代器新返回的元素刪除。
Iterator是Java迭代器最簡單的實現,
為List設計的ListIterator具有更多的功能,
它可以從兩個方向遍歷List,
也可以從List中插入和刪除元素。
-------------
ListIterator的特點:
它的父類介面是Iterator,
名稱是系列表迭代器,
允許程式員按任一方向遍歷列表、
迭代期間修改列表,
並獲得迭代器在列表中的當前位置。
ListIterator沒有當前元素,
它的游標位置始終位於調用previous()
所返回的元素和調用next()
所返回的元素之間。
長度為n的列表的迭代器有n+1個
可能的指針位置。
------------------
Enumeration的特點:
API中是這樣描述的,
它主要是和Vector結合配套使用。
另外此介面的功能與Iterator介面的功能是重覆的,
此外,Iterator介面添加了
一個可選的移除操作,
並且使用較短的方法名。
新的實現應該優先
考慮使用Iterator介面
而不是Enumeration介面。
-----------------------
java中的集合類都提供了
返回Iterator的方法,
就是迭代器,
它和Enumeration的主要區別
其實就是Iterator可以刪除元素,
但是Enumration卻不能。

 

42.Java 中 Set 與 List 有什麼不同?
1、Set 不允許重覆,List允許重覆 
2、Set 沒有順序,List有順序 

List介面對Collection進行了簡單的擴充,
它的具體實現類常用的有ArrayList和LinkedList。
你可以將任何東西放到一個List容器中,
併在需要時從中取出。
ArrayList從其命名中可以看出
它是一種類似數組的形式進行存儲,
因此它的隨機訪問速度極快,
而LinkedList的內部實現是鏈表,
它適合於在鏈表中間
需要頻繁進行插入和刪除操作。
在具體應用時可以根據需要自由選擇。
前面說的Iterator只能對容器進行向前遍歷,
而ListIterator則繼承了Iterator的思想,
並提供了對List進行雙向遍歷的方法。 

Set介面也是Collection的一種擴展,
而與List不同的時,
在Set中的對象元素不能重覆,
也就是說你不能把同樣的東西
兩次放入同一個Set容器中。
它的常用具體實現有HashSet和TreeSet類。
HashSet能快速定位一個元素,
但是你放到HashSet中的對象
需要實現hashCode()方法,
它使用了前面說過的哈希碼的演算法。
而TreeSet則將放入
其中的元素按序存放,
這就要求你放入
其中的對象是可排序的,
這就用到了集合框架提供的
另外兩個實用類Comparable和Comparator。
一個類是可排序的,
它就應該實現Comparable介面。
有時多個類具有相同的排序演算法,
那就不需要在每分別重覆定義
相同的排序演算法,
只要實現Comparator介面即可。
集合框架中還有兩個很實用的公用類:
Collections和Arrays。
Collections提供了對一個Collection容器
進行諸如排序、複製、查找和填充等
一些非常有用的方法,
Arrays則是對一個數組進行類似的操作。 

 

43.arraylist 與 vector 的區別?
ArrayList與Vector的區別,
這主要包括兩個方面:. 
1.同步性:
Vector是線程安全的,
也就是說是它的方法之間是線程同步的,
而ArrayList是線程式不安全的,
它的方法之間是線程不同步的。
如果只有一個線程會訪問到集合,
那最好是使用ArrayList,
因為它不考慮線程安全,
效率會高些;
如果有多個線程會訪問到集合,
那最好是使用Vector,
因為不需要我們自己
再去考慮和編寫線程安全的代碼。

備註:
對於Vector&ArrayList、Hashtable&HashMap,
要記住線程安全的問題,
記住Vector與Hashtable是舊的,
是java一誕生就提供了的,
它們是線程安全的,
ArrayList與HashMap是java2時才提供的,
它們是線程不安全的。

2.數據增長:
ArrayList與Vector
都有一個初始的容量大小,
當存儲進它們裡面的元素的個數超過了容量時,
就需要增加ArrayList與Vector的存儲空間,
每次要增加存儲空間時,
不是只增加一個存儲單元,
而是增加多個存儲單元,
每次增加的存儲單元的個數
在記憶體空間利用與程式效率之間
要取得一定的平衡。
Vector預設增長為原來兩倍,
而ArrayList的增長策略
在文檔中沒有明確規定
從源代碼看到的是增長為原來的1.5倍。
ArrayList與Vector都可以設置初始的空間大小,
Vector還可以設置增長的空間大小,
而ArrayList沒有提供
設置增長空間的方法。
總結:
即Vector增長原來的一倍,
ArrayList增加原來的0.5倍。

 

44.什麼類實現了List介面?
List介面的實現類中
最經常使用最重要的就是這三個:
ArrayList、
Vector、
LinkedList。

1.三個都直接實現了AbstractList這個抽象類
2,ArrayList和Vector都實現了
RandomAccess介面。
而LinkedList沒有。
這是什麼意思呢?              
在JDK 中,
RandomAccess介面是一個空介面,
所以它沒有實際意義。就是一個標記,
標記這個類支持高速隨機訪問,
所以,arrayList和 vector是支持隨機訪問的,
可是LinkedList不支持持         
3.serializbale介面表明他們都支持序列化。

 

45.什麼類實現了Set介面?
HashSet
LinkedHashSet
TreeSet

HashSet是使用哈希表(hash table)實現的,
其中的元素是無序的。
HashSet的
add、
remove、
contains方法 
的時間複雜度為常量O(1)。
--------------------
TreeSet使用樹形結構
演算法書中的紅黑樹red-black tree
實現的。
TreeSet中的元素是可排序的,
但add、remove和contains方法的時間
複雜度為O(log(n))。
TreeSet還提供了
first()、
last()、
headSet()、
tailSet()等
方法來操作排序後的集合。
-----------------------
LinkedHashSet介於HashSet和TreeSet之間。
它基於一個由鏈表實現的哈希表,
保留了元素插入順序。
LinkedHashSet中基本方法的
時間複雜度為O(1)。

 

46.如何保證一個集合線程安全?
Java提供了不同層面的線程安全支持。
在傳統集合框架內部,
除了Hashtable等同步容器,
還提供了所謂的同步包裝器(Synchronized Wrapper),
可以調用Collections工具類提供的包裝方法,
來獲取一個同步的包裝容器,
例如Collections.synchronizedMap()。
但是它們都是利用非常粗粒度的同步方式,
在高併發情況下的性能比較低下。
另外,更加普遍的選擇是利用併發包(java.util.concurrent)
提供的線程安全容器類:
各種併發容器,
比如ConcurrentHashMap、
CopyOnWriteArrayList。
各種線程安全隊列(Queue/Deque),
比如ArrayBlockingQueue、
SynchronousQueue。
各種有序容器的線程安全版本等。
具體保證線程安全的方式,
包括有從簡單的synchronized方式,
到基於更加精細化的,
比如基於分離鎖實現的ConcurrentHashMap等併發實現等。
具體選擇要看開發的場景需求,
總體來說,
併發包內提供的容器通用場景,
遠遠優於早期的簡單同步實現。

為什麼需要ConcurrentHashMap
首先,Hashtable本身比較低效,
因為它的實現基本就是
將put、get、size等方法
簡單粗暴地加上“synchronized”。
這就導致了所有併發操作都要競爭同一把鎖,
一個線程在進行同步操作時,
其它線程只能等待,
大大降低了併發操作的性能。

 

47.是否可以往 TreeSet 或者 HashSet 中添加 null 元素?
1.TreeSet 是二差樹實現的,
Treeset中的數據是自動排好序的,
不允許放入null值 

2.HashSet 是哈希表實現的,
HashSet中的數據是無序的,
可以放入null,
但只能放入一個null,
兩者中的值都不能重覆,
就如資料庫中唯一約束 

3.HashSet要求放入的對象
必須實現HashCode()方法,
放入的對象,是以hashcode碼作為標識的,
而具有相同內容的String對象,
hashcode是一樣,
所以放入的內容不能重覆。
但是同一個類的對象可以放入不同的實例

 

48.hashCode() 和 equals() 方法的重要性?如何在Java中使用它們?
Java中的HashMap使用
hashCode()和equals()方法
來確定鍵值對的索引,
當根據鍵獲取值的時候
也會用到這兩個方法。 
如果沒有正確的實現這兩個方法,
兩個不同的鍵可能會有相同的hash值,
因此可能會被集合認為是相等的。 
而且,這兩個方法也用來發現重覆元素,
所以這兩個方法的實現對HashMap的
精確性和正確性是至關重要的。

同一個對象(沒有發生過修改)
無論何時調用hashCode(),
得到的返回值必須一樣。
hashCode()返回值相等,
對象不一定相等,
通過hashCode()和equals()
必須能唯一確定一個對象。
一旦重寫了equals(),
就必須重寫hashCode()。
而且hashCode()生成哈希值的依據應該是
equals()中用來比較是否相等的欄位。
如果兩個由equals()規定相等的對象
生成的hashCode不等,
對於HashMap來說,
他們可能分別映射到不同位置,
沒有調用equals()比較是否相等的機會,
兩個實際上相等的對象可能被插入到不同位置,
出現錯誤。
其他一些基於哈希方法的集合類
可能也會有這個問題。
----------------
怎麼判斷兩個對象是相同的?
使用等號== 判斷兩個對象是否相同,
這種是嚴格的相同,
即記憶體中的同一個對象
 Object的equal方法就是使用==判斷兩個對象是否相同
------------
集合set要求元素是唯一的,怎麼實現?
要實現元素的唯一,
需要在往集合set中添加元素時,
判斷集合set是否存在相同的元素,
如果存在,則不添加,反之。
那麼怎麼確定兩個元素是否相同,
1.如果是使用等號==判斷兩個元素是否相同,
即預設使用Object的equals的方法。
2.如果沒有使用等號==判斷兩個元素是否相同,
而是按照某種業務規則判斷兩個元素是否相同,
即重寫了Object的equals的方法。
----------------------
當重寫equals方法,必須重寫hashCode方法嗎?
不是必須的,
得看具體的情況
當equals方法返回的結果和使用等號
比較的結果是一致的時候,
是沒有必要重寫hashCode方法。
當用等號比較對象,
只有是記憶體中同一個對象實例,
才會返回true,
當然調用其hashCode()方法
肯定返回相同的值,
這滿足了滿足了hashCode的約束條件,
所以不用重寫hashCode()方法。

當equals方法返回的結果
和使用等號比較的結果是不一致的時候,
就需要重寫hashCode方法。
當重寫後的equals方法
不認為只有是在記憶體中同一個對象實例,
才返回true,
如果不重新hashCode方法()
Object的hashCode()方法 是對記憶體地址的映射,
hashCode方法返回的值肯定是不同的,
這違背了hashCode的約束條件,
所以必須要重新hashCode方法,
並滿足對hashCode的約束條件。

 

49.array 和 arraylist 的區別?
兩者間的區別:
Array 的容量是固定的,
ArrayList 的容量是根據需求自動擴展
ArrayList 提供了 添加、插入或移除
 某一範圍元素的方法
而 Array 中,
只能一次獲取或設置一個元素值
用Synchronized方法可以
很容易地創建ArrayList的同步版本
而 Array 將一直保持
它知道用戶實現同步為止
 
array 數組的用法
type [] name = new type [size];
註意:size不能省略,type前後要一致
缺點:在數據間插入數據是


ArrayList 動態數組的用法
是 Array 的複雜版本
 動態的增加和減少元素,
實現 ICollection 和 IList 介面
靈活的設置數組大小

 

50.如何將一個字元串轉換為arraylist?
string 轉 ArrayList
先將字元串按照某個字元切割,轉為string數組
然後用Arrays的asList方法,將數組轉為List
public class test1 {
    public static void main(String[] args)  {
        //string 轉 ArrayList
        String str1 = "a,b,c";
        ArrayList<String> list = 
        new ArrayList<String>(Arrays.asList(str1.split(",")));
        System.out.println(list);
    }
}

ArrayList 轉 string
public class test1 {
    public static void main(String[] args)  {
        //ArrayList 轉 string
        ArrayList<String> list = new ArrayList<String>();

        list.add("a");
        list.add("b");
        list.add("c");

        System.out.println(list);//[a, b, c]

        String list_str = StringUtils.join(list,",");

        System.out.println(list_str);//a,b,c
    }
}

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 抽象工廠模式簡介,介紹了抽象工廠模式意圖,結構,產品族以及產品等級的概念,並且提供了代碼示例java版抽象工廠模式,抽象工廠模式與工廠模式的對比差異 ...
  • istio sidecar自動註入過程分析 sidecar自動註入檢查 istio通過 "mutating webhook admission controller" 機制實現sidecar的自動註入.istio sidecard在每個服務創建pod時都會被自動註入. 檢查kube apiserve ...
  • 系統架構設計師-需求 前言: 最近很久沒有發文章了。最近事情挺多的,也不知道該發那方面的內容。正好這兩天有空閑,就整理整理思緒,把一些總結髮表一下。 經過考慮後,先將軟考-架構相關的內容發出來,之後有時間,也會將一些額外的理論知識和經驗寫出來。 參考:《系統架構設計師考試全程指導》,《系統架構設計師 ...
  • 距離《 "重磅:Spring Boot 2.0 正式發佈!" 》已經過去大半年了,而 Spring Boot 2.1.0 在 10 月底就發佈了,我們來看下 Spring Boot 2.1.0 都更新了什麼,每一個 Java 技術人都值得關註。 棧長其實早就看到了更新了,現在才有時間來更新下。 1、 ...
  • 1、讀取cookies 2、將cookies保存在文件中 3、處理異常 URLError和HTTPError類,兩個類是父子關係,HTTPError會返回錯誤代碼,兩個類都可以處理request模塊產生的異常,這兩個都有一個reason屬性,用於記錄出現異常的原因 URLError處理異常: HTT ...
  • [TOC] 1.遷移 創建完模型類後,並沒有真正的在資料庫中創建了數據表,需要執行遷移命令,在數據表中創建數據表。 1.生成遷移文件 文件所在目錄執行命令 2.執行遷移命令 文件所在目錄執行命令 執行命令後到資料庫中查看是創建好了數據表。 添加測試數據 檢查資料庫中是否添加了數據。 ...
  • 我的博客: https://huangguangda.cn/ https://huangguangda.github.io/ 前言: 編碼解碼:編碼時將信息從一種形式變成為另一種形式,成為編碼.編碼為 ,逆過程為解碼.編碼時用代碼表示的,解碼為 ,有了編碼就有相關的編碼表,是對生活中的文件和電腦進 ...
  • 0.前言 最近老師佈置了一項用Java寫資源管理器的任務,一開始以為簡單,但是實際操作起來,卻發現網上的資源用起來相對生疏。在使用中,我也遇到了許多問題,雖然不能像其他博主一樣,寫的非常齊全,但我還是分享一下我寫的代碼。 1.準備知識 JTree是樹形結構,是我們做資源管理器的必要組件。其構造函數的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...