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

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

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. 根据登录方法返回的认证结果,判断用户是否登录成功。
  1. 使用循环控制登录界面最多显示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



目录
相关文章
|
28天前
|
缓存 监控 API
淘宝 API 接口使用的技术要点与注意事项
在数字化商业环境中,淘宝API为开发者提供了强大的工具,用于与淘宝平台交互,获取商品信息及处理交易等。本文总结了正确使用API的关键技术要点:注册认证、理解接口文档、遵守调用限制、确保参数准确性、保护数据安全、处理异常、性能优化、版本兼容、合规性及日志监控,帮助开发者实现高效、安全的程序开发。
|
4月前
|
Java API
JavaSE——常用API进阶二(6/8)-ZoneId、ZoneDateTime、Instant(常见方法、用法示例)
JavaSE——常用API进阶二(6/8)-ZoneId、ZoneDateTime、Instant(常见方法、用法示例)
39 1
|
2月前
|
API C语言 C++
DLL导出API注意事项
DLL导出API注意事项
37 7
|
2月前
|
监控 数据可视化 搜索推荐
淘宝 API 接口的实际应用案例
淘宝API接口在电商领域扮演着重要角色,支持多种应用场景。一是助力电商数据分析公司获取商品详情,分析市场趋势、竞品及提出产品改进建议。二是支持商品比价网站收集价格信息,帮助消费者高效比价。三是赋能营销工具开发商实现自动化营销,提升客户转化率。四是协助跨境电商平台引进热门商品并进行本地化处理。最后,支持数据可视化工具展示销售趋势,辅助商家决策。
|
2月前
|
存储 程序员 API
八股day05_API、String对象和集合
day05_API、String对象和集合
|
2月前
|
存储 JavaScript 前端开发
探索React状态管理:Redux的严格与功能、MobX的简洁与直观、Context API的原生与易用——详细对比及应用案例分析
【8月更文挑战第31天】在React开发中,状态管理对于构建大型应用至关重要。本文将探讨三种主流状态管理方案:Redux、MobX和Context API。Redux采用单一存储模型,提供预测性状态更新;MobX利用装饰器语法,使状态修改更直观;Context API则允许跨组件状态共享,无需第三方库。每种方案各具特色,适用于不同场景,选择合适的工具能让React应用更加高效有序。
43 0
|
4月前
|
存储 缓存 Java
JavaSE 字符串String及相关API StringBuilder StringJoiner 底层原理 详解
JavaSE 字符串String及相关API StringBuilder StringJoiner 底层原理 详解
37 2
|
4月前
|
Java API 索引
java中String类常用API
java中String类常用API
|
4月前
|
存储 Java API
JavaSE——常用API进阶二(8/8)-Arrays、Comparable、Comparator(Arrays类提供的的常见方法、用法示例)
JavaSE——常用API进阶二(8/8)-Arrays、Comparable、Comparator(Arrays类提供的的常见方法、用法示例)
34 2
|
4月前
|
安全 Java API
JavaSE——常用API进阶二(7/8)-DateTimeFormatter、Period、Duration(常见方法、用法示例)
JavaSE——常用API进阶二(7/8)-DateTimeFormatter、Period、Duration(常见方法、用法示例)
44 2