A List is typesafe whereas an ArrayList can contain anything that inherits from Object() and is open to runtime errors if an object of unexpected type is retrieved from the ArrayList and cast to the wrong type.
Example:ListmyStringList = new List (); myStringList.Add("I like cheese.");string cheesy = myStringList[0];ArrayList myArrayList = new ArrayList();myArrayList.Add("I like cheese.");int cheesy = (int) myArrayList[0];
Both examples are perfectly legal code and will not cause a compile time error. The ArrayList example will, however, cause a run time error as you cannot cast a string to an int.
More can be found at this StackOverflow post.
