Java基础学习Day09--字符串
- 一、简介:
- 二、String类字符串
- 三、String存储字符串的原理
- 四、字符串常用方法
-
- 1.equals()方法
- 2.搜索字符串
- 3.截取子字符串
- 4.去除头尾空白字符串
- 5.替换字符串
- 6.分割字符串
- 7.拼接字符串
- 8.格式化字符串
- 9.类型转换
- 10.转换为char[]字符数组
- 五、StringBuffer与StringBuilder
-
- 1.StringBuffer对象
- 2.StringBuilder对象
- 3.总结
今天解决了昨天留下的问题 今天,我学习了与字符串相关的内容
一、简介:
字符串(String)有限序列由一对双引号包含的零个或多个字符组成。Java字符串作为对象处理。
可分为两类: (1)String类别:字符串常量创建后不会修改或更改; (2)StringBuffer类别:创建后允许更改和更改字符串变量。 串最基本的两种存储方式是顺序存储和链接存储。
二、String类字符串
字符串变量必须赋值才能使用,称为字符串对象的初始化。
创建和赋值字符串有三种方式
(1)String 字符串变量名; 字符串变量名="字符串常量"; String username=""; username="Tom" (2)String 字符串变量名="字符串常量"; String SayHello="Hello world"; (3)String studentName=new String("周杰杰")
三、String存储字符串的原理
(1)String表示字符串类型,属于引用数据类型。 (2)在java双引号的随机使用包括在内String对象。 例如:“abc”, “def”, “hello world”,这是3个字符串对象。 (3)java双引号中包含的字符串是不可改变的,final修饰,从出生到销毁都是不可改变的。 (4)在JDK双引号中包含的字符串,如:abc”, "xyz"都是直接存储在“方法区”的“字符串常量池”当中的。 (5)为什么SUN公司在字符串常量池中存储字符串? 由于字符串在实际开发中使用过于频繁,为了提高执行效率,将字符串放入方法区的字符串常量池中。
样例:
public class Test01 {
public static void main(String[] args) {
///以下两行代码在常量池中创建了三个字符串对象 String s1 = "abcdef"; ///在字符串常量池中"abcdef"对象 String s2 = "abcdef" "xy"; //因为已经有了"abcdef"对象,不需要再创建,而是创建"xy"对象,然后拼接计算,创建"abcdefxy"对象 String s3 = new String("xy"); //使用了这个代码new关键字。代码中的"xy"它是从哪里来的? //new关键词是实例对象,存在于堆内存中,而"xy"在方法区字符串常量池中 //所以,栈中main()栈帧中局部变量的方法s3保存是一堆内存的地址,堆中对象保存的是常量池"xy"的内存地址
//凡是双引号括起来的都在常量池当中,凡是new实例化的对象都在堆内存当中
}
}
总结: (1)双引号括起来的字符串,如:“abc”, "xyz"都是直接存储在“方法区”的“字符串常量池”当中的。 (2)new关键字实例化的对象都存在堆当中。
四、字符串常用方法
1.equals()方法
常用于比较两个字符串是否相等,返回值类型是boolean,参数是Object类
public class test {
public static void main(String[] args) {
String n1 = "saf";
String n2 = "saf";
System.out.println(n1.equals(n2)); // true
}
}
2.字符串的搜索
①indexOf()方法:使用indexOf方法可以从字符串的首部进行搜索,当前字符串中指定子字符串的下标位置,返回值为int类型,如果存在,则返回子字符串的下标位置。如果不存在,则返回-1。 “Hello”.indexOf(“l”); // 2 ②lastIndexOf()方法:lastIndexOf()方法是从字符串的尾部进行搜索,返回值与indexOf()方法一致 “Hello”.lastIndexOf(“l”); // 3 ③startsWith()方法:用于判断字符串是否以指定字符串开头,返回值为boolean类型 “Hello”.startsWith(“He”); // true ④endWith()方法:用于判断字符串是否以指定字符串结尾,返回值为boolean类型 “Hello”.endsWith(“lo”); // true ⑤contains()方法:用于查找当前字符串中是否存在指定子字符串,返回值为boolean类型 “Hello”.contains(“lo”); // true
3.截取子字符串
①substring()方法:使用substring()方法可以从当前字符串中,截取指定下标区间的子字符串,参数是int,返回值是String类型 “大漠孤烟直”.substring(2); // 孤烟直 “大漠孤烟直”.substring(0,2); // 大漠
4.去除首尾空白字符串
①trim()方法:trim()方法可以移除字符串首尾空白字符,空白字符包括空格,\t,\n,\r.无参数,返回值类型是 String。 " \tHello\r\n ".trim(); // 返回 “Hello”
5.替换字符串
①replace()方法:根据字符或字符串替换
String s = "hello";
s.replace('l', 'w'); // "hewwo",所有字符'l'被替换为'w'
s.replace("ll", "~~"); // "he~~o",所有子串"ll"被替换为"~~"
②replaceAll()方法:通过正则表达式,把匹配的子字符串统一替换
String s = "A,,B;C ,D";
s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D"
6.分割字符串
①split()方法:通过正则表达式传入值,参数值为字符串类型,返回值类型是字符串数组
String s = "A,B,C,D";
String[] ss = s.split("\\,"); // {"A", "B", "C", "D"}
7.拼接字符串
①join()方法:拼接字符串使用静态方法join(),他用指定的字符串连接字符串数组
String[] arr = {
"A", "B", "C"};
String s = String.join("***", arr); // "A***B***C"
8.格式化字符串
①format()方法:fomat()静态方法,可以传入其他参数,替换占位符,然后生成新的字符串。参数是字符串和动态参数,返回值是字符串类型
String s = "Hi %s, your score is %d!";
System.out.println(s.format("Alice", 80)); // 字符串对象调用
System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5)); // 字符串类调用
9.类型转换
①valueOf()方法:是静态方法,可以把任意基本类型或引用类型转换为字符串,这是一个重载方法,编译器会根据参数自动选择合适的方法。返回值是String类型
String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // 类似java.lang.Object@636be97c
②parseInt()方法:把字符串转为int类型,参数是String类型,返回值是int类型
int n1 = Integer.parseInt("123"); // 123
int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255
③parseBoolean()方法:把字符串转为boolean类型,参数是int类型,返回值是boolean类型
boolean b1 = Boolean.parseBoolean("true"); // true
boolean b2 = Boolean.parseBoolean("FALSE"); // false
10.转换为char[]字符数组
①String和char[]类型可以互相转化,方法是
char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String
②修改char[]的时候,String里面的值不会变,因为new String() 的时候指向了一个新的内存空间
char[] cs = "Hello".toCharArray();
String s = new String(cs);
System.out.println(s);
cs[0] = 'X';
五、StringBuffer与StringBuilder
由于 String存放字符的数组是被final修饰的,只能被赋值一次,不能修改,因此String字符串在每次连接时都需要构建新的String对象,既费时又浪费空间;在需要多次进行字符串拼接时,使用 StringBuffer 或 StringBuilder 类更为合适一些;
1.StringBuffer对象
代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。StringBuffer类中的方法都添加了synchronized关键字,也就是给这个方法添加了一个锁,用来保证线程安全。
2.StringBuilder对象
StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。
3.总结
效率 :StringBuilder > StringBuffer 安全 :StringBuffer > StringBuilder 在更改次数较少时考虑使用 String; 在单线程大量操作数据时,考虑使用 StringBuilder ; 在多线程大量操作数据时,考虑使用 StringBuffer ;
明天会更好