一、字符类型
char是Java的一种基本数据类型,也是Java中的保留字。char在Java中占两个字节,无符号类型,是16位二进制Unicode字符。
char是类型表示的是字符,不是字符串;
char类型变量值只能用单引号来表示,不可使用双引号;
即表示单引号内的单个字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* @author shen
* @desc char test
* @date 2016年7月15日
*/
public class CharTest {
public static void main(String[] args) {

//单引号内的单个字符
char test = 'C';
System.out.println(test);

//数组
char cha[] = {'J','a','v','a'};
System.out.println(cha);

//Unicode编码,每一个字符用16位2进制数标识
char ucode = '\u4F60';//20320
char hao = '\u597d';//22909

System.out.print(ucode);
System.out.println(hao);

//转换成的对应值
System.out.println( ucode + hao);
}
}
由于其编码方式,编码方式最多有65536种,远不足以使用,以及在数据库存储的一些问题,在一般情况下,char在java中的实际使用比较少,也并不推荐使用。

这里写图片描述

二、字符串类
1、String
(1)String类表示字符串,是字符串常量(另:常量池),其值在创建后不能改变,因此Stirng对象创建后是不可变的,直至到被GC回收。
(2)创建String对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class StringTest {
public static void main(String[] args) {

String str1 = "Java";//直接创建

String str2 = new String();//面向对象基本创建方法,有时浪费内存
str2 = "C++";

String str3 = new String("C");//String类提供许多构造创建方法和其他方法,详JDK源码

System.out.println(str1+"--"+str2+"--"+str3);
}

}

(3)常见方法
I.获取字符串长度与某个字符

1
2
3
String str = "Java Code";
str.charAt(0);//获取某个下标对应字符
str.length();//字符串长度

II.str.compareTo方法
该方法的作用是比较两个字符串的大小,比较的原理是依次比较每个字符的字符编码。首先比较两个字符串的第一个字符,如果第一个字符串的字符编码大于第二个的字符串的字符编码,则返回大于0的值,如果小于则返回小于0的值,如果相等则比较后续的字符,如果两个字符串中的字符编码完全相同则返回0。

1
2
3
String data1 = "Javi";
String data2 = "Java";
int value = data1.compareTo(data2);

III.截取方法

1
2
3
String str = "Java Code";
String subStr = str.substring(7);//截取得到从某个下标之后的字符串
String sub = str.substring(0, 5);//截取区间之内的字符串

IV.连接方法

1
2
3
4
5
String st1 = "Java";
String st2 = "Code";
String st = st1.concat(st2);//连接组成一个新的字符串JavaCode
String stt = st1+st2;//更直接的做法JavaCode
String sst = st1+007;//参与连接中有字符串按字符串连接Java007

V.查找方法

1
2
3
String str = "Java Code";
int i = str.indexOf('o');//某个在字符串第一次出现的下标,不存在则返回-1
int j = str.indexOf('o', 7);//从第几个字符开始查,返回下标,不存在则返回-1

VI.replace方法
该方法的作用是替换字符串中所有指定的字符,然后生成一个新的字符串。经过该方法调用以后,原来的字符串不发生改变。

1
2
String str = "Java Code";
String s = str.replace("Java", "C++");//把Java代替成C++

VII.split方法
以特定的分隔符分隔字符串,生成一个 数组。

1
2
3
4
5
String data = "java,c++,c,c#";
String arr[] = data.split(",");
for(int k = 0;k<arr.length;k++){
System.out.println(arr[k]);
}

2、Stringbuffer
同样是字符串类,Stringbuffer 是字符串变量,实现方式与String有所不同,在进行处理字符串时不生成新的对象。在存储和操作字符串操作比String更合适。
I.字符串拼接

1
2
3
4
StringBuffer data = new StringBuffer("The");//创建对象
StringBuffer data1 = data.append(" Great");//拼接方法
String str = " Wall";
data1.append(str).append("!");

II.deleteCharAt方法

这里写图片描述
此外,字符串操作相关的方法还有insert插入、reverse反转倒序、setCharAt修改某个下标上的字符、trimToSize将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
3、Stringbuilder
Stringbuilder和StringBuffer基本类似,相关方法也一样

4、String、StringBuffer和Stringbuilder的具体区别
[以下复制,来自其他博主总结]
String:字符串常量
StringBuffer:字符创变量,线程安全
StringBuilder:字符创变量,非线程安全

如果要操作少量的数据用String
单线程操作字符串缓冲区下操作大量数据StringBuilder
多线程操作字符串缓冲区下操作大量数据StringBuffer
5、其他[引用]
I.字符串比较"=="与equal()方法
"==" 判断两个引用的是不是同一个内存地址(同一个物理对象).
equals 判断两个字符串的值是否相等.
除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法.
II.密码及其他问题上char[]优先于String原因
String是不可变对象, 意思是一旦创建,那么整个对象就不可改变. 即使新手觉得String引用变了,实际上只是(指针)引用指向了另一个(新的)对象.
而程序员可以明确地对字符数组进行修改,因此敏感信息(如密码)不容易在其他地方暴露(只要你用完后对char[]置0).