Java序列化的方式、object类中的方法、接口和抽象类的区别、ArrayList在循环过程中删除

Java序列化的方式


a.是相应的对象实现了序列化接口Serializable,这个使用的比较多,对于序列化接口Serializable接口是一个空的接口,它的主要作用就是标识这个对象时可序列化的,jre对象在传输对象的时候会进行相关的封装。

b.Externlizable接口继承了java的序列化接口,并增加了两个方法:

     void writeExternal(ObjectOutput out) throws IOException;

     void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;

     首先,我们在序列化对象的时候,由于这个类实现了Externalizable 接口,在writeExternal()方法里定义了哪些属性可以序列化,哪些不可以序列化,所以,对象在经过这里就把规定能被序列化的序列化保存文件,不能序列化的不处理,然后在反序列的时候自动调用readExternal()方法,根据序列顺序挨个读取进行反序列,并自动封装成对象返回,然后在测试类接收,就完成了反序列。
 public void writeExternal(ObjectOutput out) throws IOException {
        // TODO Auto-generated method stub

        out.writeObject(name);
        out.writeObject(age);
    }

object类中的方法

protected Object clone() //创建并返回此对象的一个副本。

boolean equals(Object obj) //指示某个其他对象是否与此对象“相等”。

protected void finalize() //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

Class<? extends Object> getClass() //返回一个对象的运行时类。

int hashCode() //返回该对象的哈希码值。

void notify() //唤醒在此对象监视器上等待的单个线程。

void notifyAll() //唤醒在此对象监视器上等待的所有线程。

String toString() //返回该对象的字符串表示。

void wait() //导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

void wait(long timeout) //导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或notifyAll() 方法,或者超过指定的时间量。

void wait(long timeout, int nanos) //导致当前的线程等待,直到其他线程调用此对象的notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
 

接口和抽象类的区别,注意JDK8的接口可以有实现。

下面是接口和抽象类的不同点:
1. 接口能够多实现,而抽象类只能单独被继承,其本质就是,一个类能继承多个接口,而只能继承一个抽象类。

2. 方法上,抽象类的方法可以用abstract 和public或者protect修饰。而接口默认为public abttact 修饰。

3. 抽象类的方法可以有需要子类实现的抽象方法,也可以有具体的方法。而接口在老版本的jdk中,只能有抽象方法,但是Java8版本的接口中,接口可以带有默认方法。

4. 属性上,抽象类可以用各种各样的修饰符修饰。而接口的属性是默认的public static final

5. 抽象类中可以含有静态代码块和静态方法,而接口不能含有静态方法和静态代码块。

6. 抽象类可以含有构造方法,接口不能含有构造方法。

7. 设计层面上,抽象类表示的是子类“是不是”属于某一类的子类,接口则表示“有没有”特性“能不能”做这种事。如飞机和鸟都能飞,但是他们在设计上实现一个Fly接口,实现fly()方法。远比两个类继承飞行物抽象类好得多。因为,飞机和鸟有太多的属性不一样。

8. 设计层面上,另外一点,抽象类可以是一个模板,因为可以自己带集体方法,所以要加一个实现类都能有的方法,直接在抽象类中写出并实现就好,接口在以前的版本则不行。新版本Java8才有默认方法。

9. 既然说到Java 8 那么就来说明,Java8中的接口中的默认方法是可以被多重继承的。而抽象类不行。

10. 另外,接口只能继承接口。而抽象类可以继承普通的类,也能继承接口和抽象类。

 

一个ArrayList在循环过程中删除,会不会出问题,为什么?


由arraylist源码可知,其删除方法中用到了执行System.arraycopy方法,导致删除元素时涉及到数组元素的移动。
出错一:
 public static void remove(ArrayList<String> list) {
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            if (s.equals("bb")) {
                list.remove(s);
            }
        }
    }
遍历第二个元素字符串bb时因为符合删除条件,所以将该元素从数组中删除,并且将后一个元素移动(也是字符串bb)至当前位置,导致下一次循环遍历时后一个字符串bb并没有遍历到,所以无法删除。
解决方法:
1.倒序遍历时即使发生元素删除也不影响后序元素遍历。
2.使用iterator迭代
在这个iterator中的next方法中会调用checkforComodification会检查

猜你喜欢

转载自blog.csdn.net/qq_35240226/article/details/82931115
今日推荐