list是一个接口
List的特点;
有序 ,可重复的集合
list接口的实现类:
ArrayList LinkedList Stack Vector RoleList.....
其中ArrayList是最常用的列表类
警告黄色怎么解决
解决:
在创建集合对象时,需要指明集合中存放的元素的类型,否则会有警告
使用“泛型”来指明元素类型
ArrayList<String> al = new ArrayList<String>();
方法:
add
(int index, E element)
addAll
(int index, Collection<? extends E> c)
添加元素
get
(int index)
获取集合元素
- ArrayList<String> al = new ArrayList<String>();
- al.add("张三");
- al.add("李四");
- al.add("王五");
- al.add("赵六");
- for (int i = 0; i < al.size(); i++) {
- String string = (String) al.get(i);
- System.out.println(string);/*
- 张三
- 李四
- 王五
- 赵六*/
remove
(int index)
删除集合元素
remove()
删除集合某一个元素
clear ()
删除集合所有元素
subList
(int fromIndex, int toIndex)
切割视图
set
(int index, E element)
替换元素
一种方式
- al.add("张三");
- String ss=al.set(0, "校花");
第二种方式
- al.add("张三");
- al.add("李四");
- al.set(1, "小华");
- for (Object object :al ) {
- String s = (String)object;
- System.out.println(s);
- }
contains()
包含
indexOf()
索引集合元素值
isEmpty ()
集合元素是否为空
size ()
元素个数
listIterator
()
迭代器包含的方法
- al.add("张三");
- al.add("李四");
- al.set(1, "小华");
- ListIterator listIterator = al.listIterator();
- while (listIterator.hasNext()) {
- Object next = listIterator.next();
- String string = (String)next;
- System.out.println(string);
- }
equals()比较集合内容是否相
- boolean b = false;
- for(int i=0;i<al.size();i++){
- Person person = al.get(i);
- if(person.name.equals("洋洋") && person.age==19){
- b=true;
- }
- }
- System.out.println(b);
for循环删除陷阱
[刘华:21, 小周:21, 李龙:25, 王五:24, 洋洋:18, 赵勇:11]
删除列表中年龄大于20的学生:
代码
for(int j=0;j<al.size();j++){
Person perso = al.get(j);
if(perso.age>20){
al.remove(perso);
}
}
System.out.println(al);
删除结果:
[小周:21, 王五:24, 洋洋:18, 赵勇:11]
没有删除成功
原因:
在我们删除列表元素时,列表的结构已经修改了,for循环会跳过某些元素,
导致删除不成功。
for循环的执行过程
[小周:21, 李龙:24, 王五:24, 洋洋:18, 赵勇:11]
[小周:21, 王五:24, 洋洋:18, 赵勇:11]
[小周:21, 王五:24, 洋洋:18, 赵勇:11]
绿色的字表示for的执行过程
解决办法:
1)在删除后进行一次 j--,将索引回退一个
if(perso.age>20){
al.remove(perso);
j--;//解决办法!!
}
2)在遍历一个列表时,尽量不要修改该列表的结构(添加/删除元素)
我们可以专门为删除元素,克隆一个新的列表
ArrayList<Person> a = new ArrayList<Person>();//创建克隆一个新的对象
ArrayList<Student> al2 = (ArrayList<Student>) al.clone();
for(int i=0;i<al2.size();i++){
Student st = al2.get(i);
if(st.age>20){
al.remove(st);
}
}
System.out.println(al);
for循环删除陷阱代码如下
public static void main(String[] args) {
// TODO Auto-generated method stub
Random r = new Random();
Person p=new Person();
p.name="刘华";
p.age=21;
Person pe=new Person();
pe.name="小周";
pe.age=10+ r.nextInt(16);
//pe.age = 10+ r.nextInt(20);
Person s=new Person();
s.name="李龙";
s.age = 10+ r.nextInt(16);
Person n=new Person();
n.name="赵勇";
n.age =10+ r.nextInt(16);
Person r2=new Person();
r2.name="王五";
r2.age = 10+ r.nextInt(16);
Person r1=new Person();
r1.name="洋洋";
r1.age = 10+ r.nextInt(16);
ArrayList<Person> al = new ArrayList<Person>();
al.add(p);
al.add(pe);
al.add(s);
al.add(r2);
al.add(r1);
al.add(n);
for(int j=0;j<al.size();j++){
Person perso = al.get(j);
if(perso.age>20){
al.remove(perso);
j--;//解决办法!!
}
System.out.println(al);
}
System.out.println("_______________________");
ArrayList<Person> a = new ArrayList<Person>();
for(int j=0;j<a.size();j++){
Person perso = a.get(j);
if(perso.age>20){
al.remove(perso);
}
}
System.out.println(al);
}
}
列表的排序
使用Collections帮助类
数组帮助类:Arrays
集合帮助类:Collections
该类提供了集合操作的常用方法,排序就是其中的一个。
Collections.sort( 列表 )
条件是:
列表中的元素,必须实现Comparable接口
在main函数条用
- Collections.sort(al);
- System.out.println(al);
如何排序
创建一个类,实现Comparator接口:
- public int compareTo(Student o) {
- //从小到大比
- //当前的age,减去o的age
- return this.age -o .age;
- //从大到小比
- //o的age,减去当前的age
- return o.age - this.age;
- }
‘
2 使用list自带的sort方法
al.sort(参数),参数为Comparator接口的一个对象
普通的写法:
public class Mylist implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
//从小到大比
//o1.age,减去o2的age
return o1.age-o2.age;
}
}
在main函数条用
//al.sort(参数),参数为Comparator接口的一个对象
//普通的写法,创建一个类,实现Comparator接口,调用sort方法
al.sort(new Mylist());
匿名类:
当我们某个类只使用一次时,我们没比要为该类再单独创建一个java文件,直接使用匿名类的写法即可。
写法:
al.sort( new 接口 (){
接口方法的实现
})
//匿名类:当我们某个类只使用一次时,我们没比要为该类再单独创建一个java文件,直接使用匿名类的写法即可。
al.sort(new Comparator<Person> (){
@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return o1.age-o2.age;
}
});
对比ArrayList 和 LinkedList
ArrayList 数组列表内部还是依赖一个数组来实现列表功能
ArrayList增删慢,每一次增加长度是原来长度0.5倍,查询快
LinkedList 链接列表内部是依赖一个个节点之间的连接来实现列表功能
LinkedList底层是以链表形式储存数据的。链表的特点是一个元素的地址,一部分用来储存元素数据,另一部分用来储存下一个元素的内储地址
1)哪个列表的内存空间是连续的?
ArrayList
2)哪个列表进行元素的删除时,效率高?
LinkedList;
3)当我们获取第n个元素时,哪个效率高?
由于ArrayList的空间是连续的,所以我们可以直接获取到第五个元素
但是LinkedList却不同:通过节点之间的连接,逐个查找下一个元素,直到第五个在通过下标获取元素时,
ArrayList的效率高