[笔记]Java12 - String类的概述和使用

第十二章 String类的概述和使用


12.1 String类的概念(重点)

  • java.lang.String类用于描述字符串,Java程序中所有的字符串字面值都可以使用该类的对象加以描述,如:“abc”。
  • 该类由final关键字修饰,表示该类不能被继承。
  • 从jdk1.9开始该类的底层不使用char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一些空间。
  • 该类描述的字符串内容是个常量不可更改,因此可以被共享使用。
    如:
    String str1 = “abc”; - 其中"abc"这个字符串是个常量不可改变。
    str1 = “123”; - 将“123”字符串的地址赋值给变量str1。
    - 改变str1的指向并没有改变指向的内容

在这里插入图片描述

12.2 常量池的概念(原理)

由于String类型描述的字符串内容是常量不可改变,因此Java虚拟机将首次出现的字符串放入常量池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对象,从而提高了性能。

package com.lagou.task12;

public class StringPoolTest {
   

    public static void main(String[] args) {
   

        // 1.验证一下常量池的存在
        // 到目前为止,只有String这个特殊类除了new的方式外还可以直接字符串赋值(包装类除外)
        String str1 = "abc";
        String str2 = "abc";
        System.out.println(str1 == str2); // 比较地址  true

    }
}
package com.lagou.task12;

public class StringExamTest {
   

    public static void main(String[] args) {
   

        // 1.请问下面的代码会创建几个对象?分别存放在什么地方?
        //String str1 = "hello";  // 1个对象  存放在常量池中
        //String str1 = new String("helo"); // 2个对象  1个在常量池中,1个在堆区

        // 2.常量池和堆区对象的比较
        String str1 = "hello";  // 常量池
        String str2 = "hello";  // 常量池
        String str3 = new String("hello"); // 堆区
        String str4 = new String("hello"); // 堆区

        System.out.println(str1 == str2);       // 比较地址  true
        System.out.println(str1.equals(str2));  // 比较内容  true
        System.out.println(str3 == str4);       // 比较地址  false
        System.out.println(str3.equals(str4));  // 比较内容  true
        System.out.println(str2 == str4);       // 比较地址  false
        System.out.println(str2.equals(str4));  // 比较内容 true

        System.out.println("------------------------------------------------------------");
        // 3.常量有优化机制,变量没有
        String str5 = "abcd";
        String str6 = "ab" + "cd";  // 常量优化机制  "abcd"
        System.out.println(str5 == str6); // 比较地址  true

        String str7 = "ab";
        String str8 = str7 + "cd"; // 没有常量优化
        System.out.println(str5 == str8); // 比较地址 false


    }
}

12.3 常用的构造方法(练熟、记住)

方法声明 功能介绍
String() 使用无参方式构造对象得到空字符序列
String(byte[] bytes, int offset, intlength) 使用bytes数组中下标从offset位置开始的length个字节来构造对象
String(byte[] bytes) 使用bytes数组中的所有内容构造对象
String(char[] value, int offset, intcount) 使用value数组中下标从offset位置开始的count个字符来构造对象
String(char[] value) 使用value数组中的所有内容构造对象
String(String original) 根据参数指定的字符串内容来构造对象,新创建对象为参数对象的副本

12.4 常用的成员方法(练熟、记住)

方法声明 功能介绍
String toString() 返回字符串本身
byte[] getBytes() 将当前字符串内容转换为byte数组并返回
char[] toCharArray() 用于将当前字符串内容转换为char数组并返回
方法声明 功能介绍
char charAt(int index) 方法charAt用于返回字符串指定位置的字符。
int length() 返回字符串字符序列的长度
boolean isEmpty() 判断字符串是否为空

案例题目
判断字符串“上海自来水来自海上”是否为回文并打印,所谓回文是指一个字符序列无论从左向右读还是从右向左读都是相同的句子。

package com.lagou.task12;

public class StringJudgeTest {
   

    public static void main(String[] args) {
   

        // 1.创建字符串对象并打印
        String str1 = new String("上海自来水来自海上");
        System.out.println("str1 = " + str1); // 上海自来水来自海上   9
        // 2.判断该字符串内容是否为回文并打印
        for (int i = 0; i < str1.length()/2; i++) {
   
            if (str1.charAt(i) != str1.charAt(str1.length()-i-1)) {
     // 0和8   1和7  2和6  3和5
                System.out.println(str1 + "不是回文!");
                return;  // 仅仅是用于实现方法的结束
            }
        }
        System.out.println(str1 + "是回文!");
    }
}

字符串中字符查找的区别

方法声明 功能介绍
int compareTo(String anotherString) 用于比较调用对象和参数对象的大小关系
int compareToIgnoreCase(String str) 不考虑大小写,也就是’a’和’A’是相等的关系

案例题目
编程实现字符串之间大小的比较并打印。

方法声明 功能介绍
String concat(String str) 用于实现字符串的拼接
boolean contains(CharSequence s) 用于判断当前字符串是否包含参数指定的内容
String toLowerCase() 返回字符串的小写形式
String toUpperCase() 返回字符串的大写形式
String trim() 返回去掉前导和后继空白的字符串
boolean startsWith(String prefix) 判断字符串是否以参数字符串开头
boolean startsWith(String prefix, int toffset) 从指定位置开始是否以参数字符串开头
boolean endsWith(String suffix) 判断字符串是否以参数字符串结尾

案例题目
编程实现上述方法的使用。

方法声明 功能介绍
boolean equals(Object anObject) 用于比较字符串内容是否相等并返回
int hashCode() 获取调用对象的哈希码值
boolean equalsIgnoreCase(StringanotherString) 用于比较字符串内容是否相等并返回,不考虑大小写,如:'A’和’a’是相等

案例题目
提示用户从键盘输入用户名和密码信息,若输入”admin”和”123456”则提示“登录成功,欢迎使用”,否则提示“用户名或密码错误,您还有n次机会”,若用户输入三次后依然错误则提示“账户已冻结,请联系客服人员!”

package com.lagou.task12;

import java.util.Scanner;

public class StringEqualsTest {
   

    public static void main(String[] args) {
   

        Scanner sc = new Scanner(System.in);
        for (int i = 3; i > 0; i--) {
   
            // 1.提示用户从键盘输入用户名和密码信息并使用变量记录
            System.out.println("请输入您的用户名和密码信息:");
            String userName = sc.next();
            String password = sc.next();

            // 2.判断用户名和密码是否为"admin"和"123456"并给出提示
            //if ("admin".equals(userName) && "123456".equals(password)) {
   
            if ("admin".equalsIgnoreCase(userName) && "123456".equals(password)) {
    // 防止空指针异常
                System.out.println("登录成功,欢迎使用!");
                break;
            } //else {
   
            if (1 == i) {
   
                System.out.println("账户已冻结,请联系客服人员!");
            } else {
   
                System.out.println("用户名或密码错误,您还有" + (i - 1) + "次机会!");
            }
            //}
        }
        // 关闭扫描器
        sc.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Shiroki 1.0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值