set不允许相同对象,相同会不放入。list有顺序,collection有一定规则,map按键=值。都自带toString方法重载,
ArrayList是能够自动扩展的数组add,get ,size方法可用
collection的方法是add,set和map都会改变顺序,如果想要顺序,那就用LinkedHashMap或者LinkedHashSet
map是put.
Collection有一个辅助类Collections,fill复制list型的集合
用法:List l=new ArrayList()
Collections.fill(l,"hello")
对象的克隆浅层: 用Vector v=new Vector
v.addElements(o1)
o2=(Vector)v.clone()
vector的方法:addElement(),v.elementAt(i),nextElement()
Integer.toString(i)
克隆接口:Cloneable是空的,只是一个标记,object.clone()会检查这个接口,想使用克隆方法的必须实现接口,instanceof Cloneable检查是否能克隆(可以作为可克隆断代)。
object类的clone方法是保护的,不能用x=new object()来x.clone(),而是使用继承衍生类。并且也是只复制一次内存到新区域的浅层复制
例子:
class MyObject implements Cloneable{
public Myobject clone(){
o=super.clone()//可能会抛出CloneNoSupportedException
return o;
}
}
手动深层复制:
o=super.clone()
o.obj1=(obj1)o.obj1.clone()
o.obj2=(obj2)o.obj2.clone()
对象的序列化:实现了serializable接口的类可以把对象序列化成一系列字节。自动构建对象内的对象引用关系网
方法:
class1 先实现接口,然后
o=new class1()
out=new ObjectOutputStream( new FileOutputStream("haha.TXT"));//存入
out.writeObject()
读取:
in=new ObjectInputStream(new FileInputStream("haha.txt"))
w2=(Class1)in.readObj()
序列化后生成的对象不能getClass()和getName。除非文件在类路径。
而用Externalizable接口,可以实现控制序列化的具体过程
增加2个实现:readExternal(InputObject) 和writeExternal(OutputObject),复原时自动使用,而且会调用所有默认构造器(无参数)除此之外没有其他任何自动序列化的数据(用以控制敏感数据)。
System.currentTimeMillis()
serializable也可以控制,用自定义方法,这些方法必须含有下列准确的签名:
private void writeObject(ObjectOutputStream stream)
throws IOException;
private void readObject(ObjectInputStream stream)
throws IOException, ClassNotFoundException
private void writeObject(ObjectOutputStream stream)
throws IOException;
private void readObject(ObjectInputStream stream)
throws IOException, ClassNotFoundException
另外用defaultwriteObject来表示系统默认执行的。
static的变量序列化时只复制一次。
RTTI:基本类型也有类对象,存在着:void.TYPE字段指向他们的句柄。
isInstanceof要优于instanceof
对象句柄的常用方法:getInterfaces,newInstance(克隆一个对象的另一种方法),getSuperclass,getName,isInterface。对象可用getClass。
Class.forName("")主要是只知道类名时方便获取class对象引用