关于java String类(源码等)分析
创始人
2024-01-22 22:57:08

String 类

在这里插入图片描述

  • String声明为final ,不可以被继承

  • String 实现了Serializable接口,表明字符串是可序列化的

  • String 实现了Compareble接口,表示String 可比较大小

  • String 内部定义了 final char[] value value用于存储字符串数据,表明了不可变的字符特性 ---- 1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值。3.当调用String 的 replace 方法修改指定的字符或字符串时,也需要重新指定内存区域赋值。

  • 通过字面量的方式(区别new)去给字符串赋值,此时字符串值声明在字符串常量池中,常量池中是不会存储相同内容的字符串的。

    package StringTT;

    import org.junit.Test;

    public class Stringlei {

      @Testpublic void test1(){String s1 = "abc"; // 字面量的定义方式String s2 = "abc";System.out.println(s1 == s2); // 对象比较的是地址值s1 = "hello";System.out.println(s1);System.out.println(s2);System.out.println("*****************");String s3 = "abc";s3 += "def" ;System.out.println(s3);}
    

    }

在这里插入图片描述

创建String对象

在这里插入图片描述
new 是在堆空间中创建

String s = new String(“abc”); 方式创建对象,在内存中创建了几个对象?两个:一个是堆空间new的结构,另一个是char[]对象常量池中的数据:“abc”

package StringTT;import org.junit.Test;public class StringTest2 {@Testpublic void test(){//方式一:通过字面量定义String s1 = "javaEE";String s2 = "javaEE";// 方式二:用new 在堆空间中创建String s3 = new String("javaEE");String s4 = new String("javaEE");System.out.println(s1 == s2);  // trueSystem.out.println(s3 == s4);  // false}
}	

常量与常量的拼接结果在常量词中,常量与变量拼接,结果就会在堆当中

@Test
public void test1(){String s1 = "javaEE";String s2 = "hadoop";String s3 = "javaEEhadoop";String s4 = "javaEE" + "hadoop";String s5 = s1 + "hadoop";String s6 = "javaEE" + s2;String s7 = s1 + s2;System.out.println(s3 == s4); // trueSystem.out.println(s3 == s5); // falseSystem.out.println(s3 == s6); // falseSystem.out.println(s3 == s7); // falseSystem.out.println(s5 == s4); // fasleSystem.out.println(s5 == s6); // fasleSystem.out.println(s5 == s7); // fasleString s8 = s5.intern(); // 得到的是在常量池System.out.println(s8 == s3); // true 
}

String 方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

String 和 char[] 的转换

  • String 转 char[] 用 String.toCharArray()方法

  • char[] 转 String 调用String 的构造器

    package StringTT;

    import org.junit.Test;

    public class StringTest1 {
    // String 和 byte的转换
    @Test
    public void test123(){
    String str1 = “abc123”;
    char[] charArray = str1.toCharArray();
    for (int i = 0;i < 100; i++){
    System.out.println(charArray[i]);
    }
    }

      @Testpublic void test2(){char[] ch1 = new char[]{'h','e','l','l','o'};String str2 = new String(ch1);System.out.println(str2);}
    

    }

String 和 byte[] 的转换

有中文的话就转不了一个数字了
编码 :字符串 --> 字节 (看得懂 -->看不懂)String 转 byte[] 用String的getBytes()方法
解码:字节 – > 字符串(看不懂的二进制 – > 看得懂)byte[] --> String
解码过程中,必须与编码所使用的字符集一致

package StringTT;import java.io.UnsupportedEncodingException;
import java.util.Arrays;import org.junit.Test;public class StringTest1 {// String  和 byte的转换@Testpublic void test123(){String str1 = "abc123";char[] charArray = str1.toCharArray();for (int i = 0;i < str1.length(); i++){System.out.println(charArray[i]);}}@Testpublic void test2(){char[] ch1 = new char[]{'h','e','l','l','o'};String str2 = new String(ch1);System.out.println(str2);}@Testpublic void test3() throws UnsupportedEncodingException{String str1 = "abc123中国";byte[] b1 = str1.getBytes(); // 使用默认的字符集进行转换System.out.println(Arrays.toString(b1)); //输出byte[] b2 = str1.getBytes("gbk"); //使用gbk字符集进行编码System.out.println(Arrays.toString(b2));//解码 byte[] --> StringString s1 = new String(b1); // 默认的字符集进行解码System.out.println(s1);}
}

StringBuffer 、StringBuilder、String 异同

  • String 不可变的字符序列,底层用char[]进行存储
  • StringBuffer 可变的字符序列,线程安全的,效率偏低,底层用char[]进行存储
  • StringBuilder 可变的字符序列,JDK5.0新增,线程不安全,效率高,底层用char[]进行存储

源码分析

String str = new String();//char[] value = new char[0];
String str = new String(“abc”); // char[] value = new char[]{‘a’,‘b’,‘c’};

StringBuffer str = new StringBuffer();//char[] value = new char[16]; 底层创建了一个长度是16的字符数组

StringBuffer str1 = new StringBuffer(“abc”); // char[] value = new char(“abc”.length + 16) 创建了长度为19的字符数组

问题1:打印str1的长度是多少呢?还是3
问题2:如果要添加的数据,底层数据盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的两倍+2,同时将原有数组的元素复制到新数组中

指导意义:开发中建议使用StringBuffer(int capacity) 或 StringBuilder(int capacity) ,就看需不需要考虑安全

package StringTT;import org.junit.Test;public class StringBufferBuiderTest {@Testpublic void test(){StringBuffer sb1 = new StringBuffer("abc");sb1.setCharAt(0, 'm');System.out.println(sb1);String s1 = "abc";s1.replace('a','m');System.out.println(s1); //s1不变}
}

在这里插入图片描述
public String substring – 返回一个start 开始 end索引结束的左闭右开区间的子字符串

在这里插入图片描述

效率从高到低排列:StringBuilder > StringBuffer > String

JDK8.0之前 日期和时间API

@Test
public void test(){long time = System.currentTimeMillis();System.out.println(time);  //1970/1/1 到我们现在的时间差 毫秒数,通常叫一个时间戳
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
最古之史实为方志 左传三不朽 学习时报人生的价值究竟是什么?用什么来衡量人生价值?这是一个曾被无数人问过且继续为无数人追问的话题,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
开山种田打一字谜 开山创始人打... 贵阳市花果园半山小镇兰花坡森林公园——居民开山种地 公园变成菜园山林菜地从山脚一直延伸至山顶,面积近...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...