String详细讲解

String

1、String字符串

  实例化String对象:

  (1)直接赋值,如:String str="hello";

  (2)使用关键字 new,如:String str=new String("hello");

 

        

   

  由图可知:使用 new 的方式在堆内存中开辟了两个空间,

  第一个 "hello",对象 str 没有指向,无用等待回收,

  第二个 "hello",被 str 指向,有用。

    所以 直接赋值(只开辟了一个空间) 的方式更常用和合理,可以节省一些空间。

  字符串的内容不可更改

     如:

   

        

   

2、String字符串常用方法

     String字符串的方法较多,可以根据API给出的方法去做测试,下面是常用方法:

     (1)字符串长度:length() 「数组中的是 length 属性」

     (2)字符串转换数组:toCharArray()

     (3)从字符串中取出指定位置的字符:charAt()

     (4)字符串与byte数组的转换:getBytes()

     (5)过滤字符串中存在的字符:indexOf()  返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。(可以用在判断多位数是否包含某个数字时,先转成string再判断)

     (6)去掉字符串的前后空格:trim() 「空格易影响到对字符串的判断,需适时去掉」

     (7)从字符串中取出子字符串:subString()

     (8)大小写转换:toLowerCase() toUpperCase()

     (9)判断字符串的开头结尾字符:startWith() endsWith()

     (10)替换String字符串中的一个字符:replace()

 

3、StringBuffer的常用方法:

  append() insert() replace() indexOf()

  StringBuffer类的应用:

     为什么有的时候要用StringBuffer,而不用String:

   String是不可变的,所以要对String作改动不能直接改那个String本身,而是要创建新的String,所以如果改动次数多,用String就效率不高,而StringBuffer(如果是单线程则建议用StringBuilder,不用考虑线程安全性,效率更高点)。有朋友说1.5后StringBuffer和String的拼接性能差不多则不敢苟同,如下测试在我的机器上用JDK1.8测试:

 1 public class demo {
 2     public static void main(String[] args) {
 3         long l = System.currentTimeMillis();
 4         String s = "";
 5         for (int i = 0; i < 100000; i++) {
 6             s += "q";
 7         }
 8         System.out.println(System.currentTimeMillis() - l);
 9         System.out.println(s.substring(0, 1));
10 
11         l = System.currentTimeMillis();
12         StringBuffer sb = new StringBuffer();
13         for (int i = 0; i < 100000; i++) {
14             sb.append("q");
15         }
16         System.out.println(System.currentTimeMillis() - l);
17         System.out.println(sb.toString().substring(0, 1));
18     }
19 }
 

输出:

3870
q
3
q

 

    也就是做10万次拼接,String要3.87秒,而StringBuffer则只要0.003秒,差别还是相当大的。(JDK1.6有9s多的差距)

 

4、StringBuilder

  一个可变的字符序列,该类被设计作用StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候,建议优先考虑该类,速度比StringBuffer要快

     但如果涉及到线程安全方面,建议使用StringBuffer

    常用方法:

  append() insert() …

 

String是一个非常常用的类,应该深入的去了解String

如:

String str =new String("abc")

String str1 = "abc"

System.out.println(str == str1)

System.out.println(str.equal(str1))

结果:

false

true

 

原因解析:

  • Java运行环境有一个字符串池,由String类维护。

 1. 执行语句String str="abc";时。首先查看字符串池中是否存在字符串"abc",如果存在则直接将“abc”赋给str,如果不存在则先在  字 符串池中新建一个字符串"abc",然后再将其赋给str.

 2. 执行语句String str = new String("abc");时。不管字符串池中是否存在字符串“abc”,直接新建一个字符串“abc”,(注意,新建的字符串“abc”不是在字符串池中), 然后将其赋给str。由此可见 1.的效率要高于2的效率。


 3. String str1="java";//指向字符串常量池
     String str2="blog";//指向字符串常量池
       String   s = str1+str2;

  +运算符会在中建立起两个String对象(注意是堆中不是字符串常量池,这两个对象的值分别是“java”,"blog",也就是说从字符串常量池中复制这两个值,然后再堆中创建两个对象。然后再建立对象s,然后将“javablog”的堆地址赋给s.  这句话共创建了3个String对象


       System.out.println(s=="javablog");//结果是false;

       JVM确实对形如String str="javablog";的对象放在常量池中,但是它是在编译时name做的。而String s=str1+str2;是在运行时候才能知道的,也就是说str1+str2是在堆里创建的,所以结果为false了

1     String s="java"+"blog";//直接将javablog对象放入字符串池中。        
2     System.out.println(s=="javablog");//结果是true;

3     String s=str1+"blog";//不放在字符串池中,而是在堆中分分配。       
4     System.out.println(s=="javablog");//结果是false;


      总之,创建字符串有两种方式:两种内存区域(pool,heap)
      1.""创建的字符串在字符串池中。
      2.new 创

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值