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

news2024/11/18 20:48:32

目录

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

1、常用API

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • Scanner类录入字符串注意事项:
    在这里插入图片描述

  • API帮助文档的使用流程:在这里插入图片描述

2、String类

2.1 String类的特点

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

存在:创建
不存在:复用

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

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类字符串用于比较的方法

在这里插入图片描述

练习:
在这里插入图片描述

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类字符串的遍历

在这里插入图片描述

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:
在这里插入图片描述

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类字符串的截取方法

在这里插入图片描述

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);
    }
}

练习:
在这里插入图片描述

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类字符串的替换方法

在这里插入图片描述

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);
    }
}

练习:
在这里插入图片描述

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类字符串的切割方法

在这里插入图片描述

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介绍

在这里插入图片描述

作用:
在这里插入图片描述
在这里插入图片描述

看下提高的效率:

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:
    在这里插入图片描述
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:
    在这里插入图片描述
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是不安全的(效率高)。为何这样,在后续多线程里介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1707907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文生图模型演进:AE、VAE、VQ-VAE、VQ-GAN、DALL-E 等 8 模型

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

【idea】IDEA 设置自动导入类 / 包等信息(import)

如果大家正在使用一个未曾导入&#xff08;import&#xff09;过的类&#xff0c;或者它的静态方法或者静态字段&#xff0c;IDEA 会给出对应的建议。需要手动操作导入类。 以下设置可以自动导入

磁珠笔记汇总

磁珠笔记汇总 磁珠是和电感很相似的器件。 电感磁珠单位亨(H)欧姆(Ω)是否储能存储能量消耗高频能量应用场景通常用于开关电源吸收高频&#xff0c;EMC保护如何看待损耗使用电感时希望损耗越小越好使用磁珠时是利用其损耗来消耗不需要的高频分量 一、磁珠的工作原理 磁珠与…

第十三届蓝桥杯国赛大学B组填空题(c++)

A.2022 动态规划 AC; #include<iostream> #define int long long using namespace std; int dp[2050][15]; //dp[i][j]:把数字i分解为j个不同的数的方法数 signed main(){dp[0][0]1;for(int i1;i<2022;i){for(int j1;j<10;j){//一种是已经分成j个数,这时只需每一个…

unbantu安装ollama,maxkb

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 背景一、Ollama安装1.安装2.安装后检验3.运行模型4.常用命令 二、安装maxkb1.说明2.docker安装maxkb2.添加模型3.创建应用4.api域名无效 三、总结 背景 最近在学习…

zabbix监控mysql

一、mysql数据库监控的内容有 mysql的吞吐量 mysql的常规操作&#xff08;增删改查&#xff09; QPS&#xff08;Questions Per second:&#xff09;每秒能处理多少次请求数 TPS&#xff08;Transactions Per Second&#xff09;每秒查询处理的事务数 mysql库大小和表大小 监控…

2024年新算法-红嘴蓝鹊优化器(RBMO)优化BP神经网络回归预测

2024年新算法-红嘴蓝鹊优化器(RBMO)优化BP神经网络回归预测 亮点&#xff1a; 输出多个评价指标&#xff1a;R2&#xff0c;RMSE&#xff0c;MSE&#xff0c;MAPE和MAE 满足需求&#xff0c;分开运行和对比的都有对应的主函数&#xff1a;main_BP, main_RBMO, main_BPvsBP_R…

Mysql 单行转多行,把逗号分隔的字段拆分成多行

一、拆分前后的数据 二、执行SQL select substring_index(substring_index(a.gzlx,,,b.help_topic_id1),,,-1) gzlxname, a.gzlx,a.* from dt_task_zxgz_info a join mysql.help_topic b on b.help_topic_id < (length(a.gzlx) - length(replace(a.gzlx,,,))1) 三、解释说…

爷爷看了都会,打工人必备的摸鱼AI神器!免费!

去年&#xff0c;AI技术无疑成为了最为引人注目的焦点&#xff0c;层出不穷的创新应用令人目不暇接。尽管许多人对这股AI热潮的持久性持怀疑态度&#xff0c;但现实却用事实给予了最有力的反驳。AI所展现出的强大生产力&#xff0c;足以令人刮目相看。 而今年以来&#xff0c;…

【实用的 IDEA 配置和操作技巧总结】

前置知识 IDEA的设置快捷键为ctrlalts键&#xff0c;后文介绍IDEA常见的配置就不再赘述这一点了。 基础配置 取消默认打开上次项目 日常开发都会打开不同的项目&#xff0c;初次安装IDEA之后&#xff0c;每次打开IDEA都会开启上一次启动的项目&#xff0c;所以我们需要进入设…

Android studio sdk 虚拟机无法打开运行

1.确认是否在BIOS开启硬件虚拟化支持,选择Enable 2.win8/win10 Hyper-V冲突。控制面板-》程序与功能-》windows功能-》关闭 Hyper-V 3.sdk 路径非默认路径 复制avd C:\Users\Administrator\.android\avd 到 sdk的安装路径下 D:\Android\sdk 。重启软件重新启动即可

Spring:事务

1. 简介 spring对jdbc进行封装&#xff0c;简化对数据库的操作 2. HelloWorld 1. 搭建模块 2.加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>s…

香橙派 AIpro开发板初上手

一、香橙派 AIpro开箱 最近拿到了香橙派 AIpro&#xff08;OrangePi AIpro&#xff09;&#xff0c;下面就是里面的板子和相关的配件。包含主板、散热组件、电源适配器、双C口电源线、32GB SD卡。我手上的这个是8G LPDDR4X运存的版本。 OrangePi AIpro开发板是一款由香橙派与华…

MySQL详细安装、配置过程,多图,详解

本文适合centos7环境下安装mysql&#xff0c;在安装和卸载过程中&#xff0c;都在root用户下完成。文章目录 清理环境获取mysql官方yum源安装mysql yum源安装mysql服务安装报错解决办法验证是否安装完成启动mysql服务登录服务方法一&#xff1a;方法二&#xff1a;方法三&#…

工商银行异地卡兑换泰铢的流程

本文介绍在国内的工商银行&#xff0c;通过现金或银行卡兑换泰国铢等外国货币的纸币或硬币的方法。 最近&#xff0c;准备到泰国旅行&#xff0c;所以需要兑换一些泰铢&#xff0c;防止下飞机到当地后找不到汇率合适、兑换方便的换钱的地方。其中&#xff0c;因为对比发现工商银…

力扣刷题--2965. 找出缺失和重复的数字【简单】

题目描述 给你一个下标从 0 开始的二维整数矩阵 grid&#xff0c;大小为 n * n &#xff0c;其中的值在 [1, n2] 范围内。除了 a 出现 两次&#xff0c;b 缺失 之外&#xff0c;每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从 0 开始、…

3W 1.5KVDC 隔离 宽范围输入,双隔离双输出 DC/DC 电源模块——TPD-3W系列

TPD-3W系列产品是专门针对线路板上分布式电源系统中需要产生一组与输入电源隔离的双隔离双电源的应用场合而设计。该产品适用于&#xff1a;1&#xff09;输入电源的电压变化范围≤2&#xff1a;1 &#xff1b;2&#xff09;输入输出之间要求隔离≤1500VDC&#xff1b;3&#x…

免费无限换脸,火了,图片/视频/直播都行!

最强换脸AI工具Facefusion软件在近期更新到了2.6.0版本&#xff0c;带来了一系列的更新和改进&#xff0c;今天为大家分享一下最新的整合包。 Facefusion2.6.0版本介绍 FaceFusion不仅仅是一款换脸软件&#xff0c;它更是一个多功能的数字人和实时直播助手&#xff0c;真正开启…

去中心化的 S3,CESS 首创去中心化对象存储 DeOSS

Web3 在各个领域的应用和发展已成为讨论的焦点&#xff0c;尽管行业对 Web3 的定义各不相同&#xff0c;但一个普遍的共识是 Web3 赋予了用户对其数据的所有权和自主权。这一转变在我们的生活和工作与数字化越来越深入地融合之际至关重要&#xff0c;这意味着所有人类活动很快将…

【数据结构】直接选择排序详解!

文章目录 1.直接选择排序 1.直接选择排序 &#x1f427; begin 有可能就是 maxi &#xff0c;所以交换的时候&#xff0c;要及时更新 maxi &#x1f34e; 直接选择排序是不稳定的&#xff0c;例如&#xff1a; 9 [9] 5 [5]&#xff0c;排序后&#xff0c;因为直接选择排序是会…