前言
今天继续上一次的总结,上一次总结的是java语言基础,今天主要总结java的面向对象程序设计。对于java面向对象程序设计的一些概念都不总结了,像什么java中没有类的多继承,但是可以继承多个接口什么的,java入门时几乎都会学到,不再累述。对于面向对象程序设计的核心——设计模式,以后会专门写一类博客来进行总结。本文主要总结一些在开发过程中会用,但是却不了解原理的东西。
一、包装类的内容不可改变性
一般的java书上都介绍了String这个类的内容不可改变性,但是实际上其他的包装类的内容也是不可改变的,即包装类对象的内容和字符串的内容都是一旦声明就不可改变,真正改变的只是引用的地址。例如
Integer i = 10;
Integer j = 10;
System.out.println(i==j);//输出方法1
i=10+20;
System.out.println(i==j);//输出方法2
方法1输出的是true,而方法2输出的是false,从此可以看出,执行i=10+20以后,i对象的引用变量空间所存的地址改变了,这一点和String对象是一样的。基于这一性质,包装类在使用时也要尽量避免循环中有i+=j (j为某一int型整数)形式的运算,因为这样会造成循环的修改i的地址,即要使对象的指向循环的断开-连接,这对于需要低时延的系统不是一行好的代码。对于这一情况,String可以用StringBuffer类替代,而包装类可以用对应的变量替代。
二、String与 StringBuffer的区别
上文说了用StringBuffer替代String可以避免改变字符串值时的断开-连接问题,而两者之间到底有什么本质区别呢?下面通过一个例子来解释两者之间的区别,例如
StringBuffer s1 = newStringBuffer("hello");
StringBuffer s2 = s1;
s2.append(" world");
System.out.println(s1==s2); //1
System.out.println(s1.equals(s2)); //2
System.out.println(s1); //3
System.out.println(s3); //4
第1、2句输出都是true,3、4句输出的都是helloworld,可以看出,StringBuffer声明的字符串,在改变其值的时候,改变的不是引用变量所指向的地址,而是对象真正的内容,这一点恰好与String类相反。这也是两者之间最主要的区别。