java list和数组的区别

Python015

java list和数组的区别,第1张

List和ArrayList的区别在于:

1、在编程语言中ArrayList类是.Net Framework提供的用于数据存储和检索的专用类。List 类可以简单视之为双向连结串行,以线性列的方式管理物件集合。List类是ArrayList类的泛型等效类。

2、ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除。List的大部分用法都与ArrayList相似,List类也继承了IList接口。

3、在ArrayList中可以插入不同类型的数据。ArrayList会把所有插入其中的数据都当作为object类型来处理,这其中存在装箱与拆箱的操作,会对系统造成性能上的损耗。而List需要声明其数据的对象类型。声明后插入其他类型数据,IDE就会报错,且不能通过编译。

4、在使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误,即ArrayList不是类型安全的。而List已经声明过其数据的对象类型,是类型安全的,避免了前面讲的类型安全问题与装箱拆箱的性能问题。

5、ListArray就可以被构造。而List不能被构造,但可以为List创建一个引用。

扩展资料:

一、List泛型

通过允许指定泛型类或方法操作的特定类型,泛型功能将类型安全的任务从程序员转移给了编译器。不需要编写代码来检测数据类型是否正确,因为会在编译时强制使用正确的数据类型。减少了类型强制转换的需要和运行时错误的可能性。泛型提供了类型安全但没有增加多个实现的开销。

二、装箱与拆箱的概念:

1、装箱:就是将值类型的数据打包到引用类型的实例中 比如将int类型的值123赋给object对象o

int i=123object o=(object)i

2、拆箱:就是从引用数据中提取值类型 比如将object对象o的值赋给int类型的变量i

object o=123int i=(int)o

3、装箱与拆箱的过程是很损耗性能的。

参考资料:拆箱——百度百科

1.List转换成为数组。(这里的List是实体是ArrayList)

调用ArrayList的toArray方法。

toArray

public <T>T[] toArray(T[]

a)返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组,则返回放入此列表元

素的数组。否则,将根据指定数组的运行时类型和此列表的大小分配一个新的数组。

如果指定的数组能容纳列表并有剩余空间(即数组的元素比列表的多),那么会将数组中紧跟在集合末尾的元素设置为 null。这对确定列表的长度很有用,但只 在调用方知道列表中不包含任何 null 元素时才有用。

指定者:

接口 Collection<E>中的 toArray

指定者:

接口 List<E>中的 toArray

覆盖:

类 AbstractCollection<E>中的 toArray

参数:

a - 要存储列表元素的数组,如果它足够大的话;否则,它是一个为存储列表元素而分配的、具有相同运行时类型的新数组。

返回:

包含列表元素的数组。

抛出:

ArrayStoreException - 如果 a 的运行时类型不是此列表中每个元素的运行时类型的超类型。

具体用法:

List list = new ArrayList()

list.add("1")

list.add("2")

final int size = list.size()

String[] arr = (String[])list.toArray(new String[size])

2.数组转换成为List。

调用Arrays的asList方法.

asList

public static <T>

List<T>asList(T... a)返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直写”到数组。)此方法同

Collection.toArray 一起,充当了基于数组的 API 与基于 collection 的 API

之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。

此方法还提供了一个创建固定长度的列表的便捷方法,该列表被初始化为包含多个元素:

List stooges = Arrays.asList("Larry", "Moe", "Curly")

参数:

a - 支持列表的数组。

返回:

指定数组的列表视图。

另请参见:

Collection.toArray()

具体用法:

String[] arr = new String[] {"1", "2"}

List list = Arrays.asList(arr)

ArrayList<String>list=new ArrayList<String>()

String strings[]=(String [])list.toArray()

这样写代码个人觉得应该没什么问题,编译也没有问题。可是具体运行的时候报异常,如下:Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object

但是这么写是没有问题的:

ArrayList<String>list=new ArrayList<String>()

String strings[]=new String[list.size()]

for(int i=0,j=list.size()i<ji++){

strings[i]=list.get(i)

}

对于这个现象我们可以这么解释:Java中允许向上和向下转型,但是这个转型是否成功是根据Java虚拟机中这个对象的类型来实现的。Java虚拟机中保存了每个对象的类型。而数组也是一个对象。数组的类型是[Ljava.lang.Object。把[Ljava.lang.Object转换成[Ljava.lang.String是显然不可能的事情,因为这里是一个向下转型,而虚拟机只保存了这是一个Object的数组,不能保证数组中的元素是String的,所以这个转型不能成功。数组里面的元素只是元素的引用,不是存储的具体元素,所以数组中元素的类型还是保存在Java虚拟机中的。

根据上面的解释,我们可以把这个问题归纳到下面这个模型:

Object objs[]=new Object[10]

String strs[]=(String[])objs

这样子和刚才上面编译错误是一样的。如果我们修改一下这个代码,如下:

String strs[]=new String[10]

Object objs[]=strs

这样子就可以编译通过了。所以这个问题我们可以归结为一个Java转型规则的问题。下面谈一下Java数组对范型的支持问题。

JDK5中已经有了对范型的支持,这样可以保证在集合和Map中的数据类型的安全,可是,List的toArray方法返回的竟然是Object []让人很迷惑。个人感觉应该可以根据范型,直接返回相应的T []。仔细看了一下JDK的发现List转化为array有两个方法:

public Object[] toArray()

这个方法把List中的全部元素返回一个相同大小的数组,数组中的所有元素都为Object类型。

public <T>T[] toArray(T[] a)

这个方法把List中的全部元素返回一个相同大小的数组,数组中的所有元素都为T类型。

List如此设计是因为Java编译器不允许我们new范型数组。也就是说你不能这么定义一个数组:

T arr=new T[size]

但是你却可以用T[]来表示数组,而且可以把数组强制转化为T[]。比如List中的public <T>T[] toArray(T[] a)是这么实现的:

public <T>T[] toArray(T[] a) {

if (a.length <size)

a = (T[])java.lang.reflect.Array.

newInstance(a.getClass().getComponentType(), size)

System.arraycopy(elementData, 0, a, 0, size)

if (a.length >size)

a[size] = null

return a

}

从上面代码中可以看到,因为你不知道这个数组的类型,你必须通过反射机制创建这个数组(a.getClass().getComponentType()方法是取得一个数组元素的类型)。

最终,List转换为Array可以这样处理:

ArrayList<String>list=new ArrayList<String>()

String[] strings = new String[list.size()]

list.toArray(strings)

反过来,如果要将数组转成List怎么办呢?如下:

String[] s = {"a","b","c"}

List list = java.util.Arrays.asList(s)