Java基础String类——详解

String概述

  • java.lang.String类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串 
  • Java程序中的所有字符串文字(例如“abc”)都为此类的对象
String name1 = "石原里美";    //举例子
String name2 = "工藤静香";

String类特点

  • String常被称为不可变字符串类型,它的对象在创建后不能被更改
  • String name = "石原里美";
    name += "的微笑";
    System.out.println(name);
    
    //输出结果:石原里美的微笑

    此时我们会产生疑问刚才不是说对象在创建以后不可以被更改吗?那为什么最后的结果是被更改了呢?

事实上呢,对象在创建以后确实是没有被更改的,首先我们应该清楚的是“name中储存的是地址”,在起初创建的时候name对象的时候,name中储存的是“石原里美”的地址,在代码运行第二步的时候,堆内存中出现了“的微笑”,原来的两个对象并没有改变,而是实现拼接形成了第三个字符串“石原里美的微笑”,此时name所指向的地址发生了改变,原来创建的对象仍然存在,只是name不再指向原来的地址,而是指向新的地址,所以在输出的时候,电脑会通过name来获取其指向的数据。

通俗易懂来讲就是:”String变量每次的修改其实都是产生并指向新的字符串变量,而原来的字符串对象都是没有改变的,所以称为不可变字符“。

如果还有些不理解,可以通过以下两张图来加深理解:

在创建过name对象以后,name储存着“石原里美”的地址:

在执行第二步代码的时候,堆内存会出现”的微笑“,这两个对象并不会发生改变,而是二者实现拼接形成”石原里美的微笑“,地址指向改变为黑色的箭头,name指向”石原里美的微笑“。

 

 String类创建对象方式

  •  方式一:直接用” “定义
String name = "石原里美";
  • 方式二:通过String类的构造器创建对象
    构造器 说明
    public String() 创建一个空白字符串对象,不含有任何内容
    public String (String original) 根据传入的字符串内容,来创建字符串对象
    public String (char [ ]  chs) 根据字符数组的内容,来创建字符串对象
    public String (byte [ ]  chs) 根据字节数组的内容,来创建字符串对象
    //1、创建一个空白字符串,不含任何内容
    String name = new String();
    System.out.println(name);
    //输出结果:什么都没有
    
    //2、根据传入字符串内容,创建字符串对象
    String name = new String("石原里美");
    System.out.println(name);
    //输出结果:石原里美
    
    //3、根据字符数组的内容,创建字符串对象
    char [] chars = {'石','原','里','美'};
    String name = new String(chars);
    //输出结果:石原里美
    
    //4、根据字节数组的内容,创建字符串对象
    byte[] bytes ={65,66,67,97,98,99};
    String name = new String(bytes);
    //输出结果:ABCabc

两种方式有什么区别呢? 

  • 以" ”方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份
  • 通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中
    String name1 = '石原里美';
    String name2 = '石原里美';
    System.out.println(name1 == name2);//true,二者地址相同
    
    char name = {'石','原','里','美'};
    String name3 = new String(name);
    String name4 = new String(name);
    System.out.println(name3 == name4);//false,二者地址不同

 String类常用API

字符串内容比较——equals( )

现在有一个问题需要我们去解决,这个问题的要求是“验证账号和密码的正确与否”,这是一个在其他语言中很常见的问题,那么我们首先能够想到的思路是否和下面的一样呢?

通过判断账号和密码是否能够同时和用户输入的值相同来判断!

public static void main(String[] args) {
        String name = "石原里美";
        String password = "123456";
        Scanner sc = new Scanner(System.in);
        System.out.println("账号:");
        String name1 = sc.next();
        System.out.println("密码:");
        String pwd = sc.next();
        if (name==name1&& password==pwd){
            System.out.println("登录成功!");
        }else {
            System.out.println("账号或密码错误!");
        }
    }

目前思路的确是没有问题的,然而输出结果却并不理想

 那么这是出自什么原因呢?其真正原因是在Java中“==”比较的并不是字符串中的内容,而是字符串的地址,因此并不适用于此问题。

不过不需要着急,问题仍然是可以解决的,String类提供的“equals”比较再合适不过了,其只关心内容是否一致。

方法名 说明
public boolean equals (object anobject) 将此字符串与指定对象进行比较,只关心字符内容是否一致
public boolean equalsIgnoreCase (String anotherString) 将此字符串与指定对象进行比较,忽略大小写比较字符,只关心字符内容是否一致
//1、此时输入正确时便不会提示错误!
if (name.equals(name1)&& password.equals(pwd)){
            System.out.println("登录成功!");
        }else {
            System.out.println("账号或密码错误!");
        }

//2、此种方法多用于验证码的比较
String code1 = "sylm520";
String code2 = "SyLm520";
System.out.println(code1.equals(code2));//false
System.out.println(code1.equalsIgnorecase(code2));//true

获取字符串长度——length( )

String name = "石原里美";
System.out.println(name.length());
//输出结果:4

获取某索引位置处的字符——charAT(int index) 

字符串的索引从0开始,依次累加1  

char a = name.charAT(3);
System.out.println(a);
//输出结果:美

 字符串转为字符数组——toCharArray()

char [] array = name.toCharArray();
System.out.println(array);
//输出结果:石原里美

 截取字符串——substring(int begin, int end)

String name = "石原里美的微笑";
System.out.println(name.substring(2,7));//左闭右开
//输出结果:里美的微笑

 当前索引截取到末尾——substring(int begin) 

String name = "石原里美的微笑";
System.out.println(name.substring(3));
//输出结果:美的微笑

 敏感词替换——replace(CharSequence target,CharSequence replacement)

括号内,第一个参数是需要替换的内容,第二个参数是替换过后的内容

String name = "石原里美很漂亮,没有人比石原里美更漂亮了!";
        String array = name.replace("石原里美","工藤静香");
        System.out.println(array);
//输出结果:
//工藤静香很漂亮,没有人比工藤静香更漂亮了!

 判断是否含关键字——contains(CharSequence s)

括号中的参数是需要判断的关键字,其返回值是Boolean型

String name = "石原里美很漂亮!";
System.out.println(name.contains("石原里美"));//true
System.out.println(name.contains("工藤静香"));//false

 判断是否是起始值——startsWitch(CharSequence s)

括号中的参数是需要判断的字符串,其返回值是Boolean型

String name = "石原里美很漂亮!";
System.out.println(name.startsWith("石原里美"));//true
System.out.println(name.startsWith("工藤静香"));//false

根据某个内容切割字符串返回字符串数组——split(String s)

括号中的参数是决定字符串以什么为切割点进行切割

String name = "石原里美,工藤静香,中岛美嘉";
String []array = name.split(",");
System.out.println(array[0]);
//输出结果:石原里美 
方法名 说明
public int length() 返回此字符串的长度
public char charAt(int index) 获取某个索引位置处的字符
public char[ ] toCharArray() 将当前字符串转换成字符数组返回
public String substring(int beginIndex,int endIndex) 根据开始和结束索引进行截取,得到新的字符串(左闭右开)
public String substring(int beginIndex) 从传入的索引处截取,截取到末尾,得到新的字符串
public String replace(CharSequence target,
CharSequence replacement)
使用新值,将字符串中的旧值替换,得到新的字符串
public String[ ] split(String regex) 根据传入的规则切割字符串,得到字符串数组返回

创作不易,给个三连吧!

猜你喜欢

转载自blog.csdn.net/weixin_50635856/article/details/124102972
今日推荐