1. 程式人生 > >Map中使用陣列作為key的用法

Map中使用陣列作為key的用法

這個是今天我的個人經歷,作為經驗教訓,鄙視自己一下。

先說下問題,在網上查了下,我用的是ConCurrentMap介面來作為引用,建立的ConCurrentHashMap做鍵值對的處理,這個不是主要的,主要的是Map中使用的陣列Key。

通過一下一段程式碼來說明一下我的問題所在吧:

package com.test;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class TestMap {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ConcurrentMap<String[], String> map = new ConcurrentHashMap<String[], String>();
		String[] str1 = {"1", "001"};
		String[] str2 = {"2", "002"};
		
		map.put(str1, "1001");
		map.put(str2, "2002");
		
		String[] str3 = {"1", "001"};
		
		
		System.out.println(map.get(str3));
	}

}

以Map為說明,我在map中put了兩個值,泛型中分別是以String陣列為key,String為value。

分別是以str1和str2作為引用,然後我在get的時候,想通過同樣的key陣列來呼叫str1的值,但是始終是null。

基礎不紮實的我搞這個竟然搞了一天,真是慚愧。

最終經人提醒,才發現了Map在進行put的時候,如果key作為以陣列或其他非字串為鍵的時候,

java內部是視為其Object型別的,因此put到記憶體中的時候,它存在於一個具體的地址。

用debug來除錯的話,顯示為如下內容:

{[Ljava.lang.String;@1006d75=1001, [Ljava.lang.String;@1125127=2002}

因此當指定一個相同的字串陣列的時候,也不會找到上述對應的value,因為你給予的str3,在記憶體中的地址根本就是不存在的。

具體解決的辦法,可以通過map的keySet方法,並獲得你的iterator方法,在遍歷迴圈中找到你的資訊,即你傳遞的兩個陣列來判斷匹配是否等於之前put進去的值,最終來取到這個值。

不知道本人有沒有敘述明白,如有問題,請高手看到給你糾正,謝謝。

相關推薦

Map使用陣列作為key用法

這個是今天我的個人經歷,作為經驗教訓,鄙視自己一下。 先說下問題,在網上查了下,我用的是ConCurrentMap介面來作為引用,建立的ConCurrentHashMap做鍵值對的處理,這個不是主要的,主要的是Map中使用的陣列Key。 通過一下一段程式碼來說明一下我的問題

Javamap值按照key鍵和value值分別排序

參考:https://www.cnblogs.com/zhujiabin/p/6164826.html 1. 按照key排序,可以藉助有序集合TreeMap實現,如下: @Test public void sortByMapKey() { Map<String,Str

std::maperase的正確用法

                STL的map表裡有一個erase方法用來從一個map中刪除掉指令的節點eg:map<string,string> mapTest;typedef map<string,string>::iterator ITER;ITER iter=mapTest.f

Map,屬性entryset用法

因為在 前一篇 ImageLoader 需要使用到 Auth token 來下載某個使用者的檔案的縮圖,所以需要透過 image loader 的 getExtraForDownloader 傳進 extra, extra 是一個 object, 傳進去前是一個dictionary (map 或 entry

java 獲取map所有的key

java.util.Iterator it = map.entrySet().iterator(); while(it.hasNext()){       java.util.Map.Entry entry = (java.util.Map.Entry)it.next();       entry.getKe

C++陣列作為形參時,實際傳的是指標

傳陣列時,實際上是建立了臨時的指標變數,指向傳進去的那個陣列。在函式中改變形引數組(臨時指標變數)的指向是可以的,只不過這樣做不會改變原來的陣列 //例子說明陣列做形參時,實際上是用一個臨時指標變數做形參,指向傳進去的陣列首地址。實際的陣列是常指標,不能改變它的值。 #i

shell指令碼 陣列的基本用法

在shell指令碼中,陣列 也是一種常用的資料結構,這篇文章簡單 說一下 陣列的基本用法. 1 陣列的宣告 這樣就可以 宣告 arr  ,和 iplist 的陣列 #陣列的宣告 # 用 declare -a variable 語句來清楚地指定一個數組 # 宣告一個數組

react native陣列key

Warning:Each child in an array or iterator should have a unique “key” prop. 解決方法:在陣列名.map等迴圈子項中新增key屬性 array.map((value, index) => {

詳談C++陣列作為函式引數

一、一個例子引發的思考   執行以下程式碼,請問輸出是什麼?例子來源於《劍指Offer》,我對書上例子做了修改,讓其可以執行。 #include<iostream> using namespace std; int GetSize(int da

php-file_get_contents取檔案陣列元素的用法

用file_get_contents()抓取了 這個網址上的內容http://simonfenci.sinaapp.com/index.php?key=simon&wd=1314abc看似好像反回的是陣列。。但是我不管怎麼用foreach迴圈都報錯。。我只想把陣列中

PHP Study第七章 -----PHP陣列的常見用法

<?php /*7:陣列的型別  * 7.1略過了,反正是建立陣列  */ /*7.3 陣列的型別  * 7.3.1 陣列索引型別  * 預設索引值是數字,從0開始  */ /*7.3.2 關聯陣列 鍵名是數字和字串的混合  */  $newarray = arr

C++陣列作為函式引數或返回值

C++中陣列作為函式引數或者返回值 概述 在程式設計任務中,經常會遇到將陣列作為函式引數或者返回值,比如在前一篇的計數排序任務中,需要額外的空間來儲存排序後的元素,並且將該陣列返回給主函式。本文會介紹幾種可行的方案,僅供參考。 陣

根據value取得map對應的key

hashmap中key值是唯一的,但value是不唯一的,所以是沒有辦法通過像get(key)取value值一樣,直接取key的 值。 所以當map中沒有重複值時,根據value取得key是唯一的,但是要自己寫一個方法來讀取。 當有重複值時,取得第一個匹配的值,由於是

JAVA方法陣列作為形參,傳的是引用

之前一直以為傳陣列和基本型別都是傳的值,今天做題時發現傳陣列傳的其實是引用。 public class Tests { public static void main(String[]

JS陣列Array的用法

原文地址:http://www.blogjava.net/zks518/archive/2011/06/24/352948.html js陣列元素的新增和刪除一直比較迷惑,今天終於找到詳細說明的資料了,先給個我測試的程式碼^-^var arr = new Array();arr[0] = "aaa";arr

【基礎】結構體重載,用 char*作為std::mapkey

重載 http 註意 urn .net 參考 article 添加 無法 結構體重載 C++中,結構體是無法進行==,>,<,>=,<=,!=這些操作的,這也帶來了很多不方便的地方,尤其是在使用STL容器的時候,如果我們可以往語句中傳入結構體,一些

用 char*作為std::mapkey

宣告map時需要新增一個cmp比較函式,不然map在比較時,使用char *的指標進行比較,而不是比較char字串。 #include <cstring> struct cmp_str { bool operator()(char const *a, char

map使用自定義類指標作為key

//先上程式碼 #pragma once //想用類作為key,必須過載<運算子 或者提供 //想用指標作為key,也是可以的,不過要自己提供仿函式 class CBase { public:     explicit CBase(int a);     ~CBase(void); private:

C++ 使用陣列作為map容器VAlue值的解決方法

1)是用Vector容器代替陣列 2)使用陣列指標(需要注意區域性變數的問題,指標是否需要用new建立) int red [ 3 ] = { 1 , 0 , 0 }; int green [

Java 在 Map 使用複雜資料型別作為 Key

HashMap是一種用雜湊值來儲存和查詢鍵值對(key-value pair,也稱作entry)的一種資料結構。為了正確使用HashMap,選擇恰當的Key是非常重要的。Key在HashMap裡是不可重複的。1、什麼是可變物件可變物件是指建立後自身狀態能改變的物件。換句話說,