字符串
API:应用程序接口(别人已经写好的东西,我们不需要自己编写,直接使用即可)
API帮助文档:帮助查询API的文档,直接搜索就可以
先查看类所在的包,然后看类的描述怎么用,然后查看构造方法,然后查看成员方法
字符串
String
java.lang.String类代表字符串,java程序中的所有字符串文字都为此类的对象
字符串创建之后就不能被更改
创建String对象的两种方式
1.直接赋值 String name = "学习"
2.new方法
public String()
public String(String original)
public String(char[] chs)
public String(byte[] chs)
java的内存模型
又来了
之前我们知道,栈内存:方法运行的时候进栈执行完毕出栈
堆内存:new出来的对象在这里
方法区:字节码文件
今天有一个新的
String Table(串池)从JDK7之后从方法区到了堆内存
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。
不存在:创建新的
存在:复用
字符串的比较
常规的==比较的是地址值
1.boolean equals方法(要比较的字符串) 完全一样为true,否则为false
2.boolean equalslgnoreCase(要比较的字符串) 忽略大小写的比较
键盘录入也是new出来的
练习
1.遍历字符串
public char charAt(int index);根据索引返回字符
public int length();返回此字符串的长度
字符串长度:字符串对象.length()
package stringdemo;
import java.util.Scanner;
public class StringDemo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Enter a string: ");
String str = input.nextLine();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
System.out.println(c);
}
}
}
2.统计字符串中大小写和数字以及其他字符个数
package stringdemo;
import java.util.Scanner;
public class StringDemo1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Enter a string: ");
String str = input.nextLine();
int bigCount = 0;
int smallCount = 0;
int numCount = 0;
int otherCount = 0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c >= 'A' && c <= 'Z') {
bigCount++;
}
else if (c >= 'a' && c <= 'z') {
smallCount++;
}
else if (c >= '0' && c <= '9') {
numCount++;
}
else {
otherCount++;
}
}
System.out.println("bigCount: " + bigCount);
System.out.println("smallCount: " + smallCount);
System.out.println("numCount: " + numCount);
System.out.println("otherCount: " + otherCount);
}
}
3.字符串反转
package stringdemo;
import java.util.Scanner;
public class StringDemo2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Enter a string: ");
String str = input.nextLine();
reverse(str);
System.out.println(reverse(str));
}
public static String reverse(String str) {
String result = "";
for (int i = str.length() - 1; i >= 0; i--) {
char c = str.charAt(i);
result += c;
}
return result;
}
}
4.金额转换,将金额转换为银行一样的汉字格式并且补零
package stringdemo;
import java.util.Scanner;
public class StringDemo3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int money;
while (true) {
System.out.println("Enter a money: ");
money = input.nextInt();
if(money >= 0 && money <= 9999999) {
break;
}else {
System.out.println("Invalid money");
}
}
String moneyStr = "";
while (true) {
int ge = money % 10;
String c = change(ge);
moneyStr = c + moneyStr;
money /= 10;
if (money == 0) {
break;
}
}
int count = 7 - moneyStr.length();
for (int i = 0; i < count; i++) {
moneyStr = "零" + moneyStr;
}
String[] arr = {"佰", "拾", "万", "仟", "佰", "拾", "元"};
String result = "";
for (int i = 0; i < moneyStr.length(); i++) {
char c = moneyStr.charAt(i);
result += c;
if (i != moneyStr.length() - 1) {
result += arr[i];
}
}
}
public static String change(int number) {
String[] arr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
return arr[number];
}
}
5.手机号屏蔽
String substring(int beginIndex,int endIndex)截取
注意:包头不包尾,包左不包右,返回值才是结果
String subsrting(int beginIndex)截取到末尾
package stringdemo;
public class StringDemo4 {
public static void main(String[] args) {
String phoneNumber = "13800138000";
String result = phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7);
System.out.println(result);
}
}
6.敏感词替换
String replace(旧值,新值)替换
只有返回值是替换之后的结果
StringBuilder
StringBuilder可以看成是一个容器,创建之后里面的内容是可变的
作用:提高字符串的操作效率
打印相应对象是属性值而不是地址值
构造方法
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象
public StringBuilder append(任意类型)添加数据,并返回对象本身
public StringBuilder reverse()反转容器中的内容
public int length()
public String toString()可以实现把StringBuilder转换为String
链式编程
当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法
练习
1.对称字符串,键盘接受一个字符串,程序判断出该字符串是否是对称字符串
package stringdemo;
import java.util.Scanner;
public class StringDemo5 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a string: ");
String str = sc.nextLine();
String result = new StringBuilder(str).reverse().toString();
if (str.equals(result)) {
System.out.println("Yes");
}else {
System.out.println("No");
}
}
}
StringJoiner
和StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
作用:提字符串的操作效率,而且代码编写特别简洁
JDK8之后出现
public StringJoiner(间隔符号)创建一个对象,指定拼接时的间隔符号
public StringJoiner(间隔符号,开始符号,结束符号)创建一个对象,指定拼接时的间隔符号,开始符号,结束符
public String toString()返回一个字符串
字符串原理
1.字符串存储的内存原理
直接赋值会复用字符串常量池中的
new出来不会复用,而是开辟一个新的空间
2.==号比较的到底是什么
基本数据类型比较数据值
引用数据类型比较地址值
3.字符串拼接的底层原理
等号右边没有变量时,都是字符串,触发字符串的优化机制,在编译的时候就已经是最终的结果了。
有变量时,JDK8之前会使用StringBuilder,会在内存中new StringBuilder然后拼接之后再toString产生新字符串,每次想加会在堆内存中创建两个对象。
4.StringBuilder提高效率原理图
原理很简单,之前都是拼接一次创建一个StringBuilder,但是直接用的话,就会只用一个当作容器,在里面草错效率提升很多。
5.StringBuilder源码分析
默认创建一个长度为16的字节数组
添加和内容长度小于16,直接存
添加的内容大于16会扩容(原来的容量*2+2)
如果扩容之后还不够,以实际长度为准