list

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)

获取集合元素

  1.     ArrayList<String> al = new ArrayList<String>();
  2.         al.add("张三");
  3.         al.add("李四");
  4.         al.add("王五");
  5.         al.add("赵六");
  6.         for (int i = 0; i < al.size(); i++) {
  7.             String string = (String) al.get(i);
  8.             System.out.println(string);/*
  9.             张三
  10. 李四
  11. 王五
  12. 赵六*/

remove(int index)

删除集合元素

remove()

删除集合某一个元素

clear ()

删除集合所有元素

subList(int fromIndex, int toIndex)

切割视图

set(int index, E element)

替换元素

一种方式

  1.     al.add("张三");   
  2.         String ss=al.set(0, "校花");

第二种方式

  1. al.add("张三");
  2.         al.add("李四");     
  3.         al.set(1, "小华");
  4.         for (Object object :al ) {
  5.             String s = (String)object;
  6.             System.out.println(s);
  7.         }
     

contains()

 包含

indexOf()

索引集合元素值

isEmpty ()

集合元素是否为空

size ()

元素个数

 

listIterator()

迭代器包含的方法

  1.         al.add("张三");
  2.         al.add("李四");
  3.         al.set(1, "小华");
  4.         ListIterator listIterator = al.listIterator();
  5.         while (listIterator.hasNext()) {
  6.             Object next = listIterator.next();
  7.             String string = (String)next;
  8.             System.out.println(string);
  9.         }

equals()比较集合内容是否相

  1. boolean b = false;
  2.     for(int i=0;i<al.size();i++){
  3.         Person person = al.get(i);
  4.         if(person.name.equals("洋洋") && person.age==19){
  5.             b=true;
  6.         }
  7.     }
  8.     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函数条用

  1. Collections.sort(al);
  2. System.out.println(al);

如何排序

创建一个类,实现Comparator接口:

  1. public int compareTo(Student o) {
  2.         //从小到大比
  3.         //当前的age,减去o的age
  4.         return this.age -o .age;
  5.         //从大到小比
  6.         //o的age,减去当前的age
  7.         return o.age - this.age;
  8.     }

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的效率高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值