java String 详解

java String详解


在这里插入图片描述

String

下面是jdk中string 的源码:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    private final char value[];

    private final int offset;

    private final int count;

    private int hash; // Default to 0

    private static final long serialVersionUID = -6849794470754667710L;

    ........
}

类的定义中可以看出

1.String类是final的,它的所有成员变量也都是final的。

2.上面列举出了String类中所有的成员属性,从上面可以看出String类其实是通过char数组来保存字符串的。

构造方法

String()初始化新创建的 String对象,使其表示空字符序列。
String(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组构造新的 String
String(byte[] ascii, int hibyte)**已过时。**此方法无法将字节正确转换为字符。
String(byte[] bytes, int offset, int length)通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String
String(byte[] ascii, int hibyte, int offset, int count)**已过时。**此方法无法将字节正确转换为字符。
String(byte[] bytes, int offset, int length, String charsetName)通过使用指定的字符集解码指定的字节子 String构造新的 String
String(byte[] bytes, int offset, int length, Charset charset)通过使用指定的charset解码指定的字节子String构造新的String
String(byte[] bytes, String charsetName)构造一个新的String由指定用指定的字节的数组解码charset
String(byte[] bytes, Charset charset)构造一个新的String由指定用指定的字节的数组解码charset
String(char[] value)分配新的 String ,使其表示当前包含在字符数组参数中的字符序列。
String(char[] value, int offset, int count)分配一个新的 String ,其中包含字符数组参数的子数组中的字符。
String(int[] codePoints, int offset, int count)分配新的 String ,其中包含 Unicode code point数组参数的子数组中的字符。
String(String original)初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。
String(StringBuffer buffer)分配一个新字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。
String(StringBuilder builder)分配一个新字符串,其中包含当前包含在字符串构建器参数中的字符序列。

赋值

string 中提供的具体方法就不说了下面看一下string 两种赋值方式

String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);  //返回true。
//因为String类是引用数据类型,“==”比较的是两个引用变量的地址;如果是基本类型变量,则比较的是变量值。

String name1 = new String("xubing");
String name2 = new String("xubing");
System.out.println(name1 == name2); 
//因为两个变量指向的地址不一样,所以返回false。 

  1. string = “” 方式,如果在jvm内存中存在相同值的数据将地址直接指向定义值;

  2. new String() 的方式是在jvm直接创建一个对象并且将地址指向该对象

String 拼接

//这段字符串拼接
String str1 = "111111";
String str2 = "222222";
String str = str1 + str2;
System.out.println(str);


//相当于这段
String str1 = "111111";
String str2 = "222222";
StringBuilder sb = new StringBuilder();
sb.append(str1);
sb.append(str2);
String str = sb.toString();
System.out.println(str);

因此当有大量的字符串拼接的操作的话就会重复的创建StringBuilder,所以当有大量的字符串拼接的操作的话尽量使用StringBuilder


由上面两个简单的对比我们不仅仅是要知道string 的这两个小特性,需要明白的是在jvm 中string 到底是一个什么样的存在?为什么会产生这样的情况?

字符串常量池:

jVM为了提高性能和减少内存的开销,在实例化字符串的时候进行了一些优化:使用字符串常量池。每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中.由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串

String a = “” 这种方式就是直接指向常量池中的某个地址,但是 new String ()这种区别就是首先会判断在字符串常量池中有没有这个字符串,如果没有则创建该对象同时在堆中创建一个对象指向常量池中的对象地址,因此可以得出上边的两种特性

理解一下下图:

就是直接指向常量池中的某个地址,但是 new String ()这种区别就是首先会判断在字符串常量池中有没有这个字符串,如果没有则创建该对象同时在堆中创建一个对象指向常量池中的对象地址,因此可以得出上边的两种特性

理解一下下图:

img

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值