java学习(4)ArrayList、LinkedList类以及区别

1.什么是ArrayList以及ArrayList的功能。

ArrayList 是一个数组队列,相当于动态数组。
可以动态扩容—->继承了AbstractList类实现了List接口。
可以随机访问—->实现了RandomAccess类。
可以克隆—–>实现了Cloneable类。
实现了序列化—–>java.io.Serializable类。
但是ArrayList不是线程安全的,建议使用Vector,CopyOnWriteArrayList等。

2.构造函数

除了默认的构造函数外还有
1.ArrayList(int capacity) 
2.ArrayList(Collection<? extends E> collection)
ArrayList的数据是存放在一个动态数组中,这个数组的大小能够在初始化ArrayList时候确定,默认为10.ensureCapacity保证了增长的方式。
ArrayList遍历方式是
1.通过Iterator去遍历。
2.通过for循环
3.随机访问。

3.toArray()

1.toArray有两个重载函数
list.array()
list.array(T[] a)
2.使用这两中的第一种重载函数的时候有可能会出现
public class TestArrayList {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<String> array = new ArrayList<String>();
        for(int i = 0;i < 10;i++){
            array.add("" + i);
        }
        String[] a = (String [])array.toArray();
    }

}
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at testproject1.TestArrayList.main(TestArrayList.java:13)
字面意思很明显说明不能够从Object[]专成String[]
这是为什么呢:因为Object[]和String[]是两种不兼容的类型。

当然也有修改方案:先把Object[]取出来,然后在外层转换,不过这样麻烦且没意义。

使用第二种重载方法
public class TestArrayList {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<String> list = new ArrayList<String>();
        for(int i = 0;i < 10;i++){
            list.add("" + i);
        }
        String[] a = new String[list.size()];
        list.toArray(a);
        System.out.println(a + "   dsfasd " + list.size());
        System.out.println(a[1]);
    }

}
先定义且初始化一个String的数组,然后把这个数组作为一个泛型传入toArray当然也可这样写。这样也是最常用的
String[] array= list.toArray(new String[0]);

4.迭代方法

随机访问
Integer value = null;
Iterator iter = list.iterator();
while (iter.hasNext()) {
value = (Integer)iter.next();
}
遍历
Integer value = null;
int size = list.size();
for (int i=0; i<size; i++) {
value = (Integer)list.get(i);        
}
迭代器 好处:不许要计算长度了。
Integer value = null;
for (Integer integ:list) {
value = integ;
}

5.ArrayList明显是线程不安全的。

6.ArrayList和LinkedList的区别

1.简单比较

LinkedList从名字上可以看到和ArrayList一样都是动态扩容,他们都实现了List接口,但不同的是,ArrayList是基于数组实现的,LinkedList是基于链表实现的。通过比较链表和数组的优缺点也可以看到,ArrayList的访问效率更高,LInkedList的插入删除效率更高。

2.LinkedList的定义

LinkedList继承于AbstractSequentialList所以是一个双向链表
LinkedList实现了List能对它进行队列操作。
LinkedList实现了Cloneable,能够克隆。
支持序列化。

3.数据结构原理

这个图片特别好从别人的博客上看到的
摘自这个博客

可以这样说:
当是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的某个元素时,使用ArrayList会比较好;
当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
同样的是两者都是线程不安全的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值