什么是字符串?
字符串是由多个字符组成的一串数据(字符序列)
字符串可以看成是字符数组
String类的概述:
通过JDK提供的API,查看String类的说明,可以看到这样的两句话。
字符串字面值"abc"也可以看成是一个字符串对象。
字符串是常量,一旦被创建,就不能被改变。
常见构造方法
public String()
:空构造
public String(byte[] bytes)
:把字节数组转成字符串
public String(byte[] bytes,int index,int length)
:把字节数组的一部分转成字符串(index
:表示的是从第几个索引开始, length
表示的是长度)
public String(char[] value)
:把字符数组转成字符串
public String(char[] value,int index,int count)
:把字符数组的一部分转成字符串
public String(String original)
:把字符串常量值转成字符串
代码示例1:
package org.westos.demo;
/**
* @Author: Administrator
* @CreateTime: 2019-04-20 14:26
*/
public class MyTest {
public static void main(String[] args) {
//字符串:有多个字符组成的字符序列
// 1.String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
// 字符串是常量;它们的值在创建之后不能更改。
//构造方法:String()
//初始化一个新创建的 String 对象,使其表示一个空字符序列。
//String(String original)
//初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
String s = new String(); //创建一个空的字符串对象
System.out.println(s.toString());
String s1 = new String("abc");
System.out.println(s1.toString());//字符串重写了toString方法,打印的是字符串的内容
//字符串可以看做是一个长度固定的有序字符序列,每个组成的字符编有索引从0开始
int length = s1.length(); //获取字符串的长度
System.out.println(length);
}
}
在上述代码中用到了字符串的一个方法length()
方法,通过该方法可以返回调用该方法的字符串对象的长度,包括字符串字面值如"abc"
等
代码示例2:
package org.westos.demo;
/**
* @Author: Administrator
* @CreateTime: 2019-04-20 14:35
*/
public class MyTest2 {
public static void main(String[] args) {
// 1.String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
// 字符串是常量;它们的值在创建之后不能更改。
String s = new String("abc"); //相当于创建了字符串"abc"的一个副本
int length = s.length(); //获取字符串的长度
System.out.println(s);
int length1 = "abcde".length();
System.out.println(length1);
// 字符串是常量;它们的值在创建之后不能更改。
}
}
上述代码执行结果为:
abc
5
代码示例3:
package org.westos.demo;
/**
* @Author: Administrator
* @CreateTime: 2019-04-20 14:37
*/
public class MyTest3 {
public static void main(String[] args) {
定义字符串的两种方式
//String s = new String("abc");
//String str="ccc";
//字符串是常量;它们的值在创建之后不能更改。
String s = "hello" ;
s = "world" + "java";
System.out.println(s);
}
}
通过上述代码可以体现字符串是一个常量,一旦被创建就不能被改变,下面是对字符串创建的内存图
当给s
赋字符串常量"Hello"
时,会在方法区的常量池中先寻找"Hello"
字符串常量,
s
,"Hello"
常量,创建完成后将该常量的地址值赋给局部变量s
,所以字符创一旦被创建就不能改变是指这个字符串的值不能被改变,而局部变量是可以改变的。
但是要注意,在执行到 s = "world" + "java"
;语句时,因为常量池中不存在字符串常量"world"
、"java"
,所以会在常量池中先创建这两个字符串常量,之后会将这两个字符串常量拼接在一起之后创建一个新的字符串常量之后将地址值赋给局部变量s,也就是说,在执行到s = "world" + "java"
语句时,会在常量池中创建三个字符串常量,
由于"worldjava"
字符串常量的地址值最终被赋给了s,所以s最后指向"worldjava"
常量,这就是刚才提到的字符串的值不能改变,但是引用变量是可以改变的
通过以上讲解可以知道,上述代码最终运行结果为:
worldjava
代码示例4:
package org.westos.demo;
/**
* @Author: Administrator
* @CreateTime: 2019-04-20 14:45
*/
public class MyTest4 {
public static void main(String[] args) {
String s="abc";
String s1 = new String("abc");
String s2="abc";
System.out.println(s==s1);
System.out.println(s==s2);
System.out.println(s.equals(s1));
}
}
经过上述讲解可知上述代码最终运行结果为:
false
true
true
这里需要解释的是第一个为什么是false
,下面是创建一个字符串常量副本的内存图:
因为只要new就会在堆内存中开辟一段空间来存放一些
String的特点: 一旦被创建就不能改变,因为字符串的值是在方法区的常量池中划分空间分配地址值的,但是指向常量池中的空间的局部变量可以改变
面试题1:String s = new String(“hello”)和String s = “hello”;的区别
答:第一条语句是给字符串常量创建了一个副本,所以两个对象是
B:面试题2
==和equals()的区别?
C:面试题3
看程序写结果
String s1 = new String(“hello”);
String s2 = new String(“hello”);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3 == s4);
System.out.println(s3.equals(s4));
String s5 = "hello";
String s6 = "hello";
System.out.println(s5 == s6);
System.out.println(s5.equals(s6));
A:String类的判断功能
public boolean equals(Object obj): 比较字符串的内容是否相同,区分大小写
public boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
public boolean contains(String str): 判断字符串中是否包含传递进来的字符串
public boolean startsWith(String str): 判断字符串是否以传递进来的字符串开头
public boolean endsWith(String str): 判断字符串是否以传递进来的字符串结尾
public boolean isEmpty(): 判断字符串的内容是否为空串""。
B:案例演示: 案例演示String类的判断功能;
A:案例演示: 需求:模拟登录,给三次机会,并提示还有几次。
A:String类的获取功能
public int length(): 获取字符串的长度。
public char charAt(int index): 获取指定索引位置的字符
public int indexOf(int ch): 返回指定字符在此字符串中第一次出现处的索引。
public int indexOf(String str): 返回指定字符串在此字符串中第一次出现处的索引。
public int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
public int indexOf(String str,int fromIndex): 返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
可以顺带提一下lastIndexOf系列
public String substring(int start): 从指定位置开始截取字符串,默认到末尾。
public String substring(int start,int end): 从指定位置开始到指定位置结束截取字符串。
B:案例演示
案例演示String类的获取功能
A:案例演示: 需求:遍历字符串
A:案例演示: 需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)
A:String的转换功能:
public byte[] getBytes(): 把字符串转换为字节数组。
public char[] toCharArray(): 把字符串转换为字符数组。
public static String valueOf(char[] chs): 把字符数组转成字符串。
public static String valueOf(int i): 把int类型的数据转成字符串。
注意:String类的valueOf方法可以把任意类型的数据转成字符串。
public String toLowerCase(): 把字符串转成小写。
public String toUpperCase(): 把字符串转成大写。
public String concat(String str): 把字符串拼接。
B:案例演示
案例演示String类的转换功能
A:案例演示: 需求:把一个字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)
A:String的替换功能及案例演示
public String replace(char old,char new) 将指定字符进行互换
public String replace(String old,String new) 将指定字符串进行互换
B:String的去除字符串两空格及案例演示
public String trim() 去除两端空格
C:String的按字典顺序比较两个字符串及案例演示
public int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果
如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果
如果连个字符串一摸一样 返回的就是0
public int compareToIgnoreCase(String str) 跟上面一样 只是忽略大小写的比较
A:案例演示
需求:把数组中的数据按照指定个格式拼接成一个字符串
举例:
int[] arr = {1,2,3};
拼接结果:
"[1, 2, 3]"
A:案例演示
需求:把字符串反转
举例:键盘录入"abc"
反转结果:"cba"
A:画图演示
需求:统计大串中小串出现的次数
举例: "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun”中java出现了5次
A:案例演示 统计大串中小串出现的次数
A:代码优化
统计大串中小串出现的次数
String maxStr = "woaijavawozjavahendeaijavawohenajavaihenaijava";
String minStr = "java";
// 定义一个统计变量
int count = 0;
// 获取"java"在字符串中的索引
// int index = maxStr.indexOf(minStr);
// while (index != -1) {
// count++;
// // 找到"java" 截取
// maxStr = maxStr.substring(index + minStr.length());
// // 再获取索引
// index = maxStr.indexOf(minStr);
//
// }
int index;
while ((index = maxStr.indexOf(minStr)) != -1) {
count++;
// 找到"java" 截取
maxStr = maxStr.substring(index + minStr.length());
}
System.out.println(count);
### day13授课目录:
StringBuffer
StringBuilder
数组常见操作
Arrays
基本数据类型包装类
A:StringBuffer类概述
我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。
而StringBuffer就可以解决这个问题
线程安全的可变字符序列
B:简述安全问题
C:StringBuffer和String的区别
A:StringBuffer的构造方法:
public StringBuffer(): 无参构造方法
public StringBuffer(int capacity): 指定容量的字符串缓冲区对象
public StringBuffer(String str): 指定字符串内容的字符串缓冲区对象
B:StringBuffer的方法:
public int capacity():返回当前容量。 理论值
public int length():返回长度(字符数)。 实际值
C:案例演示
构造方法和长度方法的使用
A:StringBuffer的添加功能
public StringBuffer append(String str): 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
B:案例演示
StringBuffer的添加功能
A:StringBuffer的删除功能
public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
B:案例演示
StringBuffer的删除功能
A:StringBuffer的替换功能
public StringBuffer replace(int start,int end,String str): 从start开始到end用str替换
B:StringBuffer的反转功能
public StringBuffer reverse(): 字符串反转
C:案例演示
StringBuffer的替换和反转功能
A:StringBuffer的截取功能
public String substring(int start): 从指定位置截取到末尾
public String substring(int start,int end): 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
B:注意事项
注意:返回值类型不再是StringBuffer本身
C:案例演示
StringBuffer的截取功能及注意事项
A:String -- StringBuffer
a:通过构造方法
b:通过append()方法
B:StringBuffer -- String
a: 使用substring方法
b:通过构造方法
c:通过toString()方法
C:案例演示
StringBuffer和String的相互转换
A:案例演示
需求:把数组中的数据按照指定个格式拼接成一个字符串
举例:
int[] arr = {1,2,3};
输出结果:
"[1, 2, 3]"
用StringBuffer的功能实现
A:案例演示
需求:把字符串反转
举例:键盘录入"abc"
输出结果:"cba"
用StringBuffer的功能实现
A:StringBuilder的概述
通过查看API了解一下StringBuilder类
B:面试题
String,StringBuffer,StringBuilder的区别