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

目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基坑气膜:建筑工地环保新利器—轻空间

随着城市化进程的加快&#xff0c;建筑行业的飞速发展带来了严重的环境问题&#xff0c;如噪音和粉尘污染&#xff0c;给人们的生活带来诸多不便。为了解决这些问题&#xff0c;建筑行业一直在探索更为环保和高效的施工方式。近年来&#xff0c;基坑气膜技术逐渐崭露头角&#…

【国信华源:以专业服务,协助水利厅抵御强暴雨】

5月18日-19日&#xff0c;广西出现入汛以来最强暴雨天气过程&#xff0c;钦州、防城港、北海、南宁等地出现特大暴雨&#xff0c;多地打破降雨量极值。国信华源技术团队积极行动驻守一线&#xff0c;为打好山洪灾害防御的提前战、主动战提供了技术支撑。 5月17日18时&#xff0…

SOAR-Top 10安全剧本最佳实践-百度网盘下载

概述: SOAR&#xff08;Security Orchestration,Automation and Response安全编排自动化响应&#xff09;&#xff0c;Gartner 对 SOAR 的最新描述性定义&#xff08;摘自 Gartner 报告《Hype Cycle on Threat-Facing Technologies, 2018》) 是&#xff1a;SOAR 是一系列技术的…

基于SpringBoot+Vue在线动漫信息平台设计和实现(源码+LW+部署讲解)

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; &#x1f339;推荐一个人…

使用nexus搭建的nodejs私库,定期清理无用的npm组件,彻底释放磁盘空间

一、背景 昨天我们整理了一篇关于docker私库&#xff0c;如何定期清理以释放磁盘空间的文章。 虽然也提及了npm前端应用的组件该如何定期清理的&#xff0c;本文是对它作一个补充说明。 前文也看到了&#xff0c;npm组件占用的blob空间为180多GB&#xff0c;急需清理。 二、…

K8s证书过期处理

问题描述 本地有一个1master2worker的k8s集群&#xff0c;今天启动VMware虚拟机之后发现api-server没有起来&#xff0c;docker一直退出&#xff0c;这个集群是使用kubeadm安装的。 于是kubectl logs查看了日志&#xff0c;发现证书过期了 解决方案&#xff1a; 查看证书 #…

vue3 部署后修改配置文件

前端项目部署之后&#xff0c;运维可以自行修改配置文件里的接口IP&#xff0c;达到无需再次打包就可以使用的效果 vue2如何修改请看vue 部署后修改配置文件&#xff08;接口IP&#xff09;_vue部署后修改配置文件-CSDN博客 使用前提&#xff1a; vite搭建的vue3项目 使用setu…

IND-ID-CPA 和 IND-ANON-ID-CPA Game

Src: https://eprint.iacr.org/2017/967.pdf

WGCLOUD部署好后,怎么登录WGCLOUD界面

WGCLOUD的server启动完成后&#xff0c;我们在浏览器里输入URL&#xff0c;如下 http://[server主机IP]:9999 注意默认端口就是9999&#xff0c;如果修改过&#xff0c;那么把端口改成自己的实际端口 这样就可以看到登录页面了&#xff0c;默认账号密码是&#xff1a;admin/…

2951. 找出峰值

找出数组中的峰值 给你一个下标从 0 开始的数组 mountain 。你的任务是找出数组 mountain 中的所有 峰值。 以数组形式返回给定数组中 峰值 的下标&#xff0c;顺序不限 。 注意 峰值 是指一个严格大于其相邻元素的元素。数组的第一个和最后一个元素 不 是峰值。 示例 1 …

VSCODE常用插件记录

重点提名&#xff1a; back & ForthBookmarksC/ChighlightSSH FS //SSH插件

《精通Stable Diffusion AI绘画:基础技巧、实战案例与海量资源一站式学习》

随着人工智能技术的迅猛发展&#xff0c;AI绘画已经成为了一个炙手可热的话题。特别是在设计、艺术和创意领域&#xff0c;AI绘画工具的出现无疑为创作者们带来了更多的可能性和便利。《Stable Diffusion AI绘画从提示词到模型出图》这本书&#xff0c;就是一本深入解析Stable …

【IDEA】Redis可视化神器

在开发过程中&#xff0c;为了方便地管理 Redis 数据库&#xff0c;我们可能会使用一些数据库可视化插件。这些插件通常可以帮助你在 IDE 中直观地查看和管理 Redis 数据库&#xff0c;包括查看键值对、执行命令、监视数据库活动等。 IDEA作为IDE界的Jenkins&#xff0c;本身自…

SAP 根据报错消息号快速定位问题

通常用户在业务的操作过程中&#xff0c;经常会遇到报错信息&#xff0c;有些报错是系统控制抛出的信息&#xff0c;但是有些报错的信息是根据不同地点业务场景对填写的数据进行判断校验&#xff0c;然后给出的报错信息&#xff0c;正常情况报错信息一般是有文本&#xff0c;或…

PyTorch 错误 RuntimeError: CUDA error: device-side assert triggered

训练数据的时候出现 RuntimeError:CUDA error:device-side assert triggeredCUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.For debugging consider passing CUDA_LAUNCH_BLOCKING1.Compile with …

2024年统计、数据分析与大数据技术国际会议(SDBT 2024)

2024年统计、数据分析与大数据技术国际会议&#xff08;SDBT 2024&#xff09; 2024 International Conference on Statistics, Data Analysis, and Big Data Technology 【重要信息】 大会地点&#xff1a;广州 大会时间&#xff1a;2024年7月22日 大会官网&#xff1a;http…

【EI会议】2024年雷达、电子与通信工程国际会议(ICREC 2024)

2024年雷达、电子与通信工程国际会议 2024 International Conference on Radar, Electronics and Communication Engineering 【1】会议简介 2024年雷达、电子与通信工程国际会议即将在深圳隆重召开。深圳&#xff0c;这座充满活力的现代化都市&#xff0c;以其卓越的科技创新…

【Git】使用tortoiseGit

参考视频 【TortoiseGit常用的基本使用教程】 https://www.bilibili.com/video/BV193411h7FP/?share_sourcecopy_web&vd_source77e36f24add8dc77c362748ffb980148 拉取远程代码 创建分支 拉取远端dev分支的代码&#xff1a; 先创建本地的dev分支&#xff1a; 拉取&…

IC开发——Ubuntu安装VCS2018

1. 简介 VCS是一种常用的Verilog仿真和综合工具&#xff0c;由Synopsys公司开发。它提供了一个完整的设计验证环境&#xff0c;用于验证硬件设计的正确性和性能。以下是VCS工具的一些主要特点和功能&#xff1a; 仿真功能&#xff1a;VCS支持基于事件驱动的数字电路级仿真&am…

浙江大学数据结构MOOC-课后习题-第七讲-图4 哈利·波特的考试

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 代码展示 照着教程视频来的&#xff0c;没啥好说的捏 #include <cstdlib> #include <iostream>#define MAXSIZE 100 #define IFINITY 65535 typedef int vertex; typedef int weightType;/…