概述
list在工作中很常见,但是作为一个如此底层的集合,经常还用错,可见我的java功底其实是很薄弱的,特做一下笔记:
list是一个集合容器,放置同一类对象,其通用的功能对这个对象容器增,减,改,查.
笔记
以下列举一下容易出错的地方:
- list中是可以存放同一个对象,list中一些方法涉及到对象之间比较,比如contains,remove,retainAll等,对象之间的比较其实本质上是依赖equals方法的,当list中存放是一个pojo对象时,使用上述方法,是必须要重写equals方法的
- sublist(int fromIndex, int toIndex)方法,常用这个方法获取list的其中某连续的一段,首先这个方法就有一些前提 fromIndex > =0,toIndex >= fromIndex,toIndex<=size
a.容易出现的是toIndex>size,要使用这个方法,必须要知道list原有的size,通常在进行数据分批处理或者分页的时候,忽略了这个判断(一定要有空指针,数组越界的意识),
b.这个方法返回的其实是一个私有内部类sublist,这个sublist里面的对象还是指向原有对象(java中除了一些基本类型,代码中对对象的引用基本都是各种指针,比如new Arraylist(Collection) 集合是新集合,但是集合里面的对象还是原对象),这个返回值只能用lis接收,不能像arraylist等强转
c.对sublist结果集进行增减(size的变化)都会影响原有list,sublist里面的每一个值,其实都指向原有list,包括其在原有list的位置,操作sublist相当于就是在操作原有list
- list的遍历有for,超级for,iterator, 遍历中一般是不推荐对list进行size变动的,(除了iterator可以进行删除)
a.for:for循环对list的操作list的index,list进行size变动,原有的index对应的值会改变,新增有可能造成死循环,删除可能造成查询越界
b.超级for:不允许list size有变动
c.iterator:游标式遍历,只能遍历一个删除一个
- list作为参数,list最为参数时,不要为null,list的方法中,参数为list,基本没有进行非空判断(java jdk中的方法基本没有非空判断,太冗余,非空判断基本都要在业务逻辑中判断),为null会报错
项目中用list查询偏多,故而常用arraylist,arraylist底层是数组,其扩容就是new 一个更大的数组,将原来的数据复制,因此能指定size的就尽量指定size,对size大的养成用完clear的习惯.arraylist不是线程安全的,要使用线程安全,Collections.synchronizedList(list)即可
linkedlist用的少,略