Java——API基础(String类和StringBuilder类)
一、API概述
API:应用程序编程接口(是一些包含了属性和方法的类)
Java API:指的就是JDK中提供各种功能的Java类
二、String类(在lang包下,不需要导包)
(一)概述
1.Java程序中,所有的双引号字符串,都是String这个类的对象
2.字符串是常量,它们的值在创建之后不能更改(平时对已有初始值的变量重新赋值,起的是替换的作用,而并非是修改)
3.String这个类在打印其对象名的时候,不会出现内存地址,而是该对象所记录的真实内容(与继承和Object类有关)
(二)String常见构造方法
1.public String()——创建一个空白字符串对象,不含有任何内容
public class text2 {public static void main(String[] args) {String s1 = new String();System.out.println(s1);}
}
//结果
//
2.public String(char[] chs)——根据字符数组的内容,来创建字符串对象
public class text2 {public static void main(String[] args) {char[] chs = {'a','b','c'};String s1 = new String(chs);System.out.println(s1);}
}
//结果
//abc
3.public String(String original)——根据传入的字符串内容,来创建字符串对象
public class text2 {public static void main(String[] args) {String s1 = new String("abei2");System.out.println(s1);}
}
//结果
//abei2
4.String s = "abc" ;——直接赋值的方式创建字符串对象,内容就是abc
(三)创建字符串对象的区别对比
1.以""方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串常量池中维护
!!!字符串常量池:当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在(不存在——创建;存在——不会重新创建,而是直接复用{即地址一样})
public class text2 {public static void main(String[] args) {String a = "aaa";String b = "aaa";System.out.println(a==b);}
}
//结果
//true
2.通过new创建的字符串对象,每一次new都会在堆内存申请一个内存空间,虽然内容相同,但是地址值不同
public class text2 {public static void main(String[] args) {char[] chs = {'a','b','c'};String a = new String(chs);String b = new String(chs);System.out.println(a==b);}
}
//结果
//false
(三)字符串拼接对比
1. 当变量与直接用引号生成的字符串拼接时
public class text2 {public static void main(String[] args) {String s1 = "abc";String s2 = "ab";String s3 = s2+"c";System.out.println(s1==s3);}
}
//结果
//false
①系统底层会自动创建一个StringBuilder对象(在堆内存中地址值1),然后再调用其append 方法完成拼接
②拼接后,再调用其toString方法转换为String类型(在堆内存中地址值2)
2.当引号生成的字符串之间拼接
public class text2 {public static void main(String[] args) {String s1 = "abc";String s2 = "a"+"b"+"c";System.out.println(s1==s2);}
}
//结果
//true
①java存在常量优化机制,在编译的时候,就会将“a”+“b”+“c”拼接为“abc”(在常量池中的内存地址)
(四)字符串比较值是否相同
1.equals()
①格式
boolean 变量名 = 字符串1 . equals (字符串2) ;
(返回布尔类型)
②举例
public class text2 {public static void main(String[] args) {String s1 = "abc";String s2 = "ABc";boolean ans = s1.equals(s2);System.out.println(ans);}
}
//结果
//false
2. equalsIgnoreCase()——忽略大小写
①格式
boolean 变量名 = 字符串1 . equalsIgnoreCase (字符串2);
②举例
public class text2 {public static void main(String[] args) {String s1 = "abc";String s2 = "ABc";boolean ans = s1.equalsIgnoreCase(s2);System.out.println(ans);}
}
//结果
//true
(五)遍历字符串
1.利用chatAt()方法逐一遍历
①格式
char 变量名 = 字符串名 . charAt (索引);
②举例
public class text2 {public static void main(String[] args) {String s1 = "abc";for (int i = 0; i < s1.length(); i++) {char ans= s1.charAt(i);System.out.println(ans);}}
}
//结果
//a
//b
//c
2. 利用public char [ ] toCharArray ( )将当前字符串拆分为字符数组并返回
①格式
char[ ] 数组名 = 字符串名 . toCharArray();
②举例
public class text2 {public static void main(String[] args) {String s1 = "abc";char[] a = s1.toCharArray();for (int i = 0; i < a.length; i++) {System.out.println(a[i]);}}
}
//结果
//a
//b
//c
(六)判断单字符是大写字母、小写字母还是数字
1.直接判断
①格式
大写字母:'A'<=单字符变量<='Z'
小写字母:'a'<=单字符变量<='z'
数字:'0'<=单字符变量<='9'
②举例
public class text2 {public static void main(String[] args) {String s1 = "aB99";char[] a = s1.toCharArray();for (int i = 0; i < a.length; i++) {char c = a[i];if (c <='Z' && c>='A') {System.out.println(c+"是大写字母");} else if (c<='z' && c>='a') {System.out.println(c+"是小写字母");} else if (c<='9' && c>='0') {System.out.println(c+"是数字");}}}
}
//结果
//a是小写字母
//B是大写字母
//9是数字
//9是数字
(七)字符串截取
1.String substring ( int beginIndex )
①格式
String 变量名 = 字符串名 . substring ( 索引 ) ;
注意:从传入的索引位置处,向后截取,一直截取到末尾,得到新的字符串并返回
②举例
public class text2 {public static void main(String[] args) {String s1 = "aB99";String s2 = s1.substring(2);System.out.println(s2);}
}
//结果
//99
2.String substring (int beginIndex , int endIndex )
①格式
String 变量名 = 字符串名 . substring ( 开始索引,结束索引);
注意:从beginIndex索引位置开始截取,截取到endIndex索引位置,得到新字符串并返回(包含头不包含尾)
②举例
public class text2 {public static void main(String[] args) {String s1 = "aB99";String s2 = s1.substring(1,3);System.out.println(s2);}
}
//结果
//B9
(八)替换值
1.String replace ( CharSequence targer , CharSequence replacement )
①格式
String 变量名 = 字符串名 . replace(被替换的旧值 ,替换的新值);
注意:将当前字符串中的target(被替换的旧值)使用replacement(替换的新值)进行替换,返回新的字符串。
②举例
public class text2 {public static void main(String[] args) {String s1 = "aB99666397";String s2 = s1.replace("666","***");System.out.println(s2);}
}
//结果
//aB99***397
(九)切割字符串
1.String [ ] split ( String regex )
①格式
String[ ] 变量名 = 字符串名 . split ("符号");
注意:根据传入的字符串作为规则进行切割,将切割后的内容存入字符串数组中,并将字符串数组返回
②举例
public class text2 {public static void main(String[] args) {String s1 = "aB//996,66,397";String [] arr = s1.split(",");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]);}}
}
//结果
//aB//99666397
三、StringBuilder类(在lang包下,不需要导包)
(一)概述
是一个可变的字符串类,我们可以把它看成是一个容器,可以提高字符串的操作效率。
(二)StringBuilder类常用的构造方法
1.public StringBuilder()——创建一个空白可变字符串对象,不含有任何内容
public class text2 {public static void main(String[] args) {StringBuilder sb = new StringBuilder();System.out.println(sb);}
}
//结果
//#空行
2.public StringBuilder(String str)——根据字符串的内容,来创建可变字符串对象
public class text2 {public static void main(String[] args) {StringBuilder sb = new StringBuilder("weknh");System.out.println(sb);}
}
//结果
//weknh
(三)StringBuilder类常用方法
1.public StringBuilder append (任意类型)——添加任意数据类型数据,将其转为字符串类型,并返回对象本身(无论赋值给多少个变量,都统一指向一个内存地址)
①格式
StringBuilder 变量名1 = new StringBuilder();
变量名 . append ( 任意类型 );
②举例
public class text2 {public static void main(String[] args) {StringBuilder sb = new StringBuilder();StringBuilder sb1 = sb.append(666);StringBuilder sb2 = sb.append("hello");sb.append(true);
// sb、sb1、sb2均指向同一个内存地址,所以打印出来的值相同System.out.println(sb);System.out.println(sb1);System.out.println(sb2);}
}
//结果
//666hellotrue
//666hellotrue
//666hellotrue
③注意
!!!链式编程:如果一个方法返回的是对象类型,对象就可以继续向下调用方法。
格式
变量名1 . append ( 任意类型 ) . append ( 任意类型 ) . append()...#多次调用append方法
举例
public class text2 {public static void main(String[] args) {StringBuilder sb = new StringBuilder();
// 因为StringBuilder类的append方法返回的是对象类型sb.append(8888).append("hello").append(false);System.out.println(sb);}
}
//结果
//8888hellofalse
2.public StringBuilder reverse()——返回相反的字符串序列
①格式
变量名1 . reverse ( );
②举例
public class text2 {public static void main(String[] args) {StringBuilder sb = new StringBuilder();
// 因为StringBuilder类的reverse方法返回的是对象类型sb.append(8888).append("hello").append(false);sb.reverse().append("yes");System.out.println(sb);}
}
//结果
//eslafolleh8888yes
③注意
!!!同样可以使用链式编程。
3.public int length()——返回长度(字符出现的个数)
①格式
变量名1 . length() ;
②举例
public class text2 {public static void main(String[] args) {StringBuilder sb = new StringBuilder();sb.append(8888).append("hello").append(false);sb.reverse().append("yes");System.out.println(sb.length());}
}
//结果
//17
4.public String toString()——通过toString就可以实现把StringBuilder转换为String
①格式
String 变量名2 = 变量名1 . toString ( ) ;
②举例
public class text2 {public static void main(String[] args) {StringBuilder sb = new StringBuilder();sb.append(8888).append("hello").append(false);sb.reverse().append("yes");String s = sb.toString();System.out.println(s);}
}
//结果
//eslafolleh8888yes
四、String类与StringBuilder类的区别
1.String类:内容是不可变的
2.StringBuilder类:内容是可变的