字符数据类型char

字符数据类型char用于表示单个字符
java中char通过Unicode值去比较两个字符的大小,也是通过Unicode值去判断字符是数字、字母还是其他

输入输出字符:

char ch2;
ch2 = input.nextLine().charAt(0);
System.out.println(ch2);

Character类一些字符的相关方法

Character.isDigit(ch)  //如果ch是数字,返回true
Character.isLetter(ch) //如果ch是字母,返回true
Character.isLetterOrDigit(ch) //如果ch是数字或字母,返回true
Character.isLowerCase(ch) //如果ch是小写字母,返回true
Character.isUpperCase(ch) //如果ch是大写字母,返回true
Character.toLowerCase(ch) //将字符转换成小写字母
Character.toUpperCase(ch) //将字符转换成大写字母

String类

String不是基本数据类型,而是一个引用类型,是Java库中一个预定义的类,java.lang.String。(java.lang里面的类都不用特意去写import,编译器自动引用了)
任何Java类都可以作为引用类型来声明一个变量。

一、字符串的构造

用String类来构造字符串:

1、用字符串字面值来创建:

String message = new String("Welcome to Java");

new String()开辟了一个空间,里面储存String对象"Welcome to Java",然后定义一个String变量message去对String对象进行引用,也就是说message里存储的是String对象的地址。
为了简单起见,经常使用术语“字符串”来表示String变量、String对象和字符串值

也可以将字符串字面值看做一个String对象,直接赋值给String变量。(java里只有值传递,此处的赋值指的是将地址值传递过去)

String message = "Welcome to Java";

这里"Welcome to Java"称作驻留字符串,可以理解为字符串中的常量,因为String对象是不可变的,内容不能被改变。
如果通过 message = "Java";来改变String对象的内容是不正确的,该条语句只会新开辟一个空间储存新的String对象"Java",
然后引用赋值给message,使message不再指向原来的"Welcome to Java"

String message1 = "Welcome to Java";
String message2 = new String("Welcome to Java");
这里message==message1(都是驻留字符串"Welcome to Java"的地址),
而!=message2(它开辟了一个新的空间,尽管内容相同但地址不同)

2、用字符数组创建:

char[] charArray = {'G','o','o','d',' ','D','a','y'};
String message = new String(charArray);

二、输入输出字符串

next():读取到空白字符结束
nextLine(): 读取到回车键结束

String s1 = input.next();
String s2 = input.nextLine();
System.out.println(s1+s2);

格式化控制输出:

String s1 = "ZYL";
System.out.printf("%s"+"0416",s1);
ZYL0416

三、一些String类的方法

首先!要清楚的是java里字符串一旦创建,内容就不能改变,即String对象是不可变的!所以这些方法都是返回一个源自原始字符串的新字符串,而原始字符串没有被改变!

1、获取字符串长度length()

2、获取字符charAt(index)

字符串s下标index的取值:0~s.length()-1

3、连接字符串concat(s1)

String s3 = s1.concat(s2);
等价于String s3 = s1 + s2;

4、返回一个新字符串,所有字母大写toUpperCase()

5、返回一个新字符串,所有字母小写toLowerCase()

6、返回一个新字符串,去掉两边的空白字符trim()

7、字符串比较

s.equals(s1)  若s字符串内容等于s1字符串内容,返回true
s.equalsIgnoreCase(s1)  不分大小写比较两个字符串内容
s.compareTo(s1)   s>s1返回正整数,小于返回负整数,等于返回0
s.compareToIgnoreCase(s1)  不分大小写比较字符串大小
s.startsWith(prefix)  如果字符串以特定的前缀开始,返回true
s.endsWith(suffix)  如果字符串以特定的后缀结束,返回true
s.contains(s1)  如果s1是s的子字符串,返回true

8、获得子字符串substring

返回从下标beginIndex的字符开始到字符串结尾的子字符串
substring(beginIndex)  

返回从下标beginIndex到下标endIndex-1的子字符串
substring(beginIndex,endIndex)

9、查找字符或字符串indexOf

indexOf(ch)  返回第一个ch的下标,没有则返回-1
lastIndexOf(ch)  返回最后一个ch的下标

indexOf(ch,fromIndex)  返回fromIndex之后的第一个ch的下标
lastIndexOf(ch,fromIndex)  返回fromIndex之前的最后一个ch的下标

indexOf(s)  返回第一个字符串s的首字母的下标
lastIndexOf(s)  返回最后一个字符串s的首字母的下标

indexOf(s,fromIndex)
lastIndexOf(s,fromIndex)

建议indexOf和substring搭配食用更佳

10、 替换字符串replace

String message = "Welcome";

//replace(oldChar:char,newChar:char):String
System.out.println(message.replace('e','E'));  
WElcomE

//replace(oldString:String,newString:String):String 或者是replaceAll
System.out.println(message.replace("Wel",""));
come

//replaceFirst(oldString: String,newString: String): String
System.out.println(message.replaceFirst("e","AB"));
WABlcome;

12、拆分字符串split

//split(delimiter: String):String[]
String[] tokens = "Java#HTML#PERl".split("#");
for(int i = 0;i<tokens.length;i++){
	System.out.print(tokens[i] + " ");
}

Java HTML Perl

13、将字符串转换成数组、数值

i.将字符串转换成字符数组

toCharArray()
// toCharArray():Char[]
char[] chars = "ZYLO416".toCharArray();
for(int i = 0;i<chars.length;i++){
	System.out.print(chars[i]+" ");
}
Z Y L 0 4 1 6
getChars(srcBegin:int,srcEnd:int,dst:char[],dstBegin:int):void

将字符串中下标从srcBegin到srcEnd-1的子串复制到字符数组dst中下标从dstBegin开始的位置,要保证子串复制过去之后不会超过原来字符数组的长度,否则编译错误

//getChars(srcBegin:int,srcEnd:int,dst:char[],dstBegin:int):void

char[] dst = {'J','A','V','A',*'1','3','0','1*'};
"CS*3720*".getChars(2,6,dst,4);
for(int i = 0;i<dst.length;i++){
	System.out.print(dst[i]+" ");
}
J A V A 3 7 2 0

ii.将字符串转换成数值parseDouble、parseInt

Integer类中的parseInt方法将数值字符串转换成int值
Double类中的parseDouble方法将数值字符转换成double值

//Integer.parseInt(s:String,radix:int):int
//Double.parseDouble(s:String,radix:int):double
将数值字符串s按照radix进制去转换成int值:
Integer.parseInt("11") return 11;  //默认按照十进制转
Integer.parseInt("11",2) return 3;
Integer.parseInt("12",8) return 10;
Integer.parseInt("13",10) return 13;
Integer.parseInt("1A",16) return 26;

Integer.parseInt("12",2)会发生运行时错误,因为12不是二进制数

另插一嘴,String类的format方法可以进行转换

//将十进制数字26转换成十六进制数1A
String.format("%x",26)  return 1A;

14、将字符、字符数组或数值转换成字符串

i.直接使用字符串的连接操作符 ‘+’ 将字符或者数字转换为字符串

System.out.println("ZYL"+416+'!');
ZYL416!

ii.用构造方法String(char[])将字符数组转换成字符串

String str = new String(new char[]{'J','a','v','a'});

iii.用String类的重载静态valueOf方法

//valueOf(c:char):String
char ch = 'L';
String message2 = message.valueOf(ch);
System.out.println(message2);
L

//valueOf(data: char[]): String
char[] str = {'Z','Y','L'};
System.out.println(message.valueOf(str));
ZYL

//valueOf(d:double):String
System.out.println(message.valueOf(4.16));
4.16

//valueOf(f:float): String
//valueOf(i: int): String
//valueOf(l: long): String
//valueOf(b: boolean): String
boolean b = true;
System.out.println(message.valueOf(b));
true

15、格式化字符串format

String类包含静态方法format,可以创建一个格式化的字符串,与格式化输出printf类似

//format方法返回一个格式化的字符串
String s = String.format("%7.2f%6d%-4s",45.556,14,"AB");
System.out.println(s);
  45.56    14AB  
//printf方法显示一个格式化的字符串
System.out.printf("%7.2f%6d%-4s",45.556,14,"AB");
  45.56    14AB

16、通过正则表达式来进行模式匹配、替换和拆分

正则表达式的学习 一些举例:

String s = "a+b$#c".replaceAll("[$+#]","NNN");
System.out.println(s);
aNNNbNNNNNNc

此处正则表达式为[KaTeX parse error: Expected 'EOF', got '#' at position 2: +#̲],指定匹配、+、#这三个符号,所以通过replace这三个符号都替换成NNN

String[] tokens = "Java,C?C#,C++".split("[,?]");
for(int i = 0;i<tokens.length;i++){
	System.out.print(tokens[i]+" ");
}
Java C C# C++

此处正则表达式为[,?],指定匹配,、?这两个符号,通过split方法将字符串分割