API:应用程序编程接口
简单理解:API就是别人已经写好的东西,不需要我们自己编写,直接使用即可。
Java API:JDK中提供各种功能Java类
这些类将底层实现封装起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。如:Scanner 键盘录入 Random 随机数
字符串
字符串与任意类型相加,此时不是进行算术运算符的"+"操作,而是都进行拼接操作,拼接形成新的字符串
"ab" + true = "abtrue"
"ab" + 666 = "ab666"
String概述:
String类代表字符串,在Java.lang包下,Java程序中所有的字符串文字都为此类对象。
String注意点:
字符串的内容是不会发生改变的,他的对象在创建之后不能被更改。
创建String对象的两种方式:
1.直接赋值
2.new
//1.使用直接赋值的方式获取一个字符串对象
String s1 = "abc";
System.out.println(s1);//abc
//2.使用new的方式来获取一个字符串对象
//空参构造:可以获取一个空白的字符串对象
String s2 = new String();
System.out.println("!" + s2 + "$");//""
//传递一个字符串,根据传递字符串的内容再创造一个新的字符串对象
String s3 = new String("abc");
System.out.println(s3);//abc
//传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
//需求:修改字符串内容。 abc Abc
//"abc" --> {'a','b','c'} --> {'A','b','c'} --> "Abc"
char[] ch = {'a','b','c'};
String s4 = new String(ch);
System.out.println(s4);//abc
//传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
//应用场景:以后在网络中传输的数据其实都是字节信息
//我们一般要把字节信息进行转换,转成字符串,此时就用到这个构造了
byte[] bytes = {97,98,99};
String s5 = new String(bytes);
System.out.println(s5);//abc
创建String对象内存分析
栈内存:方法运行时进栈,执行完毕后出栈
堆内存:new出来的对象都在这里
StringTable(串池):在堆内存之中,只能存储直接赋值的字符串对象,字符串对象通过new关键字获得的要存储在堆内存之中
方法区:class字节码文件临时存储
两种方式创建字符串对象内存区别
直接赋值:当使用直接赋值的方式创建字符串时,系统首先会检查该字符串在串池中是否存在。
存在:复用
不存在:在串池中创建新的
对于字符串的创建以后更多的会使用直接赋值的方式,这样不仅代码书写简单,而且节约内存。
new:当使用new新建对象时,都会在堆内存中重新开辟一个空间存储新建对象,不会被复用。
字符串的比较
==号比较的是什么?
//基本数据类型
int a = 10;
int b = 10;
System.out.println(a == b);//true
//引用数据类型
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);// false
基本数据类型比较的是数据值
引用数据类型比较的是地址值
字符串比较
boolean equals(要比较的字符串) | 完全一样为true,否则为false |
boolean equalslgnoreCase(要比较的字符串) | 忽略大小写的比较 |
//比较两个字符串对象
String s1 = new String("abc");
String s2 = "abc";
String s3 = "Abc";
//不忽略大小写比较
boolean result1 = s1.equals(s2);
System.out.println(result1);//true
//忽略大小写的比较
boolean result2 = s1.equalsIgnoreCase(s3);
System.out.println(result2);//true
扩展
//键盘录入一个abc
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
//代码中再定义一个字符串abc
String s2 = "abc";
//用==比较,二者是否一样?
System.out.println(s1 == s2);//false
键盘录入得到的字符串是通过new获得的
结论:要比较字符串的内容,就必须通过String里面的方法
遍历字符串
public char charAt(int index) | 根据索引返回字符 |
public int length() | 返回字符串的长度 |
数组的长度:数组名.length
字符串的长度:字符串对象.length()
//键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.next();
//循环遍历
for (int i = 0; i < str.length(); i++) {
//i 依次表示字符串每一个索引
char c = str.charAt(i);
System.out.println(c);
}
截取字符串
String substring(int beginIndex,int endIndex) | 截取 |
String substring(int beginIndex) | 截取到末尾 |
注意点:包头不包尾,包左不包右
返回值是截取的字符串
//获取一个手机号
String phoneNumber = "13512394157";
//截取手机号码前面三位
String start = phoneNumber.substring(0, 3);
//截取手机号码后面四位
String end = phoneNumber.substring(7);
String result = start + "****" + end;
System.out.println(result);//135****4157
字符串替换
String replace(旧值,新值) 替换
注意点:只有返回值才是替换后的结果
//获取一个字符串
String str = "你玩的真好,TMD";
//将TMD替换为***
String result = str.replace("TMD", "***");
System.out.println(result);//你玩的真好,***
//获取一个字符串
String str = "你玩的真好,TMD,CBV";
//定义敏感词库
String[] arr = {"TMD","CNN","CBV","DFG"};
//将敏感词替换为***
for (int i = 0; i < arr.length; i++) {
str = str.replace(arr[i], "***");
}
System.out.println(str);//你玩的真好,***,***