java学习日记16,String类

在之前的学习中已经经常使用过String类,总觉得很特殊,既可以像基本数据类型一样直接赋值,又可以像类一样通过new的方式创建一个对象,今天就系统的学习一下String类。

概述

String:字符串,使用一对""引起来表示。
1.String声明为final的,不可被继承
2.String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小
3.String内部定义了final char[] value用于存储字符串数据
4.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
5.字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true)的字符串的。
6.String:代表不可变的字符序列。简称:不可变性。

String的不可变性

当我们对一个字符串变量进行修改、拼接、替换时,原有的字符串并不会变,而是重新指定内存区域赋值。
在这里插入图片描述
将同一个字符串赋值给两个字符串变量时,它们的引用对象是相同的,而如果修改其中一个变量,改变的不是这个变量原本引用的字符串的内容,而是改变这个变量引用的对象,并不影响其它变量引用的对象。

String实例化的不同方式

方式一:通过字面量定义的方式
方式二:通过new + 构造器的方式

在这里插入图片描述
字符串常量储存在字符串常量池,目的是共享;所以引用同一个字符串常量的s1和s2的地址值相同。
字符串非常量对象储存在堆中;所以通过new的方式创建的两个String对象的地址值不同。

字符串拼接方式赋值的对比

在这里插入图片描述
结论:
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要其中有一个是变量,结果就在堆中。
3.如果拼接的结果调用intern()方法,返回值就在常量池中。

String与其它结构的转换

1、与基本数据类型、包装类之间的转换
String --> 基本数据类型、包装类:调用包装类的静态方法: parseXxx(str)
基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)
2、与字符数组之间的转换
String --> char[]:调用String的toCharArray()
char[] --> String:调用String的构造器
3、 与字节数组之间的转换
编码:String --> byte[]:调用String的getBytes()
解码:byte[] --> String:调用String的构造器
4、 与StringBuffer、StringBuilder之间的转换
String -->StringBuffer、StringBuilder:调用StringBuffer、StringBuilder构造器
StringBuffer、StringBuilder -->String:①调用String构造器;②StringBuffer、StringBuilder的toString()

String 、StringBuffer 、StringBuilder三者的异同?

String:不可变的字符序列,底层使用char[]存储;
StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储;
StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储;

String类创建对象时,同时创建了一个与字符串长度相同的字符数组用于存储字符。
String str = new String(); //char[] value = new char[0];
String str1 = new String("abc); //char[] value = new char[]{‘a’,‘b’,‘c’};

StringBuffer创建对象时,默认创建的是一个长度为16的字符数组。
如果要添加的数据底层数组存不下了,那就需要扩容底层的数组。
默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。
StringBuffer sb1=new StringBuffer(); //char[] value = new char[16];底层创建了一个长度为16的char型数组
sb1.append(‘a’);//value[0]=a;
sb1.append(‘b’);//value[1]=b;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值