String类中常见小问题

来源:互联网 发布:python rfm模型 编辑:程序博客网 时间:2024/05/21 07:01

1.String 对象直接实例化和调用构造方法比较

String从命名可知S大写,代表着String是一个类。而作为一个类,则必定会有相应的构造的方法,故有一下代码
String str1=“hello";String str2=new String("hello");

两种方式虽然都是为对象赋值,但是两者却存在区别:
首先必须弄明白一个重要的概念,即一个字符串就是一个String类的匿名对象,匿名对象就是已经开辟了堆内存空间的并且可以直接使用的对象
public class StringDemo01{       public static void main(String[] args){              System.out.println("\'hello\'' equals \"hello\"---->"+("hello".equals("hello")));       }}
运行结果为:
'hello'' equals "hello"---->true



通过”hello“.equals(),可以知道其为字符串调用函数,所以就证明了一个字符串就是一个String类的匿名对象。对于直接赋值的方式实际上就是将一个在堆内存空间的使用权给了str1对象,使用这种方法同样还有一个好处,就是如果一个字符串已经被名称所引用,则以后再有相同的字符串声明时就不会再重新开辟空间,儿可以继续使用之前的已开辟好的堆内存空间。即下面内容

2.java对象池——字符串池

public class StringDemo01{    public static void main(String[] args){        String str1="hello";            String str2="hello";        String str3="hello";            System.out.println("str1==str2-->"+(str1==str2));            System.out.println("str1==str3-->"+(str1==str3));            System.out.println("str2==str3-->"+(str2==str3));    }}


运行结果:
str1==str2-->truestr1==str3-->truestr2==str3-->true
由运算结果可以知道,三者的地址相同,故使用的空间也相同,如下图:
故有上图知,当String使用直接赋值的方式之后,只要以后如果声明的字符串内容相同,则都不会再开辟新的内存空间。
   字符串池:对于String的以上操作,在java设计中称为共享,这种设计思路是,在java中形成一个对象池,在这个对象池中保存多个对象,新实例化的对象如果已经在池中定义了,就不需要再重新定义,而从池中直取出继续使用。String正是采用了这样的设计,所以当内容重复时,会将对象指向一存在的实力空间。
但是使用new关键字,无论如何都会开辟一个空间。String str2=new String("hello");
通过以上的内容可知,采用new关键字的方法,会有一个垃圾空间,因此利用直接赋值的方法会显得更好。

3.字符串的内容不可改变

首先看以下实例:
public class StringDemo01{    public static void main(String[] args){    String str="hello";    str=str+" world";        System.out.println("str="+str);    }}

运行结果:
str=hello world

从程序运行结果看,String对象的内容”确实改了”,但是实际上却没有,如下图所示:



通过以上可以知道,一个String对象的内容的改变实际上是通过内存地址的“断开-连接”变化完成的,而本身字符串的内容并没有任何变化。


4.String在开发中的不正确应用

由于上面的只是可知,在以后的程序开发中一定要明确字符串的内容不可改变这一重要特性,所以对于下述代码一定要避免
public class StringDemo01{    public static void main(String[] args){    String str="hello";    for(int i=0;i<100;i++){    str=str+" world";    }        System.out.println(str);    }}

代码通过100次循环,其中有很多的“连接-断开”过程,这样程序的性能很低,故在以后的StringBuffer可以代替这一缺陷。

小结:
通过对String中常见问题的了解,知道了String类直接实例化以及构造方法形式的差别,另外通过堆栈内存图知道了一些以前不知道的知识。以上问题如有问题,请指出!




























0 0
原创粉丝点击