String字符串
前言
在前面的数据类型的章节中,我们学习了8大基本数据类型,那在java中除了基本数据类型,还有一种叫做引用数据类型,那我们今天就来学习一种引用数据类型:字符串。
前面我们在学习基本数据类型的时候大家都掌握了每种数据类型所存储的值是什么样的,那么我们今天要学习的字符串类型是用来存储什么的呢?
在基本数据类型中有一个叫字符型,是用来存储单个字符的。那字符串顾名思义就是多个字符就叫字符串了。
正文
在java中声明字符串类型的变量使用关键字:String
语法:
//声明一个字符串类型的变量,并赋予初始值abc
String 变量名 = ”abc“;
单引号的值是字符型的类型,双引号的值为字符串。
String类型是一个不可变的对象,这意味着一旦创建了一个字符串对象,就不能更改其内容。这里先做一个了解,等我们把基础内容学习完了,再带领大家了解这句话的意思。包括前面提到的引用数据类型的意思。
String类提供了丰富的API来处理字符串,包括字符串的拼接、切割、替换等等。下面我们依次来看一下相关知识点:
字符串创建
通过字面量创建字符串变量。
String text = ”hello world";
可以通过字面量也就是双引号直接创建字符串。因为String是一个类,也可以通过new关键字去创建String对象。这个概念大家先了解一下,之后我们在类和对象的章节中在做详细的讲解。
String textNew = new String("hello world");
推荐大家使用第一种方式创建字符串,首先第一个优点是操作方便,其次这里涉及到一个常量池的概念。
字符串常量池:
字符串常量池是一个特殊的内存区域,用于存储字符串字面量,目的是为了提高性能和减少内存消耗。
字符串常量池是一个存放字符串字面量的内存区域,它位于方法区(在Java 8及以前版本)或堆内存(Java 9及以后版本)中。字符串常量池中的每个字符串字面量都是唯一的,也就是说,如果有两个相同的字符串字面量,那么它们在字符串常量池中只会有一个副本。
当我们通过字面量的方式创建字符串的时候,首先会去字符串常量池中寻找我们所创建的字符串,如果字符串常量池中存在就会把地址返回过来,如果不存在,则会在字符串常量池中创建该字符串,然后把地址返回过来。
但是通过new对象的方式去创建字符串,无论字符串常量池中是否存在该字符串,都会创建一个新的字符串对象。并且通过new的方式创建的字符串不会放到字符串常量池中。
所以通过字面量的方式创建字符串使用到了常量池的概念,可以节省内存消耗,可提升代码性能。
字符串比较是否相等
比较两个字符串是否相等,大家可能首先想到的是前面我们学习的关系运算符中的 == 。这里我们要讲一下 == 在基本数据类型和引用数据类型中的区别了。
== :在基本数据类型中比较的是值是否相等;而在引用数据类型中比较的是地址。这一句话大家先死记硬背,我们在之后的学习中再去详细讲解。
那么如果我们要比较两个字符串是否内容相等怎么办呢?
在String中提供了一个api专门用于比较内容是否相等:eques();
样例:
public class One {
public static void main(String[] args) {
String a = "你好";
String b = "你好";
System.out.println(a == b);
String c = new String("你好");
System.out.println(a == c);
System.out.println(a.equals(c));
}
}
解释:我们在前面声明了两个字符串变量a,b。都是通过字面量的方式,所以创建字符串a的时候会将字符串”你好“放到字符串常量池中,然后创建字符串b的时候去常量池中寻找”你好“,所以相当于a,b都是指向常量池中的同一个”你好”。
所以当我们判断a==b时,就是判断的a和b的地址是否相同,所以就会返回true。
然后变量c是通过new对象的方式创建的,所以a和c的地址不相同,所以a==c的结果就为false。
而a.eques©,是比较a和c的值是否相同,两个变量的值都是“你好”,所以结果是true。
字符串的api用法
字符串长度
String a = "helloworld";
//获取字符串的长度
int length = a.length();
System.out.println(length);
字符串拼接
字符串的拼接有两种方式,一种通过+符号进行拼接,一种通过concat()方法进行拼接。
String a = "helloworld";
String b = "aaaaa";
a = a+b; // 字符串拼接
System.out.println(a);
注意:因为String类是不可变对象,所以a=a+b的时候,其实是新创建了一个“helloworldaaaaa”的字符串对象,然后将地址返回给了字符串变量a。
还有一些其他的api,我们在之后的学习中慢慢了解。