JavaSE——常用API(2/3)-String使用时的注意事项、String的应用案例

目录

String使用时的注意事项

阅读程序并解答(1)

阅读程序并解答(2)

String的应用案例

案例1

案例2

 小结 


String使用时的注意事项

  1. String对象的内容不可改变,被称为不可变字符串对象。(每次试图改变字符串对象实际上是新产生了新的字符串对象了,变量每次都是指向了新的字符串对象,之前字符串对象的内容确实是没有改变的,因此说String的对象是不可变的。)
  2. 只要是以 “...” 方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份(这么设计主要是为了节约内存);但通过 new 方式创建字符串对象,每 new 一次都会产生一个新的对象放在堆内存中。

阅读程序并解答(1)

public class Test{
    public static void main(String[] args){
        String s2 = new String("abc");
        String s1 = "abc";

        System.out.println(s1 == s2);
    }
}
  1. 两行代码分别创建了几个对象
  2. 运行结果

第一行代码执行时,new操作原本是让字符存储到了堆内存中,但此时String内部写了"abc",用双引号写出来的字符会被放入字符串常量池中;所以字符串常量池和堆内存中都各自有一个abc字符。

所以第一行代码创建了2个对象。 

第二行代码是用双引号书写的字符,将被放到堆内存中的字符串常量池里,但此时已存在abc,故第二行代码没有创建新的对象。

s2的地址指向堆内存的abc,s1的地址指向堆内存中的字符串常量池的abc,所以两者地址并不相等,所以运行结果为false

阅读程序并解答(2)

public class Test3{
    public static void main(String[] args){
        String s1 = "abc";
        String s2 = "ab";
        String s3 = s2 + "c";
        System.out.println(s1 == s3);
    }
}
public class Test4{
    public static void main(String[] args){
        String s1 = "abc";
        String s2 = "a" + "b" + "c";
        System.out.println(s1 == s2);
    }
}

判断上面两段程序输出的结果分别是什么


第一段程序:s1指向放在字符串常量池里的abc,s3是由s2字符串加上字符串"c"运算之后得到的新字符串,所以s1与s3的地址并不相同,输出结果为false

第二段程序:由于Java存在编译优化机制,程序在编译时,"a" + "b" + "c" 会直接转换成"abc",以提高程序的执行性能,所以检测到字符串常量池中原本存在"abc",不会创建新的字符串,s1与s2指向的地址相同,输出结果为true

String的应用案例

案例1

需求

统正确的登录名和密码是:Administrator/123456,请在控制台开发一个登录界面,接收用户输入的登录名和密码,判断用户是否登录成功,登录成功后展示::“欢迎进入系统!”,即可停止程序

(注意:要求最多给用户三次登录机会)

 步骤:

  1. 开发登录界面,提示用户通过键盘输入登录名和密码。
  2. 设计一个登录方法,对用户的登录名和密码进行正确性认证。
  3. 根据登录方法返回的认证结果,判断用户是否登录成功。
  4. 使用循环控制登录界面最多显示3次。

package StringTest;

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //1.写一个简陋的登陆界面
        for (int i = 0; i < 3; i++) {
            System.out.println("请您输入登陆名称:");
            String loginName = sc.next();
            System.out.println("请您输入登陆密码:");
            String passWord = sc.next();

            //3.写一个判断账号与密码是否一致的方法 login();

            //5.调用方法
            boolean rs = login(loginName,passWord);
            if(rs){
                System.out.println("登陆成功,欢迎进入系统");
                break;
            }else{
                System.out.println("登录名或密码错误,请您重新确认");
            }
        }



    }

    public static boolean login(String loginName,String passWord){
        String okLoginName = "Administrator";
        String okPassWord = "123456";
        //4.判断用户是否登陆成功
        return okLoginName.equals(loginName) && okPassWord.equals(passWord);
    }
}

运行结果:

案例2

需求

(使用String实现)实现随机产生验证码,验证码的每位可能是数字、大写字母、小写字母。

步骤:

  1.  设计一个方法,该方法接收一个整型参数,最终要返回对应位数的随机验证码。
  2. 方法内定义2个字符串变量:1个用来记住生成的验证码,1个用来记住要用到的全部字符。
  3. 定义for循环控制生成多少位随机字符,每次得到一个字符范围内的随机索引,根据索引提取该字符,把该字符交给code变量连接起来,循环结束后,在循环外返回code即可。
  4. 主程序中,调用该方法即可得到随机验证码了。

package StringTest;

import java.util.Random;

public class Test2 {
    public static void main(String[] args) {
        System.out.println(createCode(4));

        System.out.println(createCode(6));
    }

    //1.设计方法返回指定位数的验证码
    public static String createCode(int n){
        //定义两个变量 一个存储最终产生的验证码 另一个存储所有可能用到的全部字符
        String code = "";
        String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        Random r = new Random();

        //3.开始定义循环产生每位随机字符
        for (int i = 0; i < n; i++) {
            int index = r.nextInt(data.length());

            //5.根据索引去全部字符中提取字符
            code += data.charAt(index);
        }
        return code;
    }
}

运行结果:

 小结 

1、字符串的比较使用==比较好吗?为什么?什么时候使用==?

  • 不好,对于字符串对象的比较,==比较的是地址,容易出业务bug
  • 基本数据类型的变量或者值应该使用==比较。

2、开发中比较字符串推荐使用什么方式比较?

  • 使用String提供的equals方法,它只关心字符串内容一样就返回true。
方法名
public boolean equals(Object anObject)
public boolean equalsIgnoreCase(String anotherString)

END


学习自:黑马程序员——JavaSE课程

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

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

相关文章

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网…

一起玩儿平衡车(ESP32)——02 平衡车的组装与接线方法

摘要&#xff1a;本文介绍平衡车的组装与接线方法 前边介绍了所要实现的平衡车的组成&#xff0c;接下来就来把小车组装起来。首先是下层底板的底面要固定两个轮子。这个只要固定孔位没有问题&#xff0c;用螺丝直接将轮子支架固定上去就可以了。固定好后如下图所示&#xff1…

nginx(三)重写功能 防盗链 方向代理 等

return 可以写在location server if 里面 return用于完成对请求的处理&#xff0c;并直接向客户端返回响应状态码&#xff0c;比如:可以指定重定向URL(对于特殊重定向状态码&#xff0c;301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等)&#xff0c;处于此指令后…

怎么压缩成mp4视频?

在数字化时代&#xff0c;视频已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会遇到视频文件太大的问题&#xff0c;不便于传输、存储或分享。那么&#xff0c;如何将视频压缩成MP4格式&#xff0c;以减小文件大小呢&#xff1f;本文将为您介绍几种简…

JavaWeb HTTP 请求头、请求体、响应头、响应体、响应状态码

J2EE&#xff08;Java 2 Platform Enterprise Edition&#xff09;是指“Java 2企业版”&#xff0c;B/S模式开发Web应用就是J2EE最核心的功能。 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 在日常的生活中&#xff0c;经常会使用…

Doccano 修复 spacy.gold 的bug

引言 最初只是想把Doccano标注的数据集转换成BIO(类似conll2003数据集)的标注格式&#xff1b; 按照PR的修改意见实现了修改&#xff0c;但是本人不建议这么做&#xff1b; 应该随着Doccano的升级&#xff0c;Doccano的导出格式发生了变化&#xff0c;而原来的doccano-transfo…

高效备考2024年AMC10:吃透2000-2023年1250道AMC10真题

距离2024年AMC10的比赛只有8个月多一点的时间了&#xff0c;如何备考AMC10美国数学竞赛最有效&#xff1f;参加AMC10竞赛是否一定要参加机构的培训班&#xff1f;吃透历年真题是有效的自学、了解AMC10和备考策略之一。事实上&#xff0c;网络上有很多关于AMC10的学习资源&#…

spark sql 转换字符串数组成多列结构

背景 在平时使用spark sql分析数据时&#xff0c;特别是分析从mysql的表入仓的hive表时&#xff0c;我们会经常和字符串数组的列打交道&#xff0c;而且这种情况下我们一般都需要把一行字符串数组的行数据转成多列的形式&#xff0c;我们看下怎么写这个sql spark sql 转换字符…

ppt中调整某条表格框线的格式

1、先设置好边框线的属性&#xff1a; 2、选择要调整的边框线所在的单元格&#xff08;第二列的右边框加粗&#xff0c;体现分栏的效果&#xff09; 3、设计--边框--中选择要调整的边框线位置&#xff08;假设要调整右框线&#xff09;

【AI Agent系列】【MetaGPT多智能体学习】3. 开发一个简单的多智能体系统,兼看MetaGPT多智能体运行机制

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第一篇笔记。主要记录下多智能体的运行…

二次元壁纸高清1080P

二次元壁纸高清1080P 夸克网盘&#xff1a;https://pan.quark.cn/s/3dd9688f9ae5 百度网盘&#xff1a;https://pan.baidu.com/s/15YQBfMcOJgSEyZI1PjgHeA?pwdq8zy

先进电机技术 —— 通用变频器

一、变频器名称定义 通用变频器&#xff08;Variable Frequency Drive, VFD&#xff09;是一种广泛应用于工业控制领域的电力电子设备&#xff0c;其主要功能是改变供电电源的频率和电压&#xff0c;以达到对交流电动机转速进行精确、连续调节的目的。通用变频器通常具备以下特…

软考 系统分析师系列知识点之需求获取(7)

所属章节&#xff1a; 第11章. 软件需求工程 第2节. 需求获取 需求获取是一个确定和理解不同的项目干系人的需求和约束的过程。需求获取是一件看上去很简单、做起来却很难的事情。需求获取是否科学、准备是否充分&#xff0c;对获取出来的结果影响很大&#xff0c;这是因为大部…

兼容性比较好的浏览器推荐(2023手机浏览器排名)

浏览器在我们日常工作生活占据着重要的位置。浏览器是电脑的必备软件&#xff0c;也是手机端不可缺少的软件之一。如果你想要下载浏览器&#xff0c;却不知道哪个浏览器最好用&#xff0c;那么就看看本篇文章。下文给大家推荐2023年最热门、好用的手机浏览器&#xff0c;排行不…

鬼屋游戏c++

c #include <iostream> #include <string> #include <vector> #include <cstdlib> // 用于随机数生成 #include <ctime> // 用于随机数种子using namespace std;// 定义房间结构体 struct Room {string description;bool hasKey;bool hasClue…

13、输入捕获实验

目录 一、通用定时器输入捕获概述 二、常用寄存器和库函数配置 三、输入捕获实验讲解 一、通用定时器输入捕获概述 STM32输入捕获工作过程&#xff08;通道1为例&#xff09; 一句话总结工作过程&#xff1a; 通过检测TIMx_CHx上的边沿信号&#xff0c;在边沿信号发生跳变…

交换机入门:从基础到进阶的全面学习指南

&#x1f31f;&#x1f30c; 欢迎来到知识与创意的殿堂 — 远见阁小民的世界&#xff01;&#x1f680; &#x1f31f;&#x1f9ed; 在这里&#xff0c;我们一起探索技术的奥秘&#xff0c;一起在知识的海洋中遨游。 &#x1f31f;&#x1f9ed; 在这里&#xff0c;每个错误都…

「媒体宣传」如何写好新闻稿?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 写好新闻稿是媒体宣传的关键环节之一&#xff0c;下面是一些关于如何写好新闻稿的建议&#xff1a; 明确新闻稿的目的和受众&#xff1a;在写新闻稿之前&#xff0c;首先要明确新闻稿的目…

编译链接实战(22)C/C++代码覆盖率统计报告生成

文章目录 GCOV 工具简介gcov 使用lcov相关编译选项 GCOV 工具简介 gcov是一个测试代码覆盖率的工具&#xff0c;它是 gcc 自带的查看代码覆盖率的工具。 与GCC结合使用&#xff0c;可以分析您的程序以帮助创建更高效、运行更快的代码&#xff0c;并发现程序中未经测试的部分。…

决定西弗吉尼亚州地区版图的关键历史事件

决定西弗吉尼亚州地区版图的关键历史事件&#xff1a; 1. 内部分裂与美国内战&#xff1a; - 在1861年美国内战爆发时&#xff0c;弗吉尼亚州作为南方邦联的一员宣布退出美利坚合众国。然而&#xff0c;弗吉尼亚州西部的一些县由于经济结构&#xff08;主要是农业非依赖奴隶制…