Java核心API-----String

本文深入探讨Java中字符串(String)的特性和操作,包括不可变性、常量池、编码方式、常见API如indexOf、substring等,以及如何使用StringBuilder解决字符串频繁修改的问题。对比StringBuffer,了解不同场景下的性能差异。

字符串基本操作  

     
一、String及其常用API


    1.String是不可变对象


    ·java.lang.String使用了final修饰,不能被继承
    ·字符串底层封装了字符数组及针对字符数组的操作算法
    ·字符串一旦创建,对象永远无法改变,但字符串引用可以重新赋值
        -String str = "hello";
        str = str+ "!";
        其实在堆中又新建了一个String类其中是“hello!”,原字符串“hello”不再被引用,即要被销毁。
        字符串没有被引用后会被立即销吗?
    ·Java字符串在内存中采用Unicode编码方式,任何一个字符对应两个字节的定长编码。
        -指用两个字节表示Unicode编码,不是表示字符串,也就是65536个字符。
    
    char是两个字节?     
    java中字符串存在什么里面,在堆还是栈?字符串是类,应该在堆中
    


    2.String常量池


    ·Java为了提高性能,静态字符串(字面量/常量/常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串
    ·对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果存在即返回该对象。
    ·所以有个弊端,不利于频繁修改字符串。
    -------如下代码
    String str1 = "123hello";
    String str2 = "123hello";
    String str3 = "123" + "hello";
    String str4 = 1+23+"hello";
    String str5 = "1" + 23 + "hello";
    String str6 = 1 + "23" + "hello";
    String str7 = 1+'2'+"3" + "hello";    
    String str8 = new String("123hello"); //new 表示创建新对象,只有使用字面量赋值才会使用常量池中原来的对象进行重用。    
    print(str1 == str2); //true
    print(str1 == str3); //true
    str1 == str4 //false  后者为“24hello”
    str1 == str5 //true  
    str1 == str6 //true
    str1 == str7 //false 1+'2'为正数 
    str1 == str8 //false  二者地址不一样
    
    按照上述理解,最后应为false,但实际结果是true,
    涉及一个编译器特性:
        -当一个表达式运算两边都是字面量,那么编译的过程中就会进行计算,将结果生成在表达式的位置,可以节省运算时的开销。
    


    
    3.内存编码及长度


    ·String在内存中采用Unicode编码,每个字符占用两个字节,任何一个字符(无论中文还是英文)都算1个字符长度,占用两个字节
    


    4.使用indexOf实现检索


    ·indexOf方法用于实现在字符串中检索另外一个字符串
    ·String提供几个重载的indexOf方法
    ---------------------------------------------------
    int indexOf(String str )                | 返回第一次出现str的位置,找不到返回-1
    int indexOf(String str, int fromIndex) | 从formIndex位置开始检索
    int lastIndexOf(String str, int form)  | 返回最后一次出现str的位置
    


    
    5.使用substring获取字串


    ·substring获取子串
    ------------------------------------------------------
    String substring(int beginIndex, int endIndex) | 返回字符串中从下标beg(包括)开始到end(不包括)结束的子字符串
    String substring(int beginIndex)               |返回字符串中从下标beg(包括)开始,到字符串结尾的子字符串
    


    
    6.trim(查阅API)


    String trim() | 取出字符串两边的空白,不包括中间
    


    7.chaAt(查阅API)


    ·char chatAt(int index)  | 用于返回字符串指定位置的字符。参数index表示指定的位置
    ·用处:判断回文 

 


    8.startWith和endsWith


    ·boolean startWith(String str)
    ·boolean endWith(String str)
    ·检测一个字符串是否以指定的字符串开头或结尾,返回值为true或false
    


    9.大小写变换


    ·String toUpperCase()  | 把当前字符串中的英文部分转换为全大写
    ·String toLowerCase()  | 把当前字符串中的英文部分转换为全小写
    ·用处:验证码的判断,将源码和输入码都转换为大写或小写后比较
    


    10.valueOf


    ·有若干重载方法,静态方法,String.valueOf(参数)调用
    ·常用:将八个基本类型转换成对应的字符串 
    


二、StringBuilder(解决字符串频繁修改)


    本身不是字符串,是为了解决字符串修改带来的内存消耗
    追加的时候,不会新建一个类,而是在后面追加。
    用法:StringBuilder builder = new StringBuilder(); new StringBuilder("Hello")
          builder.toString()

 


    1.StringBuilder封装可变字符串


    ·
    
    2.使用append实现追加


    StringBuilder append(Stirng str)             | 追加字符串
    
    


    3.insert


    StringBuilder insert(int dstOffset, String s) | 插入字符串·
    


    4.delete


    StringBuilder delete(int start, int end)      | 删除字符串
    StringBuilder replace(int start, int end, String str)      | 替换字符串
    StringBuilder reverse()                       | 字符串反转,用处判断是否回文,反转,判断是否相等即可  
    


    5.返回值都是StringBuilder,用处:可以连续用“.” 运算符操作


    


    6.StringBuffe和StringBuilder


    -StringBuffe是线程安全的,同步处理的,性能稍慢
    -StringBuilder时非线程安全的,并发处理的,性能稍快
    -除此之外,功能,参数,方法没有区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值