//把InputStreamReader裝飾成BufferedReader來成爲具有緩衝能力的Reader。
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
複製代碼
//把FileInputStream文件字節流適配成InputStreamReader字符流來操做文件字符串。
FileInputStream fileInput = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInput);
複製代碼
IO NIO
面向流 面向緩衝
阻塞IO 非阻塞IO
無 選擇器
複製代碼
public class MyUtil {
private MyUtil() {
throw new AssertionError();
}
public static <T> T clone(T obj) throws Exception {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bout);
oos.writeObject(obj);
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bin);
return (T) ois.readObject();
// 說明:調用ByteArrayInputStream或ByteArrayOutputStream對象的close方法沒有任何意義
// 這兩個基於內存的流只要垃圾回收器清理對象就可以釋放資源
}
}
class CloneTest {
public static void main(String[] args) {
try {
Person p1 = new Person("Hao LUO", 33, new Car("Benz", 300));
p1.clone();//淺克隆
Person p2 = MyUtil.clone(p1); // 深度克隆
p2.getCar().setBrand("BYD");
// 修改克隆的Person對象p2關聯的汽車對象的品牌屬性
// 原來的Person對象p1關聯的汽車不會受到任何影響
// 由於在克隆Person對象時其關聯的汽車對象也被克隆了
System.out.println(p1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
複製代碼
淺拷貝會建立新的對象嗎?php
對於基本類型拷貝的是什麼?java
怎麼樣實現淺拷貝,淺拷貝先後對象地址值會同樣嗎?git
public class Subject {
private String name;
public Subject(String s) {
name = s;
}
public String getName() {
return name;
}
public void setName(String s) {
name = s;
}
}
複製代碼
public class Student implements Cloneable {
// 對象引用
private Subject subj;
private String name;
public Student(String s, String sub) {
name = s;
subj = new Subject(sub);
}
public Subject getSubj() {
return subj;
}
public String getName() {
return name;
}
public void setName(String s) {
name = s;
}
/**
* 重寫clone()方法
* @return
*/
public Object clone() {
//淺拷貝
try {
// 直接調用父類的clone()方法
return super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
}
複製代碼
private void test1(){
// 原始對象
Student stud = new Student("楊充", "瀟湘劍雨");
System.out.println("原始對象: " + stud.getName() + " - " + stud.getSubj().getName());
// 拷貝對象
Student clonedStud = (Student) stud.clone();
System.out.println("拷貝對象: " + clonedStud.getName() + " - " + clonedStud.getSubj().getName());
// 原始對象和拷貝對象是否同樣:
System.out.println("原始對象和拷貝對象是否同樣: " + (stud == clonedStud));
// 原始對象和拷貝對象的name屬性是否同樣
System.out.println("原始對象和拷貝對象的name屬性是否同樣: " + (stud.getName() == clonedStud.getName()));
// 原始對象和拷貝對象的subj屬性是否同樣
System.out.println("原始對象和拷貝對象的subj屬性是否同樣: " + (stud.getSubj() == clonedStud.getSubj()));
stud.setName("小楊逗比");
stud.getSubj().setName("瀟湘劍雨大俠");
System.out.println("更新後的原始對象: " + stud.getName() + " - " + stud.getSubj().getName());
System.out.println("更新原始對象後的克隆對象: " + clonedStud.getName() + " - " + clonedStud.getSubj().getName());
}
複製代碼
2019-03-23 13:50:57.518 24704-24704/com.ycbjie.other I/System.out: 原始對象: 楊充 - 瀟湘劍雨
2019-03-23 13:50:57.519 24704-24704/com.ycbjie.other I/System.out: 拷貝對象: 楊充 - 瀟湘劍雨
2019-03-23 13:50:57.519 24704-24704/com.ycbjie.other I/System.out: 原始對象和拷貝對象是否同樣: false
2019-03-23 13:50:57.519 24704-24704/com.ycbjie.other I/System.out: 原始對象和拷貝對象的name屬性是否同樣: true
2019-03-23 13:50:57.519 24704-24704/com.ycbjie.other I/System.out: 原始對象和拷貝對象的subj屬性是否同樣: true
2019-03-23 13:50:57.519 24704-24704/com.ycbjie.other I/System.out: 更新後的原始對象: 小楊逗比 - 瀟湘劍雨大俠
2019-03-23 13:50:57.519 24704-24704/com.ycbjie.other I/System.out: 更新原始對象後的克隆對象: 楊充 - 瀟湘劍雨大俠
複製代碼