interface

List<String> list = new ArrayList<String>(c);

As we know, interface is an abstract class thus it cant be instantiated.
As I know, ArrayList is a concrete class which can be instantiated.
Can someone please tell me why "List<String> list = new ArrayList<String>(c);" is valid..~
In this circumstance, why List(interface) can hold an object?

As we know, interface is an abstract class thus it cant be instantiated.

Yes and no. No, interface is not an abstract class which is a different animal, and yes, both interface and abstract classes cannot be instantiated.

As I know, ArrayList is a concrete class which can be instantiated.

correct

Can someone please tell me why "List<String> list = new ArrayList<String>(c);" is valid..~
In this circumstance, why List(interface) can hold an object?

An interface is a pure type and while you cannot create a List object you certainly can create a List variable that refers to a concrete object (here ArrayList) that implements the List interface. So the key here is to understand that the line of code is not trying to instantiate a List but an ArrayList, and then place that ArrayList in a List variable. We use interface variables all the time, and they are a powerful concept since they allow you to give your code much flexibility. If later you find that the code runs more efficiently if use use a LinkedList rather than an ArrayList, it's easy to change the code so that the object referred to by the List variable is a LinkedList object, and this can be done with minimal change in existing code.

You aren't instantiating an interface in this example, you are creating a reference of that type, but the reference points to a concrete class(ArrayList), since this reference is a list, you can only call methods which the list class has. Through polymorphism the list methods work properly in this situation.

This convention allows for a lot of flexibility. Say you develop a program with data structure X which implements list and subsequently create a faster(or threadsafe, etc), data structure y which also implements list you can easily change the reference to point to y without breaking previous code.

Always remember that the reference is not actually be instantiated, instead the rvalue is.