一、前言(在java中字符串的重要性)
在 Java 编程中,字符串(String
)的重要性不言而喻,它几乎贯穿于所有的应用程序和系统中。以下是 Java 中字符串重要性的几个方面:
1. 数据表示和处理
- 文本数据:字符串是表示文本数据的主要方式。无论是用户输入、文件读取还是网络传输,文本数据通常都以字符串的形式存在。
- 数据格式化:字符串用于格式化输出,如日志记录、用户界面显示等。
2. 用户交互
- 输入输出:用户通过字符串与程序进行交互,输入数据和接收反馈。例如,命令行参数、表单输入、控制台输出等。
- 错误信息:错误和异常信息通常以字符串形式呈现,帮助开发者调试和用户理解问题。
3. 数据存储和传输
- 文件操作:读写文件时,文本内容通常以字符串形式处理。
- 网络通信:在网络传输中,数据包和消息通常以字符串形式编码和解码。
4. 业务逻辑处理
- 数据验证:字符串用于验证用户输入的格式和内容是否符合要求。
- 数据转换:字符串与其他数据类型(如数字、日期)之间的转换是常见的业务需求。
二、String类的基础
1.创建String类的俩种方式:
(1)直接创建,比较常用
java">package 字符串;public class str1 {public static void main(String[] args) {
String s1="hello";
Systrm.out.println(s1);}
}
这个是直接定义,在串池中开辟一块空间来存放s1,然后将“hello”存放到s1中。
(2)通过new方法构造
java">package 字符串;public class str1 {public static void main(String[] args) {String s1=new String();System.out.println("s"+s1+"2");}
}
这个是new一个对象,获得的是一个空的字符串。
1、当然,这个new对象中也可以存放数组类型,并且打印出来。例如
java">package 字符串;public class str1 {public static void main(String[] args) {
char [] arr={'a','b','c'};
String s1=new String(arr);
System.out.println(s1);}}
以上打印的结果是abc。
2、也可以是一个字节数组,根据字节数组的内容在创建一个新的数组。
java">package 字符串;public class str1 {public static void main(String[] args) {byte [] arr={97,98,99};String s1=new String(arr);System.out.println(s1);}}
代码的结果也是abc。这个是先去把97,98,99拿去更ASCII码表对应找到abc。
三、字符串在内存中到底是怎么创建的?
(1)直接创建的
栈:是跟方法有关的,方法运行时进栈,运行完成出栈。
堆:new出来的对象全在堆里面。
方法区:程序在运行时,会先编码成class字节码文件,把这个字节码文件加载到方法区中,临时存储。
字符串池(串池):直接赋值的字符串,才存在这个串池中,如果是通过,new关键字创建的字符串就不在里面。
我们通过上面的一个例子:如果我们同时对s1和s2赋值“abc” ,当代码执行完s1时,会继续执行s2,但是在直接会在串池中搜索有没有abc,如果存在,那就0x0011传给s2。
1.总结:
在使用双引号直接赋值的时候,如果字符串在串池中存在,那就复用,如果不存在就重新创建一个。
(2) new关键字创建的
每一次new都会在堆中创建一个空间 ,但是s1和s2记录的地址值是不一样的。
2.总结:
以后建议使用第一种,比较节省内存,且容易创建。
四、java中字符串的使用(字符串的比较)
1.你真的知道“==”的用法吗?
在java中==的用法是要分情况的:
1.如果是第一种:基本数据类型,那我们只要比较数值即可。
2.如果是第二种:引用数据类型,比较的是地址值。
2.那我不能比较内容吗?
显然当然是可以的
一、equals的用法:比较全部的字符串,如果一样返回true不是返回false,可以做用户名和密码一致性校验。
java">package 字符串;public class str1 {public static void main(String[] args) {
String s1=new String("abc");
String s2="abc";
blooean result=s1.equals(s2);
System.out.println(result);
//true}}
二、equalsIgnoreCase的用法,可以忽略大小写的问题,可以用来做验证码登录。
java">package 字符串;public class str1 {public static void main(String[] args) {
String s1=new String("Abc");
String s2="abc";
blooean result=s1.equalsIgnoreCase(s2);
System.out.println(result);
//true}}
问题1:如果键盘输入一个字符串abc和自己定义一个abc,判断是不是true还是false。
java">package 字符串;import java.util.Scanner;public class str1 {public static void main(String[] args) {//键盘输入一个字符串“abc”、Scanner sc=new Scanner(System.in);System.out.println("亲输入一个字符串:");String res=sc.next();//代码定义一个字符串“abc”String s1="abc";//==判断是不是true还是falseSystem.out.println(s1==res);}}
显然,这个结果是false。那为什么会是false呢?
五、初步阅读输入函数中 String res=sc.next()源码来解决问题:
按住ctrl+鼠标点击next();
在点这个,进去看看。
找到s,在进入group看一下
这里又吊用了group(0) ,在点进去看一下--------------
在进入到getSubSequence里面
点击String类,到这一步。
进入到substring里面
在点击new.String里面你就会看到
总结:通过千辛万苦我们得知,这个键盘输入的值是通过new方式创建的所以你应该可以理解为什么上面的比较是false了吧!
六、总结
今天主要介绍string的创建的两种方式,了解一下java中内存模型,明天我在继续解释java字符串操作中,翻转和切片索引以及StringBuild和Stringjion的用法。
通过本文的探讨,我们深入了解了Java字符串的重要性及其在编程中的广泛应用。希望这些知识能帮助您在未来的开发工作中更加得心应手。如果您觉得本文对您有帮助,不妨尝试将这些技巧应用到您的下一个项目中,并分享您的成果。您的实践经验将是对我们最大的鼓励。感谢您抽出宝贵的时间阅读本文。如果您有任何问题或建议,欢迎随时联系我们。期待与您在技术的道路上共同进步。敬请关注我们下一期的博客,我们将探讨更多关于Java性能优化的实用技巧和案例分析。