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

news2024/9/19 10:45:48

目录

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课程

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

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

相关文章

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

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

每日学习总结20240228

每日总结 20240228 1.获取系统命令执行结果 #include <stdio.h>#define TRUE 1 #define FALSE 0int get_system_cmd_result(const char *command, char *buffer, int bufferLen) {FILE *pipe popen(command, "r");if (pipe NULL) {return FALSE;}while (f…

winform 自定义组件 之踩坑 自定义属性属性列表不展示

问题描述&#xff1a; 使用winform 自定义组件&#xff0c;定义自定义属性性&#xff0c; 使用自定义组件属性页面不展示。 百度N次无解 问了AI 发现犯了个低智错误&#xff1a; 属性末设置为 public; 解决方案一&#xff1a;

NLP Seq2Seq模型

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/mi…

等概率事件算法

1等概率的生成(0-8)范围内的正整数 // Math.random 数据范围[0,1) 且 是 等概率的产生随机数 // 应用&#xff1a; // 1.生成等概率的整数&#xff08;等概率的生成(0-8)范围内的正整数 int value (int) (Math.random() * 9); System.out.println("value "…

YOLOv9有效提点|加入BAM、CloFormer、Reversible Column Networks、Lskblock等几十种注意力机制(二)

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、本文介绍 本文只有代码及注意力模块简介&#xff0c;YOLOv9中的添加教程&#xff1a;可以看这篇文章。 YOLOv9有效提点|加入SE、CBAM、ECA、SimA…

逆变器专题(13)-逆变器LCL滤波器设计

相应仿真原件请移步资源下载 随着新能源的蓬勃发展&#xff0c;逆变器作为光伏储能的核心电力电子器件之一&#xff0c;其也得到了大力发展&#xff1b;传统的L型以及LC型滤波器因其体积较大、滤波效果差等原因已经被逐渐替代&#xff0c; LCL滤波器因其具有较小的体积&#xf…

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

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

通过GitHub探索Python爬虫技术

1.检索爬取内容案例。 2.找到最近更新的。(最新一般都可以直接运行) 3.选择适合自己的项目&#xff0c;目前测试下面画红圈的是可行的。 4.方便大家查看就把代码粘贴出来了。 #图中画圈一代码 import requests import os import rewhile True:music_id input("请输入歌曲…

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

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

Linux 之压缩与解压相关命令的基础用法

目录 1、zip 与 unzip 2、gzip 命令 3、tar 命令 1、zip 与 unzip 在桌面新建一个文件和文件夹用于测试 在 test 目录下有一个 1.txt 文件 我们使用 zip 命令对其压缩 用法&#xff1a; zip 自定义压缩包名 被压缩文件路径位置 zip myon.zip 1.txt 因为我们这里就是在 …

数据库管理-第157期 Oracle Vector DB AI-08(20240301)

数据库管理157期 2024-03-01 数据库管理-第157期 Oracle Vector DB & AI-08&#xff08;20240301&#xff09;1 创建示例向量2 查找最近向量3 基于向量簇组的最近向量查询总结 数据库管理-第157期 Oracle Vector DB & AI-08&#xff08;20240301&#xff09; 作者&…

多层感知器(神经网络)与激活函数

单个神经元&#xff08;二分类&#xff09; 多个神经元&#xff08;多分类&#xff09; 多层感知器 多层感知器&#xff0c;他是一种深度学习模型&#xff0c;通过多层神经元的连接和激活来解决非线性问题。 激活函数 激活函数的种类包括relu&#xff0c;sigmoid和tanh等 …

C 嵌入式系统设计模式 15:基本并发概念

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之一…

GEE数据集——GLC_FCS30D - 全球 30 米土地覆被变化数据集(1985-2022 年)

GLC_FCS30D - 全球 30 米土地覆被变化数据集&#xff08;1985-2022 年&#xff09; 注 本数据集是正在提交的论文的一部分&#xff0c;因此没有引用和 DOI 信息。请在使用本数据集时注意这一点。 GLC_FCS30D 数据集是全球土地覆被监测领域的一项开创性进展&#xff0c;它以 30…

青少年CTF2024 #Round1 wp web

web EasyMD5 MD5碰撞&#xff0c;使用工具fastcoll生成内容不同但md5值相同的两个pdf文件上传即可获得flag&#xff1b; ./fastcoll_v1.0.0.5.exe -p 1.pdf -o 2.pdf 3.pdf # -p指定任意源文件&#xff0c;-o指定生成两个内容不同但md5值相同的目标文件 工具下载&#x…

【MySQL】复合查询(重点)-- 详解

一、基本查询练习回顾 1、查询工资高于 500 或岗位为 MANAGER 的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的 J 2、按照部门号升序而雇员的工资降序排序 3、使用年薪进行降序排序 4、显示工资最高的员工的名字和工作岗位 5、显示工资高于平均工资的员工信息 6、显…

【AIGC】微笑的秘密花园:红玫瑰与少女的美好相遇

在这个迷人的画面中&#xff0c;我们目睹了一个迷人的时刻&#xff0c;女子则拥有一头柔顺亮丽的秀发&#xff0c;明亮的眼睛如同星河般璀璨&#xff0c;优雅而灵动&#xff0c;她的微笑如春日暖阳&#xff0c;温暖而又迷人。站在红玫瑰花瓣的惊人洪水中。 在一片湛蓝无云的晴…

100M服务器能同时容纳多少人访问

100M服务器的并发容纳人数会受到多种因素的影响&#xff0c;这些因素包括单个用户的平均访问流量大小、每个用户的平均访问页面数、并发用户比例、服务器和网络的流量利用率以及服务器自身的处理能力。 点击以下任一云产品链接&#xff0c;跳转后登录&#xff0c;自动享有所有…

精品SSM的选修课管理系统选课签到打卡

《[含文档PPT源码等]精品基于SSM的选修课管理系统设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#xff1a;HTM…