33

I need convert HashMap to a String array, follow is my java code

import java.util.HashMap;
import java.util.Map;

public class demo {

    public static void main(String[] args) {

        Map<String, String> map1 = new HashMap<String, String>();

        map1.put("1", "1");
        map1.put("2", "2");
        map1.put("3", "3");

        String[] str = (String[]) map1.keySet().toArray();

        for(int i=0; i<str.length;i++) {
            System.out.println(str[i]);
        }
    }
}

when I run the code, I get the following ClassCastException.

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at demo.main(demo.java:17)
0

4 Answers 4

48

toArray() returns an Object[], regardless of generics. You could use the overloaded variant instead:

String[] str = map1.keySet().toArray(new String[map1.size()]);

Alternatively, since a Set's toArray method gives no guarantee about the order, and all you're using the array for is printing out the values, you could iterate the keySet() directly:

for (String str: map1.keySet()) {
    System.out.println(str);
}

EDIT: Just to complete the picture, in Java 8, the foreach method can be used to make the code more elegant:

map1.keySet().forEach(System.out::println);
3
  • 2
    String[] str = map1.keySet().toArray(new String[map1.size()]); you missed the parenthesis in map1.size() Commented Apr 22, 2015 at 20:14
  • 1
    String[] str = map1.keySet().toArray(new String[0]); Commented Oct 21, 2018 at 12:06
  • If you want to use Java streams: map.keySet().stream.toArray(String[]::new) Commented Oct 16, 2020 at 14:56
5

It is returning Object[] Not String[]. Try this:

Object[] obj = (Object[]) map1.keySet().toArray();
for(int i=0; i<obj.length;i++) {
    String someString = (String)obj[i];
    System.out.println(someString);
}
3
  • 3
    And you cast Object[] to Object[] at the first line? Commented Oct 3, 2015 at 17:31
  • Indeed two casts (i.e. Object[] and String) cannot be done in one step. They need to be done step by step. Thanks for the great incite. Commented Apr 25, 2016 at 7:25
  • (Object[]) map1.keySet().toArray(); is not necessary to cast object array................ ..... ........ ....... Object [] obj =map1.keySet().toArray(); Commented Oct 10, 2022 at 15:19
2

toArray()method is defined in List interface so every where there is an instance of List, you also have access to this method.

At first you might think that you can cast an array of Objects which its elements are all of type String to a String array but java specs says otherwise Link, in short it says:

bArr = new B[]; A[] aArr = (A[]) bArr;

"works" at runtime if and only if B is a subtype of A (or A itself). Whether B actually only contains As is irrelevant and the compile-time type of bArr is not used either (what matters is the runtime type):

In your code by calling : image_urls.toArray() you will get an array of Object and since Object is not SubType of String, you get exception. To do this write, use other overload of toArray() which gets an array of certain type (for type reference) as "Mureinik" mentioned.

2

You can cast Object[] to String[] like this:

String[] str = map1.keySet().toArray(String[]::new);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.