字符串的创建
同前端代码一样,java中的字符创建非常简单
public class Object_01 {
public static void main(String[] args) {
// 字符串创建
String name = "shixiaoshi";
}
}
java中字符串的创建是基于java.lang.String这个类的,这意味着,字符串的创建实际上是这样的
public class Object_01 {
public static void main(String[] args) {
// 字符串完成的创建方式
String name = new String("shixiaoshi") ;
}
}
实际开发中应该使用那种?
答案显而易见,使用双引号直接声明更方便快捷!
java虚拟机基于第一种创建方式有内部优化,所有相同的字符数据,其实来源于同一个字符串对象,这样就可以降低频繁的new String()带来的资源和内存消耗了。
public class Object_01 {
public static void main(String[] args) {
// 字符串完成的创建方式
String name = new String("shixiaoshi") ;
String name1 = new String("shixiaoshi") ;
String name2 = "shixiaoshi";
String name3 = "shixiaoshi";
System.out.println(name == name1); // false
System.out.println(name1 == name2); // false
System.out.println(name2 == name3); // true
}
}
上述代码验证了通过new String创建完全相同的字符串,结果也是不同的字符对象;通“”直接创建的字符,结果是相同的。
字符串和字符是不相同的概念
要注意的是,字符串和字符是不一样的,比如字符串“8石f”,实际是由“8”、“石”、“f”三个字符组成的。
我们在来复习一下java中的基本数据单位概念。
基本数据单位
在Java中,最小的的数据单位是Byte,也就是字节类型,1 字母 = 1 byte ,一个汉字是一个字符,占两个字节。
之前的学习中,我们介绍了基本数据类型。每种数据类型的字节数都是不尽相同的,我们来复习一下:
整型数据类型(整数):
- byte:1个字节,范围为-128到127
- short:2个字节,范围为-32,768到32,767
- int:4个字节,范围为-2,147,483,648到2,147,483,647
- long:8个字节,范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807
浮点型数据类型(小数):
- float:4个字节,范围为±3.40282347E+38F(有效位数为6-7位)
- double:8个字节,范围为±1.7976931348623157E+308(有效位数为15位)
字符型数据类型:
- char:2个字节,表示一个Unicode字符
布尔型数据类型:
- boolean:表示逻辑值,只能是true或false
现在,我们应该能清除的知道,"8石f" 这个字符串的构成了
字符串 | 8石f | |||
---|---|---|---|---|
字符 | 8 | 石 | f | |
字节 | 1 | 1 | 1 | 1 |
通过上述例子,我们也能明白,字符串实际就是一个特殊的字符数组拼接而成的。
通过字符数组创建字符串
public class Object_01 {
public static void main(String[] args) {
char[] name = {
'石','小','石'};
String names = new String(name);
System.out.println(names); // 石小石
}
}
注意,char[] name = {'石','小','石'} 代码中,用的是单引号而不是双引号,使用双引号会报错。
java中的单引号表示字符,一般是char类型的;java中的双引号是字符串,是String类型的。
转义字符
我们如果想打印一个引号,该怎么做呢?
直接打印必然报错,我们只需要加一个转义字符即可!
public class Object_01 {
public static void main(String[] args) {
System.out.println("\""); // "
}
}
字符串的操作
拼接
和前端一样,字符串的拼接可以直接用 + 号;其作用和前端的+用法效果是一致的。
String name = "shi" + "xiao" + "shi";
这种形式创建的字符等同于下面方式创建的字符
String name1 = "shixiaoshi";
这两种形式创建的字符其实完全一样
public class Object_01 {
public static void main(String[] args) {
// 拼接
String name = "shi" + "xiao" + "shi";
String name1 = "shixiaoshi";
System.out.println(name.hashCode() == name1.hashCode()); // true
}
}
hashCode方法用于返回对象的内存地址,因此可以判断两个字符对象相同。
比较
要比较两个字符串是否相同,可以用equals。
equals用于判断两个对象是否相等。默认情况下,equals()方法比较的是对象的引用是否相同(即是否指向同一个内存地址)。
public class Object_01 {
public static void main(String[] args) {
String a = "shi";
String b = "shi";
System.out.println(a.equals(b)); // true
}
}
equals是区分大小写的
public class Object_01 {
public static void main(String[] args) {
String a = "shi";
String b = "SHI";
System.out.println(a.equals(b)); // fasle
}
}
如果想忽略大小写,可以用equalsIgnoreCase
截断
substring
java中的字符截断方法substring和前端的字符截断方法substring也是一致的
public class Object_01 {
public static void main(String[] args) {
String java = "hello world";
System.out.println(java.substring(0,5)); // hello
}
}
for (int i=0;i < s.length;i++){
System.out.println(s[i]);
}
split
splitf方法将一个字符分隔成数组,和前端用法也是一致的
trim
trim() 方法用于删除字符串的头尾空白符。这和前端中的trim方法用法也是一样的
public class Object_01 {
public static void main(String[] args) {
String a = " hello world ";
System.out.println(a.trim());
}
}
替换
repalce
replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串。
public String replace(char oldChar,char newChar)
它的第一个参数只能是字符或字符串
public class Object_01 {
public static void main(String[] args) {
String a = "hello hello world";
System.out.println(a.replace("hello","hi")); // hi hi world
}
}
注意,这和前端中的replace是有些区别的。前端中:replace用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
<script>
var str = "Hello Hello World!";
let index = str.replace(/Hello/i, "hi");
console.log(index); // hi Hello World!
</script>
前后端replace区别
1、java中replace第一个参数只能是字符或者是字符串;而js可以是正则。
2、java中replace替换后,所有匹配到的字符都会变化;而js中,匹配的字符只会替换第一个。
replaceAll
replaceAll() 方法使用给定的参数 replacement 替换字符串所有匹配给定的正则表达式的子字符串。
语法
public String replaceAll(String regex, String replacement)
参数
- regex -- 匹配此字符串的正则表达式。
- newChar -- 用来替换每个匹配项的字符串。
public class Object_01 { public static void main(String[] args) { String a = "hello hello world"; System.out.println(a.replaceAll("hello|world","hi")); // hi hi hi } }
js中的repalceAll用法和这个也是大同小异的
大小写转换
java中的字符大小写转换和前端是一致的
public class Object_01 {
public static void main(String[] args) {
String a = "Hello";
System.out.println(a.toLowerCase()); // hello
System.out.println(a.toUpperCase()); // HELLO
}
}