1. String类
1.1. String类的特点
第二天学习Java语法的时候,学习了Java中的常量:
数字(整数和小数)、字符(需要使用单引号引用)、字符串(双引号引用)、布尔(true和false)、null。
数字、字符、布尔数据都属于Java中的基本数据类型。
而字符串它属于Java中提供的引用类型(类类型),在Java中要表示一个字符串,需要使用一个类来描述。
Java这门语言,它会把我们身边的任何事物,以及可能现实生活中根本就没有东西都能够抽象成一个类,然后使用这个类描述这个事物。我们可以在Java中使用这个类,以及它中的行为(功能)。
字符串它也属于一类事物,用来表示某些数据信息,而Java也提供了一个类对字符串这类数据进行了描述。
Java中使用String这个类,表示生活中存在的所有字符串这类事物。
如果我们在java 程序需要操作字符串数据,第一印象应该是来找String这个类。
查阅api中描述的String类,知道他的父类是Object,同时看到String类是被final修饰的,String类是一个最终的类,不能被继承。
在Java程序中只要使用双引号书写的所有字符串数据都是String这个类的一个实例对象。
String s = “abc”; 这里书写的abc字符串它就是一个String类型的对象。
当在程序中只要我们书写了字符串数据,这些数据就是String的一个实例对象,但是这个对象又称为常量,它保存的位置是方法区的字符串常量池中。
1.2. String类构造函数
String对象它本身就是一个常量,双引号引用起来的任何数据,就是String的一个对象,可是Java依然还给String提供了对应的构造方法。
使用双引号可以把数据直接转成String对象,但是有时程序会出现的数据并不能直接使用双引号括起来,这时就需要些代码对其中的数据进行简单的处理,才能得到对应的字符串,String类中提供的有参数的构造方法,可以方便的把某些数组中的数据直接转成字符串。
把字节数组转成字符串:
/*
* 演示String类的构造方法
*/
public class StringConstructor {
public static void main(String[] args) {
method_2();
}
//演示把字节数组转成字符串对象
public static void method_2() {
byte[] b = {97,98,99,100,101};
//把字节数组中的数字对应的字符转成字符串对象
String s = new String(b);
System.out.println(s);
/*
* String(byte[] bytes, int offset, int length)
* 把指定的字节数组中的数据,从offset位置开始转,共计转length个
*/
String s2 = new String(b,1,3);
System.out.println(s2);
}
//空参数的构造方法
public static void method_1() {
//创建了一个字符串对象,但是这个对象中没有封装任何数据内容
String s = new String();
System.out.println(s);
}
}
//面试题目
public static void method_4() {
/*
* String s = new String("abcde");
* 有2个对象,第一个是通过new关键字创建出来的对象,在堆中
* 第二个是双引号引用的字符串对象在方法区的字符串常量池中
*/
String s = new String("abcde");
String s2 = "abcde";
System.out.println(s);
System.out.println(s2);
System.out.println(s == s2);
}
//演示把字符数组转成字符串
public static void method_3() {
char[] c = {'A',66,'C'};
//把字符数组转成字符串
String s = new String(c);
System.out.println(s);
}
1.3. String类常用方法
1.3.1. 介绍如何查阅一个类中的方法
字符串排序:没有
当我们猜测到String类中应该提供某些功能之后,接着需要到String的api方法摘要中查阅到底有没有这个方法:
查阅方法的基本规则:
1、查看这个方法的返回值和我们猜测的是否一致
2、查看方法的参数列表和当前猜测是否一致。
1.3.2. 获取指定位置上的字符
获取指定位置上的字符数据:
1、猜测方法的返回值是char
2、猜测参数:位置index
String类中提供的获取指定位置上的字符方法是charAt
需求:判断指定的字符在字符串中出现的次数。
1.3.3. 字符串转成数组(字节和字符)
字符串的等价转换:
转换byte数组或者char数组
返回值应该是byte数组,或者char数组。
高级for循环(foreach):
1.3.4. 大小写转换
转成大写或者小写
1.3.5. 字符串中的获取功能
获取字符串的长度:
获取其中一部分字符数据:
获取指定字符或者字符串在其他字符串中出现的位置:
需求:统计一个子串在原串中出现的次数。
1.3.6. 比较方法
比较2个字符串大小:
一般比较2个数据的大小,返回的情况有三种:
1、 第一个数据比第二个数据大
2、 第一个数据比第二个数据小
3、 第一个数据和第二个数据相等
针对这类问题,一般方法返回的是一个int值:
如果第一个数据大于了第二个数据,返回的是大于零的数。
如果第一个数据小于了第二个数据,返回的是小于零的数。
如果第一个数据等于第二个数据,返回的是零。
字符串提供equals方法:
String类中的equals方法它仅仅是在比较2个字符串是否相同,但无法确定2个字符串的大小。
compareTo方法是在比较2个串到底大小关系。
1.3.7. 判断方法
判断字符串中是否包含指定的其他数据:
判断字符串是否以指定的内容开始:
判断字符串是否以指定的内容结尾:
判断字符串中的内容是否为空,注意不是null.
1.3.8. 其他方法
它的功能是把其他的数据转成字符串。
1.4. String类方法练习
1.4.1. 对字符串中的单个字符数据进行排序
/*
* 需要:对字符串中的数据进行排序
* 分析:
* 排序的要求:把数据先存储到数组中。然后可以使用数组对其中的元素进行排序
* 排序:选择排序。
*
* 步骤:
* 1、把字符串转成数组(字符)。
* 2、对字符数组进行排序
* 3、把排序后的数组转成字符串
* 4、打印
*/
public class StringTest {
public static void main(String[] args) {
method_2();
}
//简单实现方案
public static void method_2() {
String s = "aybxzpomq1lc";
char[] cs = s.toCharArray();
//数组排序
Arrays.sort(cs);
//把数组转成字符串
String s2 = Arrays.toString(cs);
System.out.println(s2);
}
//对字符串中的数据进行排序
public static void method_1() {
//指定的字符串
String s = "aybxzpomq1lc";
//把字符串换成字符数组
char[] cs = s.toCharArray();
//排序
for( int i = 0 ; i < cs.length -1 ; i++ ){
for( int j = i + 1 ; j < cs.length ; j ++ ){
//判断
if( cs[i] > cs[j] ){
char temp = cs[i];
cs[i] = cs[j];
cs[j] = temp;
}
}
}
//把字符数组转成字符串
String s2 = new String(cs);
System.out.println(s2);
}
}
1.4.2. 统计指定字符在字符串中出现的次数
/*
* 需求:统计指定字符在字符串中出现的次数
* 分析:
* 定义变量记录次数(计数器)。
* 遍历字符串。取出字符串中的每个字符,和指定的需要统计的字符进行判断
* 如果相同计数器+1,直到循环结束,统计出当前这个字符出现的次数
*
*/
public class StringTest2 {
public static void main(String[] args) {
String s = "bfsidjlk";
char ch = 'a';
int count = getCharCount(s,ch);
System.out.println(count);
}
//统计字符串中指定的字符个数
public static int getCharCount(String s, char key) {
//定义一个计数器
int count = 0;
for( int i = 0 ; i < s.length() ; i++ ){
//取出字符串中的字符
char c = s.charAt(i);
//判断当前这个字符和指定的字符是否相同
if( c == key ){
//判断成立说明当前取出的这个字符和需要统计的字符相同,计数
count++;
}
}
return count;
}
}
拓展题目:
统计一个字符串中:字母(大小写)字符、数字字符、其他字符的个数。
1.4.3. 对字符串按照指定的内容切割,然后排序
切割:”asdithfhsdlitjfklsdjfitlkjsdklitAjdslkf”
/*
* 需求:对字符串按照指定的内容切割,然后排序
* "asdithfhsdlitjfklsdjfitlkjsdklitAjdslkf"
*/
public class StringTest3 {
public static void main(String[] args) {
method_2();
}
// 字符串切割之后排序
public static void method_2() {
//String s = "asdithfhsdlitjfklsdjfitlkjsdklitAjdslkf";
//String[] strs = s.split("it");
String[] strs = {"张三","李四","王五","张三三","李思思","王五吴"};
for( int i = 0 ; i < strs.length - 1 ; i++ ){
for( int j = i+1 ; j <strs.length ; j++ ){
/*
* 判断2个字符串的大小
* strs数组的空间中保存的是不同的字符串对象,
* 而对字符串对象进行大小比较,必须调用String类中的compareTo方法
*/
if( strs[i].compareTo(strs[j]) > 0 ){
String temp = strs[i];
strs[i] = strs[j];
strs[j] = temp;
}
}
}
//Arrays.sort(strs);
for (int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
// 演示切割
public static void method_1() {
String s = "asdithfhsdlitjfklsdjfitlkjsdklitAjdslkf";
String[] strs = s.split("it");
System.out.println(strs.length);
for (int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
}
1.4.4. 把一个字符串按照长度递减截取
/*
* 需求:把一个字符串按照长度递减截取
* "abcde"
*
* "abcde"
* 0-length
* 0,5
*
* "abcd" "bcde"
* 0-length-1 1-length
* 0,4 1,5
*
* "abc" "bcd" "cde"
* 0-length-2 1-length-1 2-length
* 0,3 1,4 2,5
*
* "ab" "bc" "cd" "de"
* 0,2 1,3 2,4 3,5
*
* "a" "b" "c" "d" "e"
*
* substring(beginIndex ,endIndex)
*/
public class StringTest4 {
public static void main(String[] args) {
String s = "abcde";
//控制共计能够截取的次数
for( int i = 0 ; i < s.length() ; i++ ){
//提供每次截取的过程中,需要截取出多少个子串
//j提供截取的开始位置,k截取的结束位置
for(int j = 0, k = s.length() - i ; k <= s.length() ; j++,k++ ){
String sub = s.substring(j, k);
System.out.print(sub+"\t");
}
System.out.println();
}
}
}
拓展题:
有2个字符串,找出其中较短的字符串,然后对较短的字符串进行长度递减方式截取,当前截取到的字符串在长串中存在的时候,停止截取。
“abcitcastdef”
“aitcastz”
找出2个串中长度最长的子串。
1.5. String类方法总结
1、获取方法
char charAt(int index) 获取指定位置上的字符
int indexOf(int ch) 获取当前字符第一次出现的位置
int indexOf(int ch , int fromIndex) 获取当前字符从指定位置开始第一次出现的位置
int indexOf(String s ) 获取当前字符串第一次出现的位置
int indexOf(String s , int fromIndex ) 获取当前字符串从指定位置第一次出现的位置
int lastIndexOf( int ch ) 获取当前字符从后往前第一次出现的位置
int length() 获取字符串的长度
String substring(int beginIndex ); 从指定位置截取到字符串末尾
String subString( int beginIndex , int endIndex )从beginIndex截取到endIndex,但不包含endIndex
2、判断方法
int compareTo(String antherString )方法 比较2个字符串大小
boolean equals(String antherString) 判断2个字符串是否相同
boolean startsWith(String prefix) 判断字符串是否以指定的字符串开始
boolean endsWith( String suffix ) 判断字符串是否以指定的字符串结尾
boolean isEmpty() 判断字符串是否是空串
boolean contains(String antherString ) 判断当前字符串是否包含指定的字符串
3、 转换方法
toUpperCase 转成大写
toLowerCase 转成小写
getBytes 转成字节数组
toCharArray 转成字符数组
valueOf 把其他的数据转成字符串
4、其他方法
trim 去除字符串2端的空格
split 根据指定的内容切割