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);
Sign up to request clarification or add additional context in comments.

3 Comments

String[] str = map1.keySet().toArray(new String[map1.size()]); you missed the parenthesis in map1.size()
String[] str = map1.keySet().toArray(new String[0]);
If you want to use Java streams: map.keySet().stream.toArray(String[]::new)
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 Comments

And you cast Object[] to Object[] at the first line?
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.
(Object[]) map1.keySet().toArray(); is not necessary to cast object array................ ..... ........ ....... Object [] obj =map1.keySet().toArray();
3

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

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

Comments

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.

Comments

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.