您的位置:首页 > 编程语言 > Java开发

java.集合(Ⅱ).List

2016-05-15 19:40 417 查看
1.List

意义:实现了Collection的子接口之一

特点:元素是有序的,是可重复的,因为该集合体系有索引。

常见三子类

|——ArrayList:底层用的数据结构用的是数组结构。

特点:查询速度很快,但增删稍慢,线程不同步,长度可变—默认长度为10,当超过已有长度时,自动生成延长百分之50数组,并自动转移数据。

|——LinkedList:底层使用的是链表数据结构。

特点:增删速度很快,查询速度慢

|——Vector:1.2版本前使用,和ArrayList功能一致。

特点:线程同步。操作速度很慢,一般不用。枚举是Vector的特有取出方法

因为枚举和迭代是一样的。且枚举的名称以及方法名称都过长。所以在1.5版本后被迭代器取代了。

List基本方法





List特有方法



几个知识点:

⑴当按角标进行添加方法时,操作相当于插入。相应角标的元素将后移。

⑵角标是从0开始的

⑶List类有特有的输出所有元素的方法,即用f.size()与f.get()进行遍历

for(int i=0;i<f.size();i++)
write(f.get(i));//write是一个自定义静态输出方法,就不另外加进来了


2.ListIterator

意义:List集合特有的迭代器。ListIterator是Iterator的子接口。

在迭代时,不可以在 通过集合对象的方法操作集合中的元素 的同时,又通过迭代器对元素进行操作。

因为会发生并发修改异常

所以在操作中,只能通过一种途径的方法操作元素。而迭代器的方法只有

判断、取出、删除三种,即



因为其方法过少不能满足很多需求,所以List中就有了其子接口。ListIterator。其方法有:



该接口只能通过List集合的listIterator方法获取。

3.LinkedList

特有方法:





ex:

import java.util.LinkedList;

public class ListDemo {
public static void main(String[] args)
{
LinkedList f = new LinkedList();

f.offerFirst("java 01");
f.offerFirst("java 02");
f.offerFirst("java 03");
write(f);
}
public static void write(Object obj)
{
System.out.println(obj);
}
}


输出:



List的两个小练习:

去掉ArrayList中的重复元素

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

public class ListDemo {
public static void main(String[] args)
{
ArrayList f = new ArrayList();
f.add("java 01");
f.add("java 02");
f.add("java 02");
f.add("java 01");
f.add("java 03");
f.add("java 01");
write(f);
write("_________");
write(single(f));
}

public static ArrayList single(ArrayList f)
{
ArrayList f1 = new ArrayList();

for(Iterator it=f.iterator();it.hasNext();)
{
Object obj = it.next();

if(!f1.contains(obj))
{
f1.add(obj);
}
}
return f1;
}
public static void write(Object obj)
{
System.out.println(obj);
}
}


——————————————————

在ArrayList中输入学生信息,并排除重复的数据

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public boolean equals(Object obj)//contains用来判断对象是否相同,但它的底层自动调用的是默认方法equals,
//但当默认equals不能满足需求时,需要进行方法覆盖
{
Person p = (Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
public void setName(String name)
{
this.name = name;
}
public void setAge(int age)
{
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
public class ListDemo {
public static void main(String[] args)
{
ArrayList f = new ArrayList();
f.add(new Person("java 01",1));
f.add(new Person("java 02",2));
f.add(new Person("java 02",1));
f.add(new Person("java 03",1));
f.add(new Person("java 04",1));
f.add(new Person("java 01",1));
Iterator it = single(f).iterator();
while(it.hasNext())
{
Person p =(Person)it.next();
write(p.getName()+"....."+p.getAge());
}

}

public static ArrayList single(ArrayList f)
{
ArrayList f1 = new ArrayList();

for(Iterator it=f.iterator();it.hasNext();)
{
Object obj = it.next();

if(!f1.contains(obj))//底层原理是equals
{
f1.add(obj);
}
}
return f1;
}
public static void write(Object obj)
{
System.out.println(obj);
}
}


一个知识点:

List中,contains和remove进行的比较,底层都是调用Object类中默认的equals方法,而当默认方法不能满足时,可以以覆盖equals方法的形式进行修改,就像第二个小练习中这样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: