zoukankan      html  css  js  c++  java
  • 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());

  • 相关阅读:
    Codeforces 834D The Bakery
    hdu 1394 Minimum Inversion Number
    Codeforces 837E Vasya's Function
    Codeforces 837D Round Subset
    Codeforces 825E Minimal Labels
    Codeforces 437D The Child and Zoo
    Codeforces 822D My pretty girl Noora
    Codeforces 799D Field expansion
    Codeforces 438D The Child and Sequence
    Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D)
  • 原文地址:https://www.cnblogs.com/dodocie/p/7453663.html
Copyright © 2011-2022 走看看