深入关注和理解String类

来源:互联网 发布:视频抠像用什么软件 编辑:程序博客网 时间:2024/06/01 20:07

1.关于String类,主要由以下3个点:

    (1)String类是final类,内容一旦声明就不可改变;

   (2)String变量有两种赋值方式:直接赋值和用new开辟内存空间;

   (3)String类是Java共享模式的一种应用;

2.String对象的比较,"==”和“equals”:

     (1)对于“==”而言,在int或其他基本数据类型之中,可以使用==”进行是否相等的验证,但在String中,因为String本身虽然可以直接像基本数据类型那样直接赋值,但是其用“==”比较时依然要依靠内存的指向;“==”如果直接应用在字符串上进行比较,则表示比较的是内存地址的值;

    (2)如果要比较字符串里面的内容,则肯定要使用一个方法:此方法为String类的内部提供的一个方法:public boolean equals(String str)  ==> 比较两个字符串是否相等;equals比较两个字符串的内容是否相等的;

   由于String类是final类,虽然当我们想要用代码去改变其内容时看到的似乎是改变了字符串的内容,但是实际上我们只是改变了String变量的地址指向,下面我们以一个例子来进行分析:

    例:String str = "ab";

       String str += "cd";

    实际我们可以看到最后得到的变量str的字符串内容是abcd,但是我们分析便知其中的原理;首先匿名对象"ab"在对内存中开辟了内存空间,然后String变量str指向"ab"所在的内存,然后到了第二句代码,匿名对象"cd"也在堆内存中开辟了内存空间,然后在执行期进行字符串连接操作,得到了字符串"abcd",然后"abcd"也会在对内存中要空间,所以最后str指向新的内存地址,即"abcd"所在的内存地址,所以说实际上只是改变了String变量的地址指向;注意:在以后的编程中,不要以这样的方式试图去改变字符串内容,这样很影响程序的性能,因为每一次的改变都需要变量对内存地址引用的连接和断开。

   综上,我们可以引入下一个点,即StringBuffer类,String的缓冲操作,这个类所声明的变量是可以改变的。

3.StringBuffer

  (1)StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类;如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。

      (2) 在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。

   (3)但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。

   (4)由于StringBuffer是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

4.关于String的两个内在特别理解

    (1)例:

        String str1 = "a";

        String str2 = "a";

        System.out.println(str1 == str2);

     上面输出的是true;在String类中,如果一个字符串已明确有了一个对象的指向,则以后其他的String对象如果声明的内容是一样的,则他们自动指向同一个空间。

  (2)对于String str = new String("a")的理解

     首先匿名对象"a"在堆内存中开辟了内存空间,然后new String("a") 使用new在堆内存中又开辟了一个空间“a”,最终str指向最后生成的那个"a"的内存空间,而最早的那个“a”就没使用到;

   综合以上来说,肯定是直接使用赋值的方式比较合适一些,因为只产生一个对象,而如果使用new 关键字开辟,则会产生两个对象。

5.String类常用方法汇总

         (1)求出字符串的长度:public int length() ;

    (2)将一个字符串变为字符数组:public char[] toCharArray();

    (3)将一个字符串按指定的字符分割:public String[] split() ;

    (4)截取字符串 
        public String subString(int beg) 
        public String subString(int beg,int end)

    (5)替换方法,把一个字符串中的某个指定的字符替换成其他内容 
        public String replaceAll(String 原字符串,String 要替换的新字符串)

    (6)去掉左右空格,输入数据的时候常使用 
        public String trim() ;

    (7)判断一个字符串是否以指定的字符串开头或结尾 
        public boolean startsWith(String str):判断是否以str开头 
        public boolean endsWith(String str):判断是否以str结尾

    (8)查找在一个字符串中是否有指定的字符串存在。 
        public int indexOf(String str):查找在一个字符串中是否包含了str,如果包含了,则返回位置,如果没有查到,则返回-1;

 6.总结 

     (1)String类是不可改变,如果要改变,改变的是内存地址的指向 
     (2)String类两种赋值方式的区别,使用直接赋值 
     (3)String的内容比较使用equals,==比较的是内存地址的值 



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人用了狗沐浴露怎么办 狗狗吞食牙膏吐怎么办? 狗狗吞食了牙膏怎么办 大猪拉稀不吃食怎么办 猪不发烧不吃食怎么办 天天吃自热米饭怎么办 喝了加热包水怎么办啊 蛋挞没有盒子装怎么办 塑料饭盒盖子被吸住了怎么办 火腿淹的有臭味怎么办 微波炉热饭盖子打不开怎么办 夏天带饭容易馊怎么办? 保温饭盒里有气打不开怎么办 保温饭盒摔了一下打不开怎么办 饭盒跟盖子盖一起打不开怎么办 玻璃杯子盖被水吸住打不开怎么办 电饭煲热剩饭没加水怎么办 微波炉碗盖子吸住了怎么办 微波炉转饭盖子吸住了怎么办 玻璃碗放进微波炉打不开怎么办 乐扣微波炉加热后打不开怎么办 美的微波炉盖子打不开怎么办 美的微波炉门都打不开了怎么办 饭煮好了有异味怎么办 一正常吃饭就胖怎么办 高铁盒饭没15的怎么办 上火车前票丢了怎么办 减肥期吃了汉堡怎么办 寿司店鳗鱼有刺怎么办 吃泡面胃难受该怎么办 吃上火的东西脸上长痘痘怎么办 减肥期间吃撑了怎么办 喝了变质的牛奶怎么办 绿豆糕吃多了会怎么办 小孩抓米饭烫了手怎么办 减肥不来月经了怎么办 吃了馊了的米饭怎么办 饭在冰箱里硬了怎么办 剩米饭反潮了怎么办 吃馊米饭中毒后怎么办? 蒸熟的米饭发黄怎么办