25JavaAPI与字符串

目录

一,API

API概述:

java API

使用API帮助文档

二、字符串

1.String类概述

2.String类特点

3.创建String类的两种方式

 (1).直接赋值

(2).String类的构造方法

4.创建String类的内存图

5.字符串的比较

1.= = 号的作用

2.equals方法的作用

3.equalsIGnoreCase方法的作用

三、StringBuilder

1.StringBuilder概述

2.StringBuilder构造方法 

3.StringBuilder常用方法 

4.链式编程

四、StringJoiner

1.概述

2.StringJoiner的构造方法

3.StringJoiner的成员方法

 4.链式编程

五、字符串相关类的底层原理

1. 字符串存储的内存原理

(1). String s = “abc”;直接赋值

(2). new出来的字符串

2. ==号比较的到底是什么?

3.字符串拼接的底层原理

拼接时右侧没有变量

拼接时右侧有变量

4.StringBuilder提高效率原理图


一,API

API概述:

API (Application Programming Interface) :应用程序编程接口

java API

指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。

使用API帮助文档

二、字符串

1.String类概述

String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的对象。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!

2.String类特点

  • 字符串不可变,它们的值在创建后不能被更改
  • 虽然 String 的值是不可变的,但是它们可以被共享
  • 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )

3.创建String类的两种方式

 (1).直接赋值

String name = "XXXXXXX"

(2).String类的构造方法

public class StringDemo01 {
      public static void main(String[] args) {
          //public String():创建一个空白字符串对象,不含有任何内容
          String s1 = new String();
          System.out.println("s1:" + s1);
     
          //String s = “abc”;	直接赋值的方式创建字符串对象,内容就是abc
          String s2 = "abc";
          System.out.println("s2:" + s2);

          //public String(char[] chs):根据字符数组的内容,来创建字符串对象
          //需求:可以修改字符串内容
          char[] chs = {'a', 'b', 'c'};
          String s3 = new String(chs);
          System.out.println("s3:" + s3);
  
          //public String(byte[] bys):根据字节数组的内容,来创建字符串对象
          //应用场景:以后在网络中运输的数据都是用的字节信息
          //当需要把字节信息进行转换成为字符串,此时需要这个构造
          byte[] bys = {97, 98, 99};
          String s4 = new String(bys);
          System.out.println("s4:" + s4);//abc
  
          
      }
  } 

4.创建String类的内存图

 可以理解成字符串常量池,顾名思义其用来存储字符串,但只存储直接赋值的字符串,对于new出来的字符串不存储

JDK7版本之前其在方法区中

从JDK7开始,其从方法区挪到了堆内存

 

 当直接赋值时,系统会检查字符串在字符串串池中是否存在,如果不存在就创建新的,如果存在的话直接复用

 通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同,所以这种方式可能会浪费内存

5.字符串的比较

1.= = 号的作用

  • 比较基本数据类型:比较的是具体的值
  • 比较引用数据类型:比较的是对象地址值、

注意:键盘输入的abc,与直接赋值的abc是不相等的,因为前者是new出来的,后者是直接赋值


2.equals方法的作用

比较两个字符串的内容,完全一样true,否则为false

 public boolean equals(String s)

boolean result = s1.equals(s2) ;

3.equalsIGnoreCase方法的作用

比较两个字符串的内容,但是不区分大小写

综上所述要想比较两个字符串的内容应该用String的算法==方法,而不能用==

三、StringBuilder

1.StringBuilder概述

StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的。

作用:提高字符串的操作效率

注:Java在底层对其做了一些特殊处理,打印对象不是地址值而是属性值(具体值)

public class StringBuilderDemo4 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("abc");
        System.out.println(sb);//abc

    }
}

2.StringBuilder构造方法 

3.StringBuilder常用方法 

public class StringBuilderDemo4 {
    public static void main(String[] args) {
        //1.创建对象
        StringBuilder sb = new StringBuilder();

        //2.添加字符串
        sb.append("aaa").append("bbb").append("ccc").append("ddd");

        System.out.println(sb);//aaabbbcccddd

        //3.再把StringBuilder变回字符串
        String str = sb.toString();
        System.out.println(str);//aaabbbcccddd

    }
}

值得一提的是String类不能修改,但是StringBuilder类是可以修改的比如reverse反转字符串,实际上是对字符串本身直接操作的

public class StringBuilderDemo3 {
    public static void main(String[] args) {
        //1.创建对象
        StringBuilder sb = new StringBuilder("abc");

        //反转
        sb.reverse();//cba

        System.out.println(sb);
    }
}

4.链式编程

当我们在调用一个方法的时候,不需要用变量接受它的结果,可以继续调用其他方法

上述代码段,添加字符串部分,就是链式编程简化后的

四、StringJoiner

1.概述

  • StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
  • 作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。
  • JDK8出现

2.StringJoiner的构造方法

//1.创建一个对象,并指定中间的间隔符号
StringJoiner sj = new StringJoiner("---");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
//3.打印结果
System.out.println(sj);//aaa---bbb---ccc
StringJoiner sj = new StringJoiner(", ","[","]");//间隔符,  开始符号[  结束符号]
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
int len = sj.length();
System.out.println(len);//15
//3.打印
System.out.println(sj);//[aaa, bbb, ccc]
String str = sj.toString();
System.out.println(str);//[aaa, bbb, ccc]

3.StringJoiner的成员方法

 实例参考上一个代码段和上上一个代码段

 4.链式编程

StringJoiner也支持链式编程,参考上一个代码段和上上一个代码段

五、字符串相关类的底层原理

1. 字符串存储的内存原理

(1). String s = “abc”;直接赋值

   特点:

   ​    此时字符串abc是存在字符串常量池中的。

   ​    先检查字符串常量池中有没有字符串abc,如果有,不会创建新的,而是直接复用。如果没有abc,才会创建一个新的。

   所以,直接赋值的方式,代码简单,而且节约内存。

(2). new出来的字符串

   看到new关键字,一定是在堆里面开辟了一个小空间。

   String s1 = new String(“abc”);

   String s2 = “abc”;

   s1记录的是new出来的,在堆里面的地址值。

   s2是直接赋值的,所以记录的是字符串常量池中的地址值。

2. ==号比较的到底是什么?

   如果比较的是基本数据类型:比的是具体的数值是否相等。

   如果比较的是引用数据类型:比的是地址值是否相等。

   结论:==只能用于比较基本数据类型。不能比较引用数据类型。

3.字符串拼接的底层原理

拼接时右侧没有变量

 拼接的时候没有变量,都是字符串。触发字符串的优化机制。
在编译的时候就已经是最终的结果了。

javac命令会将程序员编写的java命令进行编译成class文件,检查拼接过程中是否有变量,如果没有变量在编译过程中就已经是最终的结果了,会复用串池中的字符串

拼接时右侧有变量

(1) JDK8之前会用StringBuilder进行拼接

a和b分别加入到串池中。然后用append方法将s1和b拼接成ab,再通过tostring方法转化为字符串

第三行代码也是同理,c加入到串池中,然后再创建一个Stringbuilder方法让s2、c进行拼接成abc,然后用tostring方法将其转化为字符串 

虽然StringBuilder效率高,但是在拼接s2和s3时分别使用了StringBuilder(一个加号就得创建两个对象)这样比较繁琐,速度慢,性能差

(2) JDK8之后会用StringBuilder进行拼接

系统预估字符串长度并创建一个数组,然后将这个数组变成一个字符串

 这个方法中,虽然简单了不少,但是预估过程也需要大量时间

结论:很多字符串变量进行拼接,不要直接用+,因为会在底层穿件多个变量,浪费时间,浪费性能

4.StringBuilder提高效率原理图

 

StringBuilder是一个内容可变的容器,因此速度快 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刹那芳华❀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值