Java——字符串(黑马个人听课笔记)
1、API
API(Application Programming Interface):应用程序编辑接口
简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可。
Java API:指的就是JDK中提供的各种功能的Java类
这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。
API帮助文档:帮助开发人员更好的使用API和查询API的一个工具
2、字符串
有字符串参与的“+”都是拼接操作,产生一个新的字符串
String概述
java.lang.String类代表字符串,Java程序中的所有字符串文字(例如'abc")都为此类的对象。
String的注意点
字符串的内容是不会发生改变的,它的对象在创建后不能被更改。
下面的这种情况并不是改变了原来字符串的内容,而是创建了一个新的字符串,把新的字符串再赋值给前面的变量name
总结
3.创建String对象的两种方式
- 直接赋值
- new 构造方法
例:
public class StringDemo1 {
public static void main(String[] args) {
//1.使用直接赋值的方式获取一个字符串对象
String s1 ="abc";
System.out.println(s1);
//2.使用new的方式来获取一个字符串对象
//空参构造:可以获取一个空白的字符串对象
String s2 =new String();
System.out.println("@"+s2+"!");
//传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
String s3 = new String("abc");
System.out.println(s3);
//传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
//需求:我要修改字符串的内容:abc-->Qbc
//abc --> {'a','b','c'} --> {'Q','b','c'} --> "Qbc"
char[] chs ={'a','b','c','d'};
String s4 = new String(chs);
System.out.println(s4);
//传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
//应用场景:以后在网络当中传输的数据其实都是字节信息
//我们一般要把字节信息进行转换,转成字符串,此时就要用到这个构造了
byte[] bytes={97,98,99,100};
String s5 = new String(bytes);
System.out.println(s5);
}
}
内存
StringTable(串池):字符串常量池,用于存储字符串,只有直接赋值的字符串才存储在串池中,new关键字的不在此处
每new一次,创建一个新的空间,相同的字符串较多时,会浪费内存空间
4.Java的常用方法(比较)
字符串比较
- boolean equals方法(要比较的字符串) 完全一样结果才是true,否则为false
- boolean equalslgnoreCase(要比较的字符串) 忽略大小写的比较
例1:
public class StringDemo2 {
public static void main(String[] args) {
//1.创建两个字符串对象
String s1 = new String("abc");
String s2 = "Abc";
//2.==号比较
//基本数据类型:比的是数据值
//引用数据类型:比的是地址值
System.out.println(s1 == s2);
//3.比较字符串对象中的内容是否相等
boolean result1 = s1.equals(s2);
System.out.println(result1);
//4.比较字符串对象的内容是否相等,忽略大小写
//忽略大小写只能是英文状态下的
boolean result2 = s1.equalsIgnoreCase(s2);
System.out.println(result2);
}
}
例2:
import java.util.Scanner;
public class StringDemo3 {
public static void main(String[] args) {
//1.假设我现在键盘录入一个abc
Scanner sc = new Scanner(System.in);
System.out.println("Enter a string: ");
String str1 = sc.next();//abc 是new出来的
//2.代码中再定义一个字符串abc
String str2 ="abc";
//3.用==比较,这两者能一样吗?
System.out.println(str1==str2);
//结论:
//以后只要想比较字符串的内容,就必须要用String里面的方法
}
}
5.StringBuilder
StringBuilder概述
StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的
- 作用:提高字符串的操作效率
StringBuilder构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
StringBuilder常用方法
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 反转容器中的内容 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
例1:
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder();
//打印
//普及:
//因为StringBuilder是Java已经写好的类
//打印对象不是地址值而是属性值
System.out.println(sb);//打印结果为空
}
}
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("abc");
//打印
//普及:
//因为StringBuilder是Java已经写好的类
//打印对象不是地址值而是属性值
System.out.println(sb);//abc
}
}
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("abc");
//2.添加元素
sb.append(1);
sb.append(2.3);
sb.append(true);
//打印
//普及:
//因为StringBuilder是Java已经写好的类
//打印对象不是地址值而是属性值
System.out.println(sb);//abc12.3true
}
}
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("abc");
//反转
sb.reverse();
//打印
//普及:
//因为StringBuilder是Java已经写好的类
//打印对象不是地址值而是属性值
System.out.println(sb);//cba
}
}
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("abc");
//获取长度
int len = sb.length();
System.out.println(len);//3
//打印
//普及:
//因为StringBuilder是Java已经写好的类
//打印对象不是地址值而是属性值
System.out.println(sb);
}
}
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("abc");
//2.添加字符串
sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
sb.append("ddd");
System.out.println(sb);//aaabbbcccddd
//3.再把StringBuilder变回字符串
String str = sb.toString();
System.out.println(str);//aaabbbcccddd
}
}
链式编程:当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法
例2:
import java.util.Scanner;
public class StringBuilderDemo4 {
public static void main(String[] args) {
//链式编程:
//当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法
int len =getString().substring(1).replace("A","Q").length();
System.out.println(len);//2
}
public static String getString(){
Scanner sc = new Scanner(System.in);
System.out.println("Enter a string: ");
String str = sc.nextLine();//abc
return str;
}
}
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("abc");
//2.添加字符串
sb.append("aaa").append("bbb").append("ccc").append("ddd");
System.out.println(sb);//aaabbbcccddd
//3.再把StringBuilder变回字符串
String str = sb.toString();
System.out.println(str);//aaabbbcccddd
}
}
练习(对称字符串)
import java.util.Scanner;
public class StringBuilderDemo6 {
//使用StringBuilder的场景:
//1.字符串的拼接
//2.字符串的反转
public static void main(String[] args) {
//1.键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
//2.反转键盘录入的字符串
String result = new StringBuilder().append(str).reverse().toString();
//3.比较
if(str.equals(result)){
System.out.println("当前字符串是对称字符串");
}else{
System.out.println("当前字符串不是对称字符串");
}
}
}
练习(拼接字符串)
public class StringBuilderDemo7 {
public static void main(String[] args) {
//1.定义数组
int[] arr ={1,2,3};
//2.调用方法把数组变成字符串
String str = arrToString(arr);
System.out.println(str);//[1,2,3]
}
public static String arrToString(int[] arr) {
StringBuffer sb = new StringBuffer();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
sb.append(arr[i]);
}else{
sb.append(arr[i]).append(",");
}
}
sb.append("]");
return sb.toString();
}
}
6.StringJoiner
StringJoiner概述
- StringJoiner跟StingBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
- 作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用
- JDK8出现的
StringJoiner的构造方法
方法名 | 说明 |
---|---|
public StringJoiner(间隔符号) | 创建一个StringJoiner对象,指定拼接时的间隔符号 |
public StringJoiner(间隔符号,开始符号,结束符号) | 创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号 |
StringJoiner的成员方法
方法名 | 说明 |
---|---|
public StringJoiner add(添加的内容) | 添加数据,并返回对象本身 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 返回一个字符串(该字符串就是拼接之后的结果) |
例:
import java.util.StringJoiner;
public class StringJoinerDemo1 {
public static void main(String[] args) {
//1.创建一个对象,并指定中间的间隔符号
StringJoiner sj = new StringJoiner("---");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
//3.打印结果
System.out.println(sj);//aaa---bbb---ccc
}
}
import java.util.StringJoiner;
public class StringJoinerDemo2 {
public static void main(String[] args) {
//1.创建对象
StringJoiner sj = new StringJoiner(", ","[","]");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
int len = sj.length();
System.out.println(len);//15
//3.打印结果
System.out.println(sj);//[aaa, bbb, ccc]
String str=sj.toString();
System.out.println(str);//[aaa, bbb, ccc]
}
}
总结
7.字符串原理
7.1 字符串存储的内存原理
- 直接赋值会复用字符串常量池中的
- new出来不会复用,而是开辟一个新的空间
7.2 ==号比较的到底时什么?
- 基本数据类型比较数据值
- 引用数据类型比较地址值