Java一些特性的示例代码

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

 

public class example {
    
    public static void main(String args[]) {
        try {
            example test = new example();
            test.hashCodeEqualTest();
            test.serializableTest();
            test.cloneTest();
            test.compareTest();
            String template = "abcd";
            String tempTemplate = template;
            tempTemplate = "bbbbbbb";
            System.out.println(template);
            System.out.println(tempTemplate);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
   
    //java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;
    //然后在需要的时候,可以根据字节流中的信息来重构一个相同的对象。序列化机制在java中有着广泛的应用,EJB、RMI等技术都是以此为基础的。
    //序列化机制是通过java.io.ObjectOutputStream类和java.io.ObjectInputStream类来实现的。
    //在序列化(serialize)一个对象的时候,会先实例化一个ObjectOutputStream对象,然后调用其writeObject()方法;
    //在反序列化(deserialize)的时候,则会实例化一个ObjectInputStream对象,然后调用其readObject()方法。
    private void serializableTest() throws Exception {
        Person p = new Person("liuwei", 23);
        System.out.println(p);
        // 序列化。谁为ObjectOutputStream对象实例化就向哪里输出
        ObjectOutputStream oos = null;
        oos = new ObjectOutputStream(new FileOutputStream(new File("c://123.txt")));
        oos.writeObject(p);

        // 反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("c://123.txt")));
        Person p1 = (Person) ois.readObject();
        System.out.println(p1);
        ois.close();
        oos.close();
    }  
 
    private void hashCodeEqualTest() {
        Map m=new HashMap();  
       
        m.put(new Person02("zhansan",30),"zhansan");  
        m.put(new Person02("zhansan",20),"zhansan");  
          
        //如果不覆写equals和 HashCode方法的话是不能查找的到的  
        System.out.println(m.get(new Person02("zhansan",30)));  
        System.out.println(m.get(new Person02("zhansan",10)));  
        Person02 p1 = new Person02("zhansan",30);
        Person02 p2 = new Person02("zhansan",10);
        if (p1.equals(p2)) {
            System.out.println("equals");
            System.out.println(p1.hashCode());
            System.out.println(p2.hashCode());
        } else {
            System.out.println("not equals");
            System.out.println(p1.hashCode());
            System.out.println(p2.hashCode());
        }
    }
   
    private void cloneTest() throws Exception {
        Person03 p=new Person03("zhansan",12);  
        Person03 p2=(Person03) p.clone();  
        p2.name="lisi";  
          
        System.out.println(p);  
        System.out.println(p2);  
    }
   
    private void compareTest() {
        Person5 p[] = new Person5[6]; 
        p[0] = new Person5("张三",20,96); 
        p[1] = new Person5("李四",19,96); 
        p[2] = new Person5("钱八",19,97); 
        p[3] = new Person5("赵六",21,78); 
        p[4] = new Person5("孙七",20,80);
        p[5] = new Person5("王五",19,97);
        Arrays.sort(p) ; 
        for(int i=0;i<p.length;i++) 
        { 
         System.out.println(p[i]) ; 
        } 
        System.out.println("------------------------") ;
        //如果把compareTo方法除掉,则会包类型转换异常java.lang.ClassCastException  
        Set s = new TreeSet() ;  
        s.add(new Person5("钱八",19,97));
        s.add(new Person5("张三",20,96));  
        s.add(new Person5("李四",19,96));  
        s.add(new Person5("王五",19,97));  
        s.add(new Person5("赵六",21,78));  
        s.add(new Person5("孙七",20,80));  
          
        Iterator iter = s.iterator();  
        while(iter.hasNext()){  
         System.out.println(iter.next());  
        } 
    }
}

//对象序列化  
//对象序列化是指把对象写入到流中,对象的反序列化是指从流中恢复对象  
//其优点是:即使程序运行结束,对象仍然可以保存下来。必须实现Serializable接口  
//一个类想实现序列号,必须实现Serializable接口
//此接口只是一个声明接口,表示实现此接口的类可以被实例化  
//如果某个属性不要求进行序列化,则用关键字transient。  
class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    // private int age;
    // 如果某个属性不要求进行序列化
    private transient int age;

    public Person(String name, int age) {

        this.name = name;
        this.age = age;
    }

    public String toString() {
        return this.name + " " + this.age;
    }
}   
//HashCode方法,JAVA中的对象都有自身的HashCode码  
class Person02 {
    private String name;
    private int age;

    public Person02(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "姓名:" + this.name + "年龄:" + this.age;
    }

    //复写equals 和 HashCode 方法  
    //HashCode 方更多的是表示对象 的地址  
    public boolean equals(Object obj) {
        if (this.hashCode() == obj.hashCode()) {
            return true;
        }
        return false;
    }

    public int hashCode() {
        return this.name.hashCode() + this.age * 1000;
    }
}

//克隆方法的使用,必须实现Cloneable接口  
//而且必须覆写Object类的clone方法  
//protected Object clone()throws CloneNotSupportedException  
//Cloneable也是一个标识接口。类似于Serializable  
class Person03 implements Cloneable {
    public String name;
    private int age;

    public Person03(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "姓名:" + this.name + " 年龄:" + this.age;
    }

    //扩大父类的权限为公共的  
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

// 比较器:Array类是一个专门用于数组排序的,可以对任何数据进行排序
// 对象排序的内容必须实现Comparable接口,覆写compareTo方法定义规则
// 还可以用在TreeSet上实际上TreeSet也需要比较器的支持
class Person5 implements Comparable {
    private String name;
    private float score;
    private int age;

    public Person5(String name, int age, float score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public String toString() {
        return "姓名:" + this.name + " 年龄:" + this.age + "分数" + this.score;
    }

    @Override
    public int compareTo(Object obj) {
        Person5 p = (Person5) obj;
        if (p.score > this.score) {
            return 1;
        } else if (p.score < this.score) {
            return -1;
        } else {
            // 如果成绩相等则判断年龄
            if (p.age > this.age) {
                return 1;
            } else if (p.age < this.age) {
                return -1;
            } else {
                return 0;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值