ArrayList常见问题

ArrayList常见问题

1、ArrayList是什么?可以用来干嘛?

	ArrayList是一个可以动态扩容的存储结构。底层是一个Object类型数组。可以用来按照顺序存放数据。是Object类型可以存放任意类型的数据,如果是自定义类型必须重写equals方法,要不然remove(Object o)方法【通过值删除】无法正常使用,或者是indexOf(Object o)等方法
	而且我们装载基本类型 int byte double float short boolean long char 只能使用他们的包装类,底层使用的是Object 数组
//你想找到张三这个人,但是你不重写equals方法,使用的是Object类的方法,直接比较地址,就不可能找到
public static void main(String[] args) {
        ArrayList<Person> all = new ArrayList();
        all.add(new Person("张三",20));
        all.add(new Person("李四",18));
        all.add(new Person("王五",30));

        System.out.println(all.indexOf(new Person("张三", 20)));
        all.remove(new Person("张三", 20));
        System.out.println(all.toString());
    }

    static class Person {

        private String name;
        private int age;

        public Person(String name, int age) {

            this.name = name;
            this.age = age;

        }

    }
  1. ArrayList与LinkedList的区别?

    1. ArrayList底层是数组,有扩容机制,查找修改元素快,但是增加删除元素慢,LinkedList 底层是双向链表,增删效率比较高且不需要初始化容量
    2. 两者都可以存放null值,都线程不安全
    
  2. 那要多线程环境下使用什么代替ArrayList?

    1.使用Collections.synchronizedList(arraylist)
    2.使用CopyOnWriteArrayList
    3.使用Vector
    
  3. ArrayList初始化流程?1.7和1.8有什么区别?

    1. 1.7是直接初始化一个大小为10的数组
    2. 1.8是无参默认是Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}数组,当第一次add添加元素时,才会创建一个大小为10的数组
      指定参数:为0时使用Object[] EMPTY_ELEMENTDATA = {}数组,大于0则直接创建大小为该参数的数组
    
  4. ArrayList数组扩容机制

    1. 简单描述:假设有一个大小为10的数组,已经存放了10个元素。在增加下一个元素的时候,就会去判断是否扩容。扩容是旧容量的1.5倍。然后将旧数组内容复制到新数组直接将elementData重新指定到新数组
    
  5. 说说ArrayList 为什么增删慢

    1.  指定位置添加:创建一个新数组,将index之前的内容放进去,再把之后的放进去,空出index位置放置新值
    	需要扩容:每次add都会去进行扩容检测,然后如果要扩容就会调用system.arraycopy方法,新创建一个数组,将旧值copy过去,是一个耗费性能的操作
    2. 删除的话也是会使用copy,创建一个新数组,将index之前的内存放到新数组,index之后的内容再放到新数组,跳过index位置
    
  6. ArrayList的遍历如何?

    遍历最大的优势再与底层是个数组,而数组存储是使用一片连续的内存,cpu会缓存连续的内存,可以降低cpu读取内存的性能开销
    
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值