Java中的String

java的String类

      String为字符串属于对象,java提供String类的创建和操作字符串。


创建字符串

String str=“这是一个字符串”;

  这里创建了一个字符串的对象。运行这段语句时,JVM会在堆内存中开辟一段连续的空间,然后首地址赋给str。

那么为什么要开辟一段连续的空间?

  这里需要了解String的源码。首先String是引用数据类型,引用数据类型包括:对象,数组,类。而String是java中自带的类,它的底层实现中,定义的数据类型为:字符数组。String有11个构造函数,这些方法提供不同的参数来初始化字符串。

底层的数据源码:

private final char value[];

在底层的实现中,字符数组value是用privatefinal修饰的。

  1. 用private修饰说明,该数据不能别外界直接调用。
  2. java类库中的Stirng类中,没有提供给外界访问valua的方法
  3. final修饰的变量是不可变的。
  4. 在java中内存分为堆内存和栈内存,堆内存存放的是对象,栈内存存储对象的引用

String不可变,可以直接将String对象加载到常量池之中

根据这三条,就可以得出:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了。

那么问题又来了,为什么类库要将String类定义为不可变类型?

可变的对象,固然方便,但也带来了许多安全的隐患,以及效率问题。

相比于可变对象,不可变对象有很多优势:

  1. 不可变对象可以提高String Pool(字符串常量池)的效率和安全性。如果你知道一个对象是不可变动 ,那么需要拷贝的对象的内容时就不用复制它本身二只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存,效率也很好。二对于其他引用同一个对象的其他变量也不会造成影响。
  2. 可不变对象对于多线程滴安全的,因为在多线程同事进行的情况下,一个可变对象的值很可能被其他线程改变这样会造成不可预期的结果么人使用不可变对象就可以避免这种情况出现。

 

效率:

  1. 字符串常量池的需要:字符串常量池是java堆内存中一个特殊的存储区域,当创建一个String对象,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。(在java中内存分为堆内存和栈内存,堆内存存放的是对象,栈内存存储对象的引用,字符串“ABC”存放在堆内存中,而s1,s2作为对象的引用则存放在栈内存中。假设:字符串对象允许改变,那么将会导致各种逻辑错误。比如改变一个对象却影响到另外一个独立的对象,会出现逻辑错误)
  2. 运行String对象缓存HashCode:java中String对象的哈希码被频繁的使用,比如在HashMap的容器中。字符串不变性保证了hash码的唯一性,因此可以放心的进行缓存,这也是一种性能优化手段

安全:

  1. String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。

String类中提供的一些常用方法

  1. 字符串中包含的字符数:int length();
  2. 某一个角标位置上的字符:char charAt(int index);
  3. 判断字符串是否有内容:boolean isEmpty() :当且仅当长度为0时返回true。
  4. 判断字符串的内容是否相同:boolean equals(Object anObject) (复写了Object 类中的equals方法)
  5. 判断字符串的内容是否相同 ,(不考虑大小写):boolean equalsIgnoreCase(String anotherString)
  6. 将字符串转换成字符数组:char[] toCharArray() 
  7. 将字符串转换成大写或者小写。String toUpperCase() 
                  String toLowerCase() 
  8. 将字符串两端多余的空额去除。:String trim() 
  9. 子串:(获取一个字符串的一部分)

            String substring(int beginIndex) //从指定下标位置到结尾。
            String substring(int beginIndex, int endIndex) //从指定下标位置到结束下标位置前一个
  10. 根据字符获取该字符在字符串中的角标位置
  • int indexOf(int ch); 返回的是字符第一次出现的角标位置。
  • int indexOf(int ch,int fromIndex); 返回的是从fromIndex开始字符出现的角标位置。
  • int indexOf(String str); 返回的是字符串第一次出现的角标位置。
  • int indexOf(String str,int fromIndex); 返回的是从fromIndex开始字符串 出现的角标位置。
  • int lastIndexOf(int ch): 反向索引(种类和解释与正向索引相同 )注:反向索引只是从右向左索引找到第一次出现目标的角标位置, 返回的依然是角标位置。

StringBuffer

定义:字符串缓冲区, 为一个容器。

    特点:
      1、长度可变化。
      2、可以直接操作多个数据类型。
      3、最终通过toString方法返回一个字符串。

    c: create u: update r:read d: delete

      1、存储
        StringBuffer append():将指定数据作为参数添加到已有数据的结尾处。
            注:在StringBuffer对象调用appeed方法后,返回的就是其本身。
        StringBuffer insert(int offset, 基本数据 b) : 从offest下标位开始插入 基本数据类型、字符串或者数组 b。
            注:在StringBuffer对象调用insert方法后,返回的就是其本身。

      2、删除
        StringBuffer delete(int start, int end) : 移除下标start到 end-1的字符。
            注:在StringBuffer对象调用delete方法后,返回的就是其本身。
        StringBuffer deleteCharAt(int index) : 移除此序列指定下标位置的字符(char)。
            注:在StringBuffer对象调用deleteCharAt方法后,返回的就是其本身。

        清空缓冲区: sb.delate(0,sb.length());


      3、获取
        char charAt(int index) 返回此序列中指定索引处的 char 值。
        int indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。
        int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
        int lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引。
        int lastIndexOf(String str, int fromIndex) 返回最后一次出现的指定子字符串在此字符串中的索引。


        String substring(int start) 返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
        String substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列。
        注意:这里返回的是String,不StringBuffer。

          String toString():放回当前缓存区字符串。
          int length(): 返回字符数。



      4、修改

        StringBuffer replace(int start, int end, String str) 在start和end之间,用str替换

        void setCharAt(int index, char ch) 在index下标位置使用 字符dh替换原字符

      5、反转

        StringBuffer reverse() 

      6、
        void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 
        将缓冲区中的指定数据存到指定的字符数组中,从指定位置开始存。


StringBuilder

 其余StringBuffer功能一样。
      与StringBuffer的区别:
        StringBuffer是线程同步的。
        StringBuilder是线程不同步的。
当是单个线程操作缓冲区时,建议使用 StringBuilder 其有更高的效率。 

 

 



 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值