JAVA: 集合框架

ArrayList arrayList = new ArrayList();
List list = new ArrayList();//使用未经处理的类型,会有类型安全检查的警告。
List<String> list = new ArrayList<String>();//后面的尖括号String参数不用确定类型?可以用<>代替?为什么IDEA这样提示?

问题1:三者区别?

ArrayList本身接收的是对象,取出来的时候我们需要把他转换成我们放进去的相应的类型。新建一个类ArrayListTest2,把集合转成数组:

import java.util.ArrayList;

public class ArrayListTest2 {
    public static void main(String[] args) {
        
        ArrayList list = new ArrayList();
        list.add(new Integer(1));
        list.add(new Integer(2));
        list.add(new Integer(3));
        list.add(new Integer(4));
        list.add(new Integer(5));        
        list.add(new Integer(6));
        
        /**
         * 不能将Object[]转换成Integer[]
         */
        Object[] in = list.toArray();
        for(int i = 0 ;i<in.length;i++){
            System.out.println(((Integer)in[i]).intValue());
        }
    }
}

问题2:集合取出来一定要转换类型吗? list.get(index) 取出,和转换类型后取出有啥区别?

1. 集合中存放的是对象的引用,而不是对象本身。

2. ArrayList底层采用数组实现,当使用不带参数的构成方法生成ArrayList对象的时候,实际上会在底层生成一个长度为10的Object类型数组。简单来说ArrayList内部实现是数组。

3. 如果增加的元素个数超过了10个,那么ArrayList底层会新生成一个数组,长度为原来数组的1.5倍+1,然后将原数组的内容复制到新数组中,并且后续增加的内容都会放到新数组当中,当新数组无法容纳增加的元素时,重复该过程。

4. 集合中不能放入原生数据类型,只能放置对象的引用,我们需要使用原生数据类型的包装类才能加入到集合当中。

问题3:如何理解该构造函数的参数:

public ArrayList(int initialCapacity){}

ArrayList 底层源码的一部分:

//构造方法传入默认的capacity 设置默认数组大小
    public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }

ArrayList的优点如下:

a、ArrayList底层以数组实现,是一种随机访问模式,再加上它实现了RandomAccess接口,因此查找速度快;

b、ArrayList在顺序添加一个元素的时候非常方便,只是往数组里面添加了一个元素而已;

ArrayList的缺点:

a、删除元素的时候,涉及到一次元素复制,如果要复制的元素很多,那么就会比较耗费性能

b、插入元素的时候,涉及到一次元素复制,如果要复制的元素很多,那么就会比较耗费性能

因此,ArrayList比较适合顺序添加、随机访问的场景。

问题4:ArrayList为什么线程不安全呢?

如何解决ArrayList中线程不安全的问题:

a、继承Arraylist,然后重写或按需求编写自己的方法,这些方法要写成synchronized,在这些synchronized的方法中调用ArrayList的方法。

b、List list = Collections.synchronizedList(new ArrayList());

原文地址:https://www.cnblogs.com/dodocie/p/7453663.html