Java碎碎念之最全String类总结

谈及string类相信大家在学习javase之后已经见过很多了,那么你真的了解它吗,让我带领大家再次重温String类,感受编程的魅力!
一、String类概述:
String:字符串,使用一对双引号引起来表示
1.String声明为final的,不可被继承的.
2.String实现了Serializable接口,表示字符串是支持序列化的.
实现了Comparable接口:表示String可以比较大小.
3.String内部定义了final char[] value用于存储字符串数据.
4.String代表不可变的字符序列,简称:不可变的特性.
体现:
*当对字符串重新赋值时需要重写指定内存区域赋值,不能使用原有的value进行赋值。
*当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value值进行赋值。
*当调用String的replace()方法修改指定的字符或字符串的时候,不能使用原有的value值进行赋值。

5.通过自变量的的方式(区别于new给一个字符串赋值),此时的字符串值声明在字符串常量池中.
6.字符串常量池中是不会储存相同的常量的,如果有相同的常量,则还是用已有的那个常量的地址.
7.关于在内存中地址的问题
1、常量与常量的拼接结果在常量池中。且常量池中不会存储相同的常量。
2、只要其中有一个是变量,结果就在堆中。
3、对于结果在堆中的常量,调用native方法intern可以在常量池中声明一个一样的常量。
一:字符串是常量
相信很多小爱你伙伴有疑问了,怎么会是常量呢?



package Demo;

public class Demo10 {

       public static void main(String[] args) {

 

              String s = "我是常量";

              System.out.println(s);

              s= "我是变量";

              System.out.println(s);

       }

}


结果:

我是常量
我是变量

#有小伙伴就会问,那这里明明变了啊,如果你这样想,说明你在思考问题了因为我当时也是这么想的,哈哈哈
其实,事实并非如此.代码中的s的值确实是改变了,因为他是变量,是可以改变的,而所谓的字符串是常量不可变是指"我是常量"和"我是变量"这两个值是不可变的,也就是说,在内存的堆中的常量池中存储的这个常量就是"我是常量"和"我是变量"是永远不会改变的了,如果你还要对s进行后续操作,那,一定是再次在堆中开辟了新的空间用来存储你操作后的类容.
#既然不可变,那就可以和static修饰的类容一样,可以大家共享,请看下面一段代码:



package Demo;

 

public class Demo10 {

  public static void main(String[] args) {

 

     String s = "我是常量";

     String a = "我是常量";

     String b = new String("我是常量");

     System.out.println(a == s);

     System.out.println(s == b);

  }

}


结果如下

true
false

这段代码就充分的体现了String类修饰常量的特点,大家都知道"=="比较两个值是否是同一个对象,equals比较两个值的大小是否一样.上面代码显示,a和s是同一个对象,而和b不是的.也就是说,当一个常量被创建,在内存中存在了这样一个空间去存储这个值,当下次遇到一模一样的常量的时候,会去遍历常量池,直接去使用他,而不会再次创建,提高了堆中内存的复用性.(调用的是intern这个方法)
二、StringBuffer、StringBulider、String三者的异同
1、String:不可变的字符序列;底层使用char[]存储
2、StringBuffer:可变的字符序列,线程安全,效率低,底层使用char型数组存储.
3、StringBuilder:可变的字符序列码,jdk5新增,线程不安全,效率高,底层使用char[]进行存储.
4、扩容问题:如果要添加的数据底层盛不下了,那就需要扩容底层的数组.默认情况下,扩容为原来的2倍+2,同时将原有的数组复制新数组中.
三者代码效率比较

package string;

/**
 * @author TR
 * @date 2020/8/4 - 下午 12:10
 * @describe:
 */
public class BufferBuilder {
    long start = 0l;
    long end = 0l;

    public static void main(String[] args) {
        BufferBuilder bb = new BufferBuilder();
        long string = bb.string("");
        System.out.println("string耗时:"+string);
        StringBuffer str1 = new StringBuffer("");
        long l = bb.stringBuffer(str1);
        System.out.println("StringBuffer耗时:"+l);
        StringBuilder str2 = new StringBuilder("");
        long l1 = bb.stringBuilder(str2);
        System.out.println("StringBuilder耗时:"+l1);
    }

    public long string(String str) {
        start = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            str = str + i;
        }
        end = System.currentTimeMillis();
        return end - start;
    }

    public long stringBuffer(StringBuffer str) {
        start = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            str.append(i);
        }
        end = System.currentTimeMillis();
        return end - start;

    }

    public long stringBuilder(StringBuilder str) {
        start = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            str.append(i);
        }
        end = System.currentTimeMillis();
        return end - start;

    }
}

-----------------------------------------------常用方法 ----------------------------------------
1)public char charAt(int index):根据下标获取字符
2)public boolean contains (String str):判断当前字符串是否包含str.
3)public char[] toCharArray():将字符串转换成数组.(这个方法的api里包含大量信息,感兴趣的小伙伴可以去看看,为什么要重新复制一份数组?)
4)public int indexOf(String str):查找str首次出现的下标,不存在返回(-1),存在返回该下标.
5)public int length():返回字符串的长度
6)public String trim():去掉字符串前后的空格
7)public String toUpperCase():将小写转换成大写.
8)public boolean endWith(String str),判断字符串是否以str结尾.
9)public String replace(char olderChar,char newChar):将旧字符串换成新字符串
10)public String[] split (String str):根据str做拆分 ps:拆分后的字符串不含str.
11)public String substring (int beginIndex):从索引为int beginIndex开始截取(包含int beginIndex对应的值).
12)public String substring (int beginIndex,int endIdex):截取二者索引之间的字符,包含前面的索引对应的但是不包含后面的对应的字符串.

StringBuffer和StringBulder常用的方法:
1)apend():用于字符串的拼接
2)delete():删除指定位置的内容
3)insert()在指定位置插入指定的字符串
多看API!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我只会javase

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值