1. 程式人生 > >【Java集合類】 LinkedHashMap(有序的map)獲取第一個元素和最後一個元素

【Java集合類】 LinkedHashMap(有序的map)獲取第一個元素和最後一個元素

獲取LinkedHashMap中的頭部元素(最早新增的元素):

時間複雜度O(1)

public <K, V> Entry<K, V> getHead(LinkedHashMap<K, V> map) {
    return map.entrySet().iterator().next();
}

獲取LinkedHashMap中的末尾元素(最近新增的元素):

時間複雜度O(n)

public <K, V> Entry<K, V> getTail(LinkedHashMap<K, V> map) {
    Iterator<Entry<K, V>> iterator = map.entrySet().iterator();
    Entry<K, V> tail = null
; while (iterator.hasNext()) { tail = iterator.next(); } return tail; }

通過反射獲取LinkedHashMap中的末尾元素:

時間複雜度O(1),訪問tail屬性

public <K, V> Entry<K, V> getTailByReflection(LinkedHashMap<K, V> map)
        throws NoSuchFieldException, IllegalAccessException {
    Field tail = map
.getClass().getDeclaredField("tail"); tail.setAccessible(true); return (Entry<K, V>) tail.get(map); }

測試程式碼:

import static org.junit.Assert.assertEquals;

import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map.Entry;

import org.junit.Before;
import
org.junit.Test; public class TestLinkedHashMap { private LinkedHashMap<String, Integer> map = new LinkedHashMap<>(); private String letters[] = { "a", "b", "c", "d", "e" }; @Before public void init() { for (int i = 0; i < letters.length; i++) { map.put(letters[i], i + 1); } } @Test public void testGetHead() { assertEquals(getHead(map).getKey(), "a"); assertEquals(getHead(map).getValue(), Integer.valueOf(1)); } @Test public void testGetTail() { assertEquals(getTail(map).getKey(), "e"); assertEquals(getTail(map).getValue(), Integer.valueOf(5)); } @Test public void testGetTailByReflection() throws NoSuchFieldException, IllegalAccessException { assertEquals(getTailByReflection(map).getKey(), "e"); assertEquals(getTailByReflection(map).getValue(), Integer.valueOf(5)); } public <K, V> Entry<K, V> getHead(LinkedHashMap<K, V> map) { return map.entrySet().iterator().next(); } public <K, V> Entry<K, V> getTail(LinkedHashMap<K, V> map) { Iterator<Entry<K, V>> iterator = map.entrySet().iterator(); Entry<K, V> tail = null; while (iterator.hasNext()) { tail = iterator.next(); } return tail; } @SuppressWarnings("unchecked") public <K, V> Entry<K, V> getTailByReflection(LinkedHashMap<K, V> map) throws NoSuchFieldException, IllegalAccessException { Field tail = map.getClass().getDeclaredField("tail"); tail.setAccessible(true); return (Entry<K, V>) tail.get(map); } }

相關推薦

Java集合 LinkedHashMap(有序map)獲取第一元素最後一個元素

獲取LinkedHashMap中的頭部元素(最早新增的元素): 時間複雜度O(1) public <K, V> Entry<K, V> getHead(LinkedHashMap<K, V> map) { retu

Java集合LinkedList原始碼分析(jdk1.8)

ArrayList和LinkedList是List介面的兩種實現,具有相同的查詢、插入、刪除操作,只是底層的實現方式不一樣。LinkedList是以雙向連結串列形式實現的集合類。 其增刪操作由於不需要移

Java 集合HashtableHashMap、VectorArrayList,來說說

環境: jdk1.8 這兩類(4個類)的比較經常出現在面試中: 解決思路:看原始碼 1.Hashtable和HashMap 1.Hashtable(注意table小寫)裡為了保證

Java LinkedHashMap獲取第一元素最後一個元素

Java LinkedHashMap獲取第一個元素和最後一個元素  作者是 線上瘋狂 釋出於 2016年10月27日 在 Java. 獲取LinkedHashMap中的頭部元素(最早新增的元素): 時間複雜度O(1)

Java集合框架Map與Set的有序與無序

Set本身不保證順序/* * HashSet是無序的; LinkedHashSet是按插入順序的; TreeSet是按升序的; * * HashMap是無序的;LinkedHashMap是按插

深入學習java集合系列LinkedHashMap的底層實現

最近寫到LeetCode上的某一題LRUCache。可以採用LinkedHashMap實現,通過重寫removeEldestEntry方法,即可實現。 LinkedHashMap map; public LRUCache(int capacity) {

java集合根介面Collection、Map

       Java集合類是一種非常實用的工具類,主要用於儲存、盛裝其它資料(集合裡只能儲存物件),因此集合類也被成為容器類。所有的集合類都位於java.util包下,在java.util.concurrent下還提供了一些支援多執行緒的集合類。Java的集合類主要由兩

自定義的jdbc連接工具JDBCUtilsjava 工具

tco 成功 val update red source dex imp 添加 JDBCUtils 類:   1. 創建私有的屬性*(連接數據庫必要的四個變量):dreiver url user password   2. 將構造函數私有化   3.將註冊驅動寫入靜態代碼塊

Java集合系列 總體框架

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java集合框架SDUT 3360 學生資訊的新增與查詢

Problem Description 設計一個學生新增和查詢的系統,從鍵盤讀入學生的資料,然後再從螢幕顯示出來。 Input 第一行有2個整數N和M,其中:N——學生數量,M——學生屬性數量; 第二行有M個字串,表示學生的屬性名稱,其中第1個屬性id表示關鍵字;其中各欄位屬性的資料型別

Java集合LinkedHashMap

前言 今天繼續學習關於Map家族的另一個類 LinkedHashMap 。先說明一下,LinkedHashMap 是繼承於 HashMap 的,所以本文只針對 LinkedHashMap 的特性學習,跟HashMap 相關的一些特性就不做進一步的解析了,大家有疑

Java集合系列 總體框架

根據上面的類圖,我們可以把java的所有集合分成三大類,其中Set集合類類似於一個糖罐子,把一個物件新增到Set集合裡面的時候,Set集合無法記住新增這個元素的順序,所以Set裡面的元素不能重複,否則系統無法準確識別這個元素;List集合非常像一個數組,她可以記住每次新增元素的順序,可以重複,只是List的長

Java集合系列---總體框架

集合--童年的美好時光集合,忽然讓小編想起那段美好的學生時光,集合第一次遇見她的時候,小編當年還是一個懵懂的丫頭,也不曾想過會在計算機的世界再次相遇,再回首,集合在數學中是一個基本概念,集合就是“一堆東

Java File建立檔案目錄並在指定路徑建立檔案

import java.io.File; import java.io.IOException; public class FileApp { public static void main(

Java工具----正則表示式校驗工具

/** * @Title: RegexValidateUtil.java * @Package org.csun.nc.util * @Description: TODO * @author chisj [email protected] * @da

java集合系列---HashSet

在前面的博文中,小編主要簡單介紹了java集合中的總體框架,以及list介面中典型的集合ArrayList和LinkedList,接著,我們來看set的部分集合,set集合和數學意義上的集合沒有差別,作為集合,可以容納多個元素,而且,集合裡面沒有重複的元素,Set集合是Col

Java篇04抽象方法中可以有static屬性方法嗎?小結

抽象方法中可以有Static屬性和方法嗎? 對於這個問題,網上眾說紛紜,其實,抽象類中是可以包含static屬性和static方法的,最典型的例子:Calendar類 下面直接上Calendar類的原始碼: public abstract class Calendar impleme

Java併發基礎併發程式設計領域的三問題:分工、同步互斥

前言 可以將Java併發程式設計抽象為三個核心問題:分工、同步和互斥。 這三個問題的產生源自對效能的需求。最初時,為提高計算機的效率,當IO在等待時不讓CPU空閒,於是就出現了分時作業系統也就出現了併發。後來,多核CPU出現,不同的任務可以同時獨立執行,於是就出現了並行【分工】。有了分工後,效率得到了很大的提

新人自學筆記2開發我的第一安卓APP

一、建立一個Android工程   1、在Package Explorer空白的地方右鍵-->new-->Android application project  2、next之後會來到這樣一個頁面,注意一定要指定好工作空間點選finish完成工程的建立,這時候就

JAVAJava集合: Set、List、Map、Queue使用場景梳理

本文主要關注Java程式設計中涉及到的各種集合類,以及它們的使用場景 相關學習資料 目錄 Java集合類基本概念 Java集合類架構層次關係 Java集合類的應用場景程式碼 Java集合類基本概念 在程式設計中,常常需