Ⅰ Array与List的优缺点
Array与List,使指数据结构概念上的数组与链表的优缺点吧.
如果指的是Array类(或接口)与List接口的优缺点的话,就不好理解了.
数组,在内存上给出了连续的空间.链表,内存地址上可以是不连续的,每个链表的节点包括原来的内存和下一个节点的信息(单向的一个,双向链表的话,会有两个).
数组优于链表的:
1.内存空间占用的少,因为链表节点会附加上一块或两块下一个节点的信息.但是数组在建立时就固定了.所以也有可能会因为建立的数组过大或不足引起内存上的问题.
2.数组内的数据可随机访问.但链表不具备随机访问性.这个很容易理解.数组在内存里是连续的空间.比如如果一个数组地址从100到200,且每个元素占用两个字节,那么100-200之间的任何一个偶数都是数组元素的地址.可以直接访问.链表在内存地址可能是分散的.所以必须通过上一节点中的信息找能找到下一个节点.
3.查找速度上.这个也是因为内存地址的连续性的问题.不罗索了.
链表优于数组的:
1.插入与删除的操作.如果数组的中间插入一个元素,那么这个元素后的所有元素的内存地址都要往后移动.删除的话同理.只有对数据的最后一个元素进行插入删除操作时,才比较快.链表只需要更改有必要更改的节点内的节点信息就够了.并不需要更改节点的内存地址.
2.内存地址的利用率方面.不管你内存里还有多少空间,如果没办法一次性给出数组所需的要空间,那就会提示内存不足,磁盘空间整理的原因之一在这里.而链表可以是分散的空间地址.
3.链表的扩展性比数组好.因为一个数组建立后所占用的空间大小就是固定的.如果满了就没法扩展.只能新建一个更大空间的数组.而链表不是固定的,可以很方便的扩展.
建议楼主看一些数据结构的书,是很重要的.
Ⅱ python array list
第三题,
>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b=a.tolist()
>>> b
[[1, 2], [3, 4]]
第二题,用上面的方法
>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[2,3],[4,5]])
>>> a.tolist()==b.tolist()
False
>>> c = np.array([[1,2],[3,4]])
>>> a.tolist()==c.tolist()
True
Ⅲ 关于ArrayList的toArray(T[])方法求解
toArray 的源代码是:
publicObject[]toArray(Objectaobj[])
{
if(aobj.length<size)
return(Object[])Arrays.Of(elementData,size,((Object)(aobj)).getClass());
System.array(((Object)(elementData)),0,((Object)(aobj)),0,size);
if(aobj.length>size)
aobj[size]=null;
returnaobj;
}
可以看出,是把ArrayList 的数据复制到new String[0],然后把这个值返回,0这个参数只是操作一次复制多少个,对返回结果没啥影响,(String[]) 这个是强转,由于ArrayList 可以放任何对象,所以如果提前知道是什么类型,可以通过强转来实现。
Ⅳ Array List
s中每次都添加player.PlayerPosition,而player.PlayerPosition只有一个,所以for每次循环中取出来的都是同样的player.PlayerPosition的值。可以通过类似s.add(new Position(player.PlayerPosition.X,player.PlayerPosition.Y))的代码来达到你想要的效果。
Ⅳ Java基础:数组Array转成List的几种方法
代码片段(3)[全屏查看所有代码]1. [代码]数组->List (StringArrayTest.java) import java.util.Arrays; import java.util.List; import java.util.ArrayList; public class StringArrayTest { public static void main(String[] args) { String[] words = {"ace", "boom", "crew", "dog", "eon"}; List<String> wordList = Arrays.asList(words); for (String e : wordList) { System.out.println(e); } } }2. [代码]比较傻的做法 String[] words = { ... }; List<String> list = new ArrayList<String>(words.length); for (String s : words) { list.add(s); }3. [代码]这方法也还可以 import java.util.Collections; List myList = new ArrayList(); String[] myStringArray = new String[] {"Java", "is", "Cool"}; Collections.addAll(myList, myStringArray);
Ⅵ Array List
等于你的arraylist里面有两个完全一样的point对象,改了后一个也会影响前一个,它们指向相同的内存地址.要这样写 s.add(new Point(3,3));
Ⅶ Java array 和array list 很简单
题目的 意思大概就是想用 ArrayList给数组赋值
参考代码如下
importjava.util.ArrayList;
importjava.util.Arrays;
publicclassCustomerLister{
publicstaticvoidmain(String[]args){
ArrayList<String>list=newArrayList<String>();
list.add("Cathy");
list.add("Ben");
list.add("Jorge");
list.add("Wanda");
list.add("Freddie");
String[]customerName=newString[5];
for(inti=0;i<customerName.length;i++){
customerName[i]=list.get(i);
}
System.out.println(Arrays.toString(customerName));
}
}
Ⅷ 请教关于java中的Arrays.asList的用法
import java.util.*;
class Snow {}
class Powder extends Snow {}
class Crusty extends Snow {}
class Slush extends Snow {}
class Light extends Powder {}
class Heavy extends Powder {}
public class ArrayListClass {
public static void main(String[] args) {
List<Snow> snow1 = Arrays.asList(
new Crusty(), new Slush(), new Powder(),new Light(),new Heavy() );
//进行的对比
List<Snow> snow3 = new ArrayList<Snow>();
Collections.addAll(snow3, new Light(), new Heavy());
}
}
Ⅸ list与arraylist 区别
List和ArrayList的区别在于:
1、在编程语言中ArrayList类是.Net Framework提供的用于数据存储和检索的专用类。List 类可以简单视之为双向连结串行,以线性列的方式管理物件集合。List类是ArrayList类的泛型等效类。
2、ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除。List的大部分用法都与ArrayList相似,List类也继承了IList接口。
3、在ArrayList中可以插入不同类型的数据。ArrayList会把所有插入其中的数据都当作为object类型来处理,这其中存在装箱与拆箱的操作,会对系统造成性能上的损耗。而List需要声明其数据的对象类型。声明后插入其他类型数据,IDE就会报错,且不能通过编译。
(9)arraylist常用方法扩展阅读:
一、List泛型
通过允许指定泛型类或方法操作的特定类型,泛型功能将类型安全的任务从程序员转移给了编译器。不需要编写代码来检测数据类型是否正确,因为会在编译时强制使用正确的数据类型。减少了类型强制转换的需要和运行时错误的可能性。泛型提供了类型安全但没有增加多个实现的开销。
二、装箱与拆箱的概念:
1、装箱:就是将值类型的数据打包到引用类型的实例中 比如将int类型的值123赋给object对象o
int i=123; object o=(object)i;
2、拆箱:就是从引用数据中提取值类型 比如将object对象o的值赋给int类型的变量i
object o=123; int i=(int)o;
3、装箱与拆箱的过程是很损耗性能的。
Ⅹ 关于Array和List的区别
Array和List都属于顺序表。
Array是一段连续的存储结构
int[] i=new int[3]
i其实记录的是数组的首地址,而i[1]其实相当于在i的地址的基础上加上1个整数的地址偏移,然后再取这块地址中的值。
List则是不连续的存储结构,List的每个节点都有着一个Next属性,这个属性则记录着他的下一个节点的地址。
也就是说当我们想找第100个节点的时候,他还是需要从第一个节点,然后做99次Next操作,才能找到list[99]节点。
在查找一个元素时时分别生成以下IL码
Array:
IL_0020: ldloc.0
IL_0021: ldc.i4.3
IL_0022: ldelem.i4
IL_0023: stloc.2
List:
IL_0022: ldloc.0
IL_0023: ldc.i4.3
IL_0024: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<int32>::get_Item(int32)
IL_0029: stloc.2
通过这两段IL,我只是希望证明List和Array对索引元素的方式是不同的。当然,我们无从知道Microsoft对List方法get_Item的实现。但是我们不难想象:
因为List是一个链表,所以我需要从第一个元素开始逐个Next到所需索引的元素。这是一个耗时的过程。
1. 从空间扩展角度上来说:
数组必须要在初始化时分配固定的大小,比如说int[] a=new int[3];如果我们仅仅写int[] a=new int[];编译器就会无情地给我们报错。但是List由于空间不必连续,所以无须指定初始大小。
总结1: 当不确定大小时,最好使用List代替Array。
2. 从操作角度上来看:
关于索引这个就不赘述了。
总结2:当需要大量的查找操作时,最好使用Array。
对于插入(删除)操作,很多人是从插入(删除)的时间上分析,说List优于Array,我觉得是不合理的。
更合理的解释应该是从两个角度分析(以插入为例):
<1> 指定位置插入指定元素:
对于Array讲,有两套解决方案:
A. 使用一个新数组,N+1个元素重新赋值的过程。一个for循环,时间复杂度O(n)。
B. 在原数组上操作,那么首先需要为该数组预留空间,这是个很难办的事情。而且其后续元素的移动耗费时间复杂度仍未O(n)。
对于List来讲,很多人说复杂度就是O(1)。这其实是不合理的,因为List插入元素固然容易,但是在指定位置的插入,需要一个时间复杂度为O(n)的查找过程。
但是只考虑时间复杂度是不够的,我们要考虑总体的情况。如果使用新数组,不仅浪费了新的空间,而且需要反复的赋值过程,是N+1次。如果不使用新数组,预留空间实在太麻烦,因此综上所述,还是List好。
<2> 给出前一个节点,然后在后面插入元素。这个我的意思就是不仅仅给出了PreviousNode的Value,还给出了他的Next。这个情况我就不废话了,List的优势太大了。可是在实际情况中,这种情况的可能性几乎为零。
因此,总结3:当需要进行频繁的插入,删除操作时,最好使用List代替Array。
另外,给出个不太重要的补充,由于List需要存储他下一个节点的地址,所以List比Array相对起来浪费了更多的空间。
也就是说虽然使用list<T>强类型范性,能够节约装箱拆箱时间,但查询速度会有很多问题。
在实际使用中,对变化不大,查询次数频繁的,我们应该考虑list<T>外的情况
当然,就查询某个值的速度而言,还是 Hashtable 或 Dictionary 最快,当然这两者和我们在讨论的东西,结构完全不相同,没有可比性。毕竟数组,是节约空间,而hash表是散列的,牺牲空间来换取速度