【基础篇-Day8:JAVA字符串的学习】

目录

  • 1、常用API
  • 2、String类
    • [2.1 String类的特点](#2.1 String类的特点)
    • [2.2 String类的常见构造方法](#2.2 String类的常见构造方法)
    • [2.3 String类的常见面试题:](#2.3 String类的常见面试题:)
      • [2.3.1 面试题一:](#2.3.1 面试题一:)
      • [2.3.2 面试题二:](#2.3.2 面试题二:)
      • [2.3.3 面试题三:](#2.3.3 面试题三:)
      • [2.3.4 面试题四:](#2.3.4 面试题四:)
    • [2.4 String类字符串用于比较的方法](#2.4 String类字符串用于比较的方法)
    • [2.5 String类字符串的遍历](#2.5 String类字符串的遍历)
    • [2.6 String类字符串的截取方法](#2.6 String类字符串的截取方法)
    • [2.7 String类字符串的替换方法](#2.7 String类字符串的替换方法)
    • [2.8 String类字符串的切割方法](#2.8 String类字符串的切割方法)
    • [2.9 String类字符串方法的总结](#2.9 String类字符串方法的总结)
  • 3、StringBuilder类
    • [3.1 StringBuilder介绍](#3.1 StringBuilder介绍)
    • [3.2 StringBuilder的构造方法](#3.2 StringBuilder的构造方法)
    • [3.3 StringBuilder的常用方法](#3.3 StringBuilder的常用方法)
    • [3.4 StringBuffer与StringBuilder的区别:](#3.4 StringBuffer与StringBuilder的区别:)

1、常用API



  • Scanner类录入字符串注意事项:

  • API帮助文档的使用流程:

2、String类

2.1 String类的特点

  • Java程序中,所有双引号字符串,都是String的实例,即对象。如下是两种创建字符串对象的方法:
java 复制代码
String s = "";
String s1 = new String();
  • 字符串一旦被创建,则不可被更改,即字符串的内容不可更改,如果要修改,则只能使用新的对象做替换。如下:
java 复制代码
String s = "abc";
s = "def";
  • String字符串虽然不可改变,但可以被共享。为了解释清除什么是共享,因此这里要涉及一个概念,即字符串常量池:当我们使用双引号创建字符串对象时,会先去字符串常量池中检查是否存在改数据:

存在:创建

不存在:复用

看如下代码就是共享的例子:

java 复制代码
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);

输出:
true

上述代码的内存图解释:

注:==比较地址,而equals()比较内容

总结:

2.2 String类的常见构造方法

注意事项:

1、打印对象名时,会输出对象在堆内存开辟的内存地址,但是打印字符串对象时,输出的是内容。

2、这三个构造方法创建对象,都没有直接使用双引号来的方便。

2.3 String类的常见面试题:

2.3.1 面试题一:

  • System.out.pringln(s1 == s2)输出true还是false,为什么?

答:两个字符串都是用双引号创建对象时,其实都是引用了堆内存中字符串常量的内存地址,因此使用==号作比较时,两个指向同一个地址,自然输出true。下面是内存图解释:

2.3.2 面试题二:

  • 直接使用双引号创建字符串,与使用构造方法创建字符串有什么区别?

答:使用双引号时,会在堆内存的字符串常量池中开辟一个空间,而使用构造方法new一个对象时,会在堆内存的普通区局开辟一个空间,因此当这两种创建内容相同,但是用==做比较时,会输出false。看下面的内存图解释;

2.3.3 面试题三:

  • 字符串做+拼接时的原理。

答:使用+做拼接时,首先会在堆内存开辟StringBuilder对象的内存地址,然后再调用此类的toString方法转换成字符串,转换后的字符串也会在堆内存中开辟一个空间,最后再将转换后字符串的地址给栈内存中引用的变量,因此拼接后的字符串和使用双引号创建的字符串内容虽然相同,但是指向的地址是不同的,使用==自然会返回false。下面是内存图解释:

2.3.4 面试题四:

  • 字符串常量拼接原理:在编译时就会做优化处理,所以编译成字节码文件后,就是拼接到一起的样子,例如下图:

输出为true,原因是s2编译成字节码文件后为"abc",和s1是一样的。

2.4 String类字符串用于比较的方法

练习:

java 复制代码
package com.itheima.string;

import com.itheima.string.vo.User;

import java.util.Scanner;

public class Login {
    public static void main(String[] args) {
        login();
    }

    public static void login(){
        // 1、从数据库查找:正确的用户名和密码
        User user = new User("马四", "1qaz");

        // 2、和用户输入做比较
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名:");
            String username = sc.next();
            System.out.println("请输入密码:");
            String password = sc.next();
            if (username.equals(user.getName()) && password.equals(user.getPassword())){
                System.out.println("登录成功!");
                break;
            }
            System.out.println("你输入不正确,还剩余" + (2- i)  + "次机会");
        }
    }
}

注:如果字符串的比较要忽略大小写,则使用equalsIgnoreCase方法即可。

2.5 String类字符串的遍历

java 复制代码
package com.itheima.string;

public class StringMethodDemo {
    public static void main(String[] args) {
//        print1();
        print2();
    }

    /*
    字符串的第一种遍历方式
     */
    private static void print1() {
        String s = "itheima";
        char[] charArray = s.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            System.out.println(charArray[i]);
        }
    }

    /*
    字符串的第二种遍历方式
     */
    private static void print2() {
        String s = "itheima";
        for (int i = 0; i < s.length(); i++) {
            System.out.println(s.charAt(i));
        }
    }
}

注:第一种方法遍历效率高!!!
练习1:

java 复制代码
package com.itheima.string;
import java.util.Scanner;

public class StringTestDemo {
    public static void main(String[] args) {
        countCharNumber();
    }

    public static void countCharNumber(){
        int numCount = 0;//数字数量
        int lowerCount = 0;//小写数量
        int upperCount = 0;//大写数量
        Scanner sc = new Scanner(System.in);
        System.out.println("请录入一个字符串:");
        String s = sc.next();
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] >= '0' && chars[i] <= '9'){
                numCount++;
            }else if (chars[i] >= 'a' && chars[i] <= 'z'){
                lowerCount++;
            } else if (chars[i] >= 'A' && chars[i] <= 'Z') {
                upperCount++;
            }
        }
        System.out.println("数字数量" + numCount);
        System.out.println("小写数量" + lowerCount);
        System.out.println("大写数量" + upperCount);
    }
}

2.6 String类字符串的截取方法

java 复制代码
package com.itheima.string;

public class StringTestDemo2 {
    public static void main(String[] args) {
//        substring1();
        stustring2();
    }

    private static void substring1() {
        String s = "itheima";
        String substring = s.substring(3);//包含开始索引,输出:ith
        System.out.println(substring);
    }

    private static void stustring2() {
        String s = "itheima";
        String substring = s.substring(1, 5);//包含开始索引,不包含结束索引输出:thei
        System.out.println(substring);
    }
}

练习:

java 复制代码
package com.itheima.string;

import java.util.Scanner;

public class StringTestDemo3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个手机号:");
        String phoneNumber = scanner.next();
        String mockPhoneNumber = phoneNumber.substring(0, 4) + "****" + phoneNumber.substring(8, 11);
        System.out.println("最终效果为:" + mockPhoneNumber);
    }
}

2.7 String类字符串的替换方法

java 复制代码
package com.itheima.string;

public class StringTestDemo {
    public static void main(String[] args) {
        String s = "itheima";
        String replace = s.replace("heima", "baima");//旧值,新值
        System.out.println(replace);
    }
}

练习:

java 复制代码
package com.itheima.string;
import java.util.Scanner;

public class StringTestDemo4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.next();
        String replace = s.toUpperCase().replace("TMD", "***");//全部转大写
        System.out.println(replace);
    }
}

2.8 String类字符串的切割方法

java 复制代码
package com.itheima.string;

public class StringTestDemo4 {
    public static void main(String[] args) {
        String s = "abc,def,ghj";
        String[] split = s.split(",");
        for (int i = 0; i < split.length; i++) {
            System.out.println(split[i]);
        }

        String ss = "abc.def.ghj";
        String[] split1 = ss.split("\\.");//因为split参数是正则表达式匹配,而.代表任意数,所以需要用转义符\做转义即可
        for (int i = 0; i < split1.length; i++) {
            System.out.println(split1[i]);
        }
    }
}

2.9 String类字符串方法的总结

3、StringBuilder类

3.1 StringBuilder介绍

作用:

看下提高的效率:

java 复制代码
package com.itheima.stringBuilder;

public class StringBuilderDemo1 {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String s = "";
        for (int i = 0; i < 11111; i++) {
            s += i;
        }
        System.out.println(s);
        long end = System.currentTimeMillis();

        long start1 = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 11111; i++) {
            sb.append(i);
        }
        System.out.println(sb);
        long end1 = System.currentTimeMillis();
        System.out.println(end - start);//502
        System.out.println(end1 - start1);//3
    }
}

可以发现,使用了StringBuilder类,运行时间减少了几个数量级。

3.2 StringBuilder的构造方法

3.3 StringBuilder的常用方法

  • 案例1:
java 复制代码
package com.itheima.stringBuilder;

public class StringBuilderDemo2 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("156651");
        String s1 = sb.toString();
        String s2 = sb.reverse().toString();
        if (s1.equals(s2)){
            System.out.println("是回文");
        }else {
            System.out.println("不是回文");
        }
    }
}

String和StringBuilder相互的转换:

  • 案例2:
java 复制代码
package com.itheima.stringBuilder;

public class StringBuilderDemo3 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        String string = getString(arr);
        System.out.println(string);
    }

    public static String getString(int[] arr){
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i]);
            if (i != arr.length - 1){
                sb.append(",");
            }
        }
        sb.append("]");

        return sb.toString();
    }
}

3.4 StringBuffer与StringBuilder的区别:

StringBuffer 与 StringBuilder使用上没有区别,因此学会了使用StringBuilder,则StringBuffer就会使用。

但是不同点在于,当多线程时,StringBuffer是安全的(效率低),而StringBuilder是不安全的(效率高)。为何这样,在后续多线程里介绍。

相关推荐
林的快手10 分钟前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
FeboReigns12 分钟前
C++简明教程(10)(初识类)
c语言·开发语言·c++
学前端的小朱13 分钟前
处理字体图标、js、html及其他资源
开发语言·javascript·webpack·html·打包工具
向阳121841 分钟前
mybatis 缓存
java·缓存·mybatis
上等猿1 小时前
函数式编程&Lambda表达式
java
摇光931 小时前
js高阶-async与事件循环
开发语言·javascript·事件循环·宏任务·微任务
沐泽Mu1 小时前
嵌入式学习-QT-Day09
开发语言·qt·学习
蓝染-惣右介1 小时前
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
java·设计模式
小猿_001 小时前
C语言实现顺序表详解
c语言·开发语言
余~~185381628002 小时前
NFC 碰一碰发视频源码搭建技术详解,支持OEM
开发语言·人工智能·python·音视频