7.String

API

API概述

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

java API: JDK中提供的各种功能的java类, 封装了底层的实现, 无需关心如何实现, 只需要学习如何使用.

java帮助文档的使用.

  • 查看构造方法
  • 查看成员方法
package string;

import java.util.Scanner;

public class ScannerDemo {

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.println("请输入一句话:");
        String line = s.nextLine();
        System.out.println("输入的话是:" + line);
    }
}

String

概述

String在java.lang中,所以使用的时候不需要导包

String代表字符串,java中所有双引号字符串,都是string类的对象

特点:

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

String构造方法

方法名 说明
public String() 创建一个空白字符串对象, 不含有任何内容
public String(char[] chs) 根据字符数组的内容,来创建字符串对象
public String(byte[] bys) 根据字节数组的内容, 来创建字符串对象
String s = "abc"; 直接赋值的方式创建字符串对象, 内容就是abc

示例

package string;

/*
    构造方法:
        1.public String() 创建一个空白字符
        2.public String(char[] chs): 根据字符数组内容,创建字符串对象
        3.public String(byte[] bys): 根据字节数组创建字符串对象
        4.String s = "abc";直接赋值的方式创建字符串对象, 内容就是abc
        
    推荐:
    	直接使用赋值的方式获得字符串
 */

public class StringDemo {

    public static void main(String[] args) {
        // public String() 创建一个空白字符
        String s1 = new String();
        System.out.println("s1:" + s1);

        // public String(char[] chs): 根据字符数组内容,创建字符串对象
        char[] chs = {'a', 'b', 'c'};  // 字符用单引号, 字符串用双引号
        String s2 = new String(chs);
        System.out.println("s2:" + s2);

        // public String(byte[] bys): 根据字节数组创建字符串对象
        byte[] bys = {97, 98, 99};
        String s3 = new String(bys);
        System.out.println("s3:" + s3);

        // String s = "abc";直接赋值的方式创建字符串对象, 内容就是abc
        String s4 = "abc";
        System.out.println("s4:" + s4);


    }
}

String对象特点

  1. 通过new创建的字符串对象,每一次new都会申请一个内容空间, 虽然内容相同, 但是地址值不同
char[] chs = {'a', 'b', 'c'};  // 字符用单引号, 字符串用双引号
String s1 = new String(chs);
String s2 = new String(chs);

每一次new都会有一个新的地址, 只不过s1和s2参考的字符串内容是相同的.

  1. ""方式给出的字符串, 只要字符串序列相同(顺序和大小), 无论在程序代码中出现几次, jvm都只会建立一个string对象
String s3 = "abc";
String s4 = "abc";

第一行, JVM会创建一个String对象放在字符串池中, 第二行, s4直接参考字符串池中的String对象, 本质上是同一个对象.

image-20200928144047603

String的比较

使用 == 作比较

  • 基本类型: 比较的是数据值是否相同
  • 引用类型: 比较的是地址值是否相同

字符串是对象, 他比较内容是否相同, 是通过一个方法来实现的, 这个方法叫: equals()

  • public boolean equal(Object anObject): 将此字符串与指定对象进行比较, 由于我们比较的是字符串对象, 所以参数直接传递一个字符串.
package string;

public class StringEquals {
    public static void main(String[] args) {
        // 构造方式获得字符串
        char[] chs = {'a', 'b', 'c'};
        String s1 = new String(chs);
        String s2 = new String(chs);

        // 直接赋值获得字符串
        String s3 = "abc";
        String s4 = "abc";
        
        // 比较字符串对象地址是否相同
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s3 == s4);
        System.out.println("----------");

        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));
        System.out.println(s3.equals(s4));
    }
}

/*
false
false
true
----------
true
true
true
*/

案例

遍历字符串

输入一段字符串,使用程序在控制台遍历该字符串

思路:

  1. 录入一段字符串, 使用Scanner

  2. 遍历字符串, 首先要能获取到字符串中的每一个字符

    1. public char charAt(int index): 返回指定索引出的char值
  3. 遍历字符串, 其次要能够获取到字符串的长度

    1. public int length(): 返回字符串的长度
  4. 遍历字符串格式

for (int i=0; i<s.length; i++) {
	s.charAt(i); // 就是指定索引处的字符值
}

示例

package string;

import java.util.Scanner;

public class StringTravel {

    public static void main(String[] args) {
        // 录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String line = sc.nextLine();
        // 遍历字符串
        for(int i=0; i< line.length(); i++) {
            System.out.println(line.charAt(i));
        }
    }
}

统计字符类型

package string;
import java.util.Scanner;
public class StringCount {
    public static void main(String[] args) {
        // 输入一个段字符串
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入一段字符:");
        String line = sc.nextLine();


        // 初始化三个统计值
        int capitalCount = 0;
        int lowerCount = 0;
        int numberCount = 0;


        // 遍历字符串,
        for(int i=0; i<line.length(); i++) {
            char ch = line.charAt(i);

            // 判断该字符属于哪一种类型,然后对应类型数值+1;
            if (ch > 'A' && ch<='Z') {
                capitalCount++;
            } else if(ch >= 'a' && ch <='z') {
                lowerCount++;
            } else if(ch >='0' && ch <= '9') {
                numberCount++;
            }
        }
        
        // 输出三种类型的统计值
        System.out.println("大写字母: " + capitalCount + "个");
        System.out.println("小写字母: " + lowerCount + "个");
        System.out.println("数字: " + numberCount + "个");
    }
}

StringBuilder

Stringbuilder概述

StringBuilder是一个可变的字符串类, 可以看做一个容器.可变是指StringBuilder对象中的内容是可变的.

和String的区别:

  • String内容是不可变的
  • StringBuilder内容是可变的

StringBuilder构造方法

方法名 说明
public StringBuilder() 创建一个空白的可变字符串, 不含任何内容
Public StringBuilder(String str) 根据字符串的内容, 来创建可变字符串对象

示例

package string;

/*
    StringBuilder构造方法:
        1.public StringBuilder(): 创建一个空白的可变字符串, 不含任何内容
        2.Public StringBuilder(String str): 根据字符串的内容, 来创建可变字符串对象
 */

public class StringBuilderDemo {
    public static void main(String[] args) {
        // public StringBuilder(): 创建一个空白的可变字符串, 不含任何内容
        StringBuilder sb = new StringBuilder();
        System.out.println("sb:" + sb);
        System.out.println("sb长度:" + sb.length());

        // Public StringBuilder(String str): 根据字符串的内容, 来创建可变字符串对象
        StringBuilder sb2 = new StringBuilder("abc");
        System.out.println("sb2:" + sb2);
        System.out.println("sb长度:" + sb2.length());
    }
}

StringBuilder添加和反转方法

方法名 说明
Public StringBuilder append(任意类型) 添加数据, 并返回对象本身
public StringBuilder reverse() 返回相反的字符序列

示例

package string;

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

        // Public StringBuilder append(任意类型): 添加数据, 并返回对象本身
        // StringBuilder sb2 = sb.append("hello");
        // System.out.println("sb: " + sb);
        // System.out.println("sb2: " + sb2);

        sb.append("hello");
        sb.append("world");
        sb.append("java");

        System.out.println("sb: " + sb);

        // 链式编程
        sb.append("hello").append("world").append("java").append(100);
        System.out.println("sb: " + sb);

        //public StringBuilder reverse(): 返回相反的字符序列
        sb.reverse();
        System.out.println("sb: " + sb);
    }
}

String和StringBuilder相互转换

StringBuilder转String:

  • public String toString(): 通过toString()方法将StringBuilder转换为String

String转StringBuilder:

  • Public StringBuilder(String s): 通过构造方法可以实现String转换为StringBuilder
package string;

public class StringBuilderInterTransform {
    public static void main(String[] args) {
        // StringBuilder转String
        StringBuilder sb = new StringBuilder();
        sb.append("abc");

        // String s = sb  // 错误的转换
        // 通过toString()方法将StringBuilder转换为String
        String s = sb.toString();
        System.out.println("s: " + s);

        // String转StringBuilder
        String s1 = "hello";
        // 通过构造方法可以实现String转换为StringBuilder
        StringBuilder sb1 = new StringBuilder(s1);

        System.out.println("sb1: " + sb1);

    }
}

原文地址:https://www.cnblogs.com/ryxiong-blog/p/13890176.html