List接口继承Collection接口
List接口的对象称为List集合
List集合中允许出现重复元素,所有的元素是以一种线性方式进行存储,元素有序
线性表List
将ArrayList和StringBuilder对比
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("北");
sb.append("京");
sb.insert(0, "中");
sb.insert(1, "国");
System.out.println(sb);
ArrayList<String> list = new ArrayList<String>();
list.add("北");
list.add("京");
list.add(0, "中");
list.add(0, "国");
System.out.println(sb);
}
ArrayList与StringBuilder相比,操作基本相同,
但是ArrayList除了可以添加String,还可以添加其它对象
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("北");
list.add("京");
list.add(0, "中");
list.add(0, "国");
System.out.println(sb);
ArrayList<Person> persons = new ArrayList<Person>();
persons.add(new Person("王五"));
System.out.println(persons);
}
}
class Person{
private String name;
public Person(String name) {
this.name = name;
}
public String toString() {
return this.name = name;
}
}
ArrayList的contains()方法默认调用对象的equals()方法做比较
ArrayList集合
是List接口的一个实现类,内部封装了一个长度可变的数组对象(线程不安全)
add()和get()用于实现元素的存取
ArrayList集合的底层使用一个数组保存元素在增加或删除指定位置元素时会导致创建新的数组效率比较低,不适合做大量的增删操作。
可以通过索引访问元素所以ArrayList集合查找元素便捷
ArrayList<Person3> persons = new ArrayList<Person3>();
persons.add(new Person3("张三"));
persons.add(new Person3("李四"));
删除remove()方法演示
Person3 person = new Person3("李四");
按对象删除
persons.remove(person);
按序号删除
persons.remove(0);
System.out.println(persons.contains(person));
随机去掉一个人
Random r = new Random();
Person3 p = persons.remove(r.nextInt(persons.size()));
System.out.println(p);
修改set()方法演示
修改ArrayList中的第0个元素为“大王”
Person3 p2 = new Person3("大王");
Person3 p2temp = persons.set(0, p2);
System.out.println(p2temp);
查询indextof()方法演示:查询ArrayList中的元素
int i = persons.indexOf(p2);
System.out.println(i);
LinkedList集合
内部维护了一个双向循环列表增删操作具有很高的效率
Iterator接口
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("北");
list.add("京");
list.add(0, "中");
list.add(1, "国");
Iterator i = list.iterator();
while (i.hasNext()) {
Object obj = i.next();
System.out.println(obj);
}
}
ListIterator接口
它是Iterator的子类,提供了hasPrevious()和previous()方法
实现反向迭代
ArrayList<String> list = new ArrayList<String>();
list.add("北");
list.add("京");
list.add(0, "中");
list.add(1, "国");
ListIterator i = list.listIterator(list.size());
while (i.hasPrevious()) {
Object obj = i.previous();
System.out.println(obj);
Enumeration接口
用法与Iterator用法类似
vector集合是List接口的一个实现类用法与ArrayList完全相同,线程安全
vector类中提供了一个elements()方法用于返回Enumeration对象通过其就可以遍历该集合中的元素。
Vector v = new Vector();
v.add("sss");
v.add("ddd");
Enumeration enu = v.elements();
while (enu.hasMoreElements()) {
Object obj = enu.nextElement();
System.out.println(obj);
}
ArrayList和LinkedList区别
ArrayList(1.2版本以后的) 是使用变长数组算法实现的,ArrayList继承自List。
-
ArrayList和Vector的比较。
1、Vector(1.0版本提供的),线程安全的,效率稍低,也是使用变长数组算法实现的,继承自List接口。
2、ArrayList,线程不安全的,效率高速度快(现在较常用)。 -
ArrayList和LinkedList的比较。
1、LinkedList是采用双向循环链表实现的List。
2、ArrayList是采用变长数组算法实现的的List。 -
List 集合的实现。
1、LinkedList 采用双向循环链表实现。
2、ArrayList 变长数组算法实现(新版本提供),特点:快,非线程安全。
3、Vector 变长数组算法实现(早期版本提供),特点:慢,线程安全。
LinkedList和ArrayList使用方法相同,底层实现不相同,
ArrayList和Vector的区别
1、同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
(备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全问题,记住Vector与Hashtable是旧的,是java一诞生就提供的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。
2、数据增长:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
总结:即Vector增长原来的一倍,ArrayList增加原来的0.5倍。
集合与集合之间的操作
集合和集合之间的操作,包括和、差、交集等,如下所示:
ArrayList<Person4> persons = new ArrayList<Person4>();
persons.add(new Person4("张三"));
persons.add(new Person4("李四"));
ArrayList<Person4> others = new ArrayList<Person4>();
others.add(new Person4("赵大"));
others.add(new Person4("钱二"));
将persons和others合并(和)
persons.addAll(others);
System.out.println(persons);
将persons包含others的元素删除(差)
persons.removeAll(others);
System.out.println(persons);
将persons包含others的元素保留(交集)
persons.retainAll(others);
System.out.println(persons);
判断persons是否为空集
System.out.println(persons.isEmpty());
空集和空null是两码事
persons = null;
System.out.println(persons);
}
网友评论