《数据结构和java集合框架》——第五章 数组列表
一.基本概念
浅复制:复制对象的引用而不是复制对象本身(clone)
序列化:将对象写入到IO流中
反序列化:从IO流中恢复对象
native限定符:说明这个方法的定义使用了另一种编程语言的代码。
protected native Obejct clone() throws CloneNotSupportedException;
二.知识点
(1)java.util程序包中另一个基于数组的集合类是Vector类。Vector类与ArrayList类唯一的重要区别是Vector类的大多数方法是同步的。同步的方法一次最多只能被一个线程调用。
(2)Java Collection Framework利用一个数组字段实现ArrayList类。
(3)List接口扩充了Collection接口,添加了和索引相关的方法
(4)在任何实现List接口的类的实例中,元素都按照索引值一次存储
(5)Srializable接口没有任何方法,只有传送给Java虚拟机的信号:任何实现这个接口的类都将使用一个writeObject方法把类中的所有对象复制到输出流中,也就是串行话对象中的元素。对象的反串行化利用readObject方法实现
(6)Coloneable接口也没有任何方法。这个接口仅仅说明clone方法在实现这个接口的类中至少可以对调用对象进行字段对字段的克隆。
ArrayList temp = (ArrayList)myList.clone()
(7)ArrayList类继承了AbstractList类的modCount字段,每次当ArrayList对象进行结构调整(add/remove),这个字段就递增1.当迭代器实例激活next(),将检查expectedModCount是否等于modCount.不等,则next()返回可能不是ArrayList对象中的下一个元素。
(8)如果一个ArrayList对象的基本数组已经填满,再进行插入元素操作时,基本数组的大小一般扩大50%
(9)transient使用小结
☞一旦变量被transient修饰,变量将不再是对象持久化的一部分。该变量内容在序列化后无法获得访问
☞transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口
☞被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
(10)ArrayList类的标题如下
public class ArrayList extends AbstractList implements List,Cloneable,java.io.Serializable
【注】利用实现箭头从子类指向其父类,利用虚线箭头指向一个接口。
三.重要代码
Collection接口
public interface Collection{
boolean add(Object o);
boolean allAll(Collection c);
void clear();
boolean contains(Object o);
boolean containsAll(Collection c);
boolean equals(Object o);
int hashCode();
boolean isEmpty();
Iterator itertor();
boolean remove(Object o);
boolean removeAll(Collection c);
boolean retainAll(Collection c);
int size();
Object [] toArray();
Object p[] toArray(Object [] a);
}
List接口
public interface List extends Collection{
void add(int index,Object element);
boolean addAll(int index,Collection c);
Object get(int index);
int indexOf(Object elem);
int lastIndexOf(Object elem);
ListIterator listIterator();
ListIterator listIterator(final int index);
Object remove(int index);
Object set(int index,Object element);
Object clone();
}
用list存取信息
User类
package com.daiinfo.sensorjava.ken2.implement.list;
public class User {
String name;
String email;
public User(String name,String email){
this.name=name;
this.email=email;
}
public String getName(){
return name;
}
public String getEmail(){ return email;}
}
TestList类
package com.daiinfo.sensorjava.ken2.implement.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class TestList {
public static void main(String [] args){
List<User> list=new ArrayList<User>();
list.add(new User("miaowu","1695102694@qq.com"));
User xiaozhang=new User("小张","xiaozhang@qq.com");
User xiaohu=new User("小胡","xiaohu@qq.com");
list.add(xiaozhang);
list.add(xiaohu);
/**
* 遍历
* 方法一
*/
ListIterator<User> it1=list.listIterator();
System.out.println("方法一:");
while(it1.hasNext()){
User user=it1.next();
System.out.println(user.getName()+user.getEmail());
}
/**
* 遍历
* 方法二
*/
System.out.println("方法二:");
for(Iterator <User> it2 = list.iterator(); it2.hasNext();){
User user=it2.next();
System.out.println(user.getName()+user.getEmail());
}
/**
* 遍历
* 方法三
*/
System.out.println("方法三:");
for(User temp:list){
System.out.println((temp.getName()+temp.getEmail()));
}
/**
* 遍历
* 方法四
*/
System.out.println("方法四");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).getName()+list.get(i).getEmail());
}
/**
* 清除列表中的元素
*/
list.remove(1);
System.out.println("方法三");
for(User user:list){
System.out.println(user.getName()+user.getEmail());
}
}
}