从概念上来讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准Java类库的一个实例。
String str = "0123456789";
一、拼接
与绝大部分程序设计语言一样,java语言允许使用+连接两个字符串。例如
Stringstr = "0123456789";
Stringstr1 = "111213";
System.out.println(str+ str1); //0123456789111213
二、子串
String类的substring方法可以从一个较大的字符串中提取一个子串。例如
String str ="0123456789";
System.out.println(str.substring(2, 6)); //2345
三、检测字符串是否相等
检测字符串是否相等,因为String的特性,我们可以使用==来比较是否相等,但是因为某种原因,我们尽量使用equals方法,具体如下。
Stringstr2 = "111213";
String str3 = str1;
//两者都输出true,因为String类的特殊,编译器可以让String共享,咱么可以想象成各种
//字符串存在在公共的存储池中。两者指向同一内存地址,所以为true。
System.out.println(str1 ==str2);
System.out.println(str1 ==str3);
/*
* 注意:以后需要比较的时候尽量还是使用equals,因为使用==可能会造成糟糕的bug。
*/
System.out.println("1".equals(str3));
四、空串和Null串
空串是“”,长度为0的串,他是一个Java对象,有自己的长度和内容,而Null串,他没有长度也没有内容,所以判断字符串是否为空时,尽量应该这么操作。
Stringstr5 = "";
String str6 = null;
//两者的区别是前者在堆里有空间,后者没空间
/*
* 注意,判断字符串是否为空时,必须严格按照顺序,否则会因为字符串为空造成空指针的异常。
*/
System.out.println(str!= null && str.length() != 0);
五、 其他的常用方法举例
int compareTo(String anotherString) : 按照字典顺序,如果字符串位于other之前,返回一个负数,在other后边,返回一个正数,相等则返回0
boolean equals(Object anObject) :如果字符串与anObject相等,返回true。
boolean equalsIgnoreCase(String anotherString):如果字符串与anObject相等(忽略大
小写),返回true。
int indexOf(String str)
int indexOf(String str,int formIndex)
返回与字符串str匹配的第一个子串的开始位置。这个位置从0开始。如果不存在str,返回-1。
Int length() :返回字符串的长度
String replace(CharSequence oldString,CharSequence newString):返回一个新字符串。这个字符串用newString代替字符串中所有的oldString。
String toLoweCase() : 返回一个新字符串,将原始字符串大写改成小写
String toUppercase():返回一个新字符串,将原始字符串小写改成大写
String trim() :返回一个新字符串,他删除了原始字符串的头部和尾部。
实例和输出如下:
package qcby;
public class String2 {
public static void main(String[] args) {
String str1 = "0123456789";
String str2 = "HIJKLMN";
String str3 = "abcdefg";
String str4 = " OP Q R ST " ;
System.out.println("str1:" + str1);
System.out.println("str2:" + str2);
System.out.println("str3:" + str3);
System.out.println("str4:" + str4);
System.out.println("-------------");
//compareTo
System.out.print("1112.compareTo(str1):");
System.out.println("1112".compareTo(str1));
//equals
System.out.print("0123456789.equals(str1):");
System.out.println("0123456789".equals(str1));
//equalsIgnoreCase
System.out.print("ABCDEFG.equalsIgnoreCase(str2):");
System.out.println("ABCDEFG".equalsIgnoreCase(str2));
//indexOf
System.out.print("str1.indexOf(\"45\"):");
System.out.println(str1.indexOf("45"));
System.out.print("str1.indexOf(\"0\", 2):");
System.out.println(str1.indexOf("0", 2));
//length()
System.out.print("str2.length():");
System.out.println(str2.length());
//replace
System.out.print("str1.replace(\"4\", \"5\"):");
System.out.println(str1.replace("4", "5"));
//toUpperCase
System.out.print("str3.toUpperCase():");
System.out.println(str3.toUpperCase());
//toLowerCase
System.out.print("str2.toLowerCase():");
System.out.println(str2.toLowerCase());
//trim
System.out.print("str4.trim():");
System.out.println(str4.trim());
}
}
输出结果为:
str1:0123456789
str2:HIJKLMN
str3:abcdefg
str4: OP Q R ST
-------------
1112.compareTo(str1):1
0123456789.equals(str1):true
ABCDEFG.equalsIgnoreCase(str2):false
str1.indexOf("45"):4
str1.indexOf("0", 2):-1
str2.length():7
str1.replace("4", "5"):0123556789
str3.toUpperCase():ABCDEFG
str2.toLowerCase():hijklmn
str4.trim():OP Q R ST
六、 构建字符串
有些时候,需要有较短的字符串构建字符串,例如,按键或来自文件中的单词,采用字符串连接的方式达到此目的的效率较低。每次连接字符串,都会生成一个String对象,既耗时又浪费空间。所以使用StringBuilder类可以避免这个问题的发生。例如:
StringBuilder str7 = new StringBuilder();
str7.append("1111111111");
str7.append(true); //true也可以换成true.toString();
System.out.println(str7);
str7.setCharAt(1, 'a');
System.out.println(str7);
System.out.println(str7.insert(2, "==="));
输出结果为:
1111111111true
1a11111111true
1a===11111111true
七、 输入输出
1. 格式化输出
我们可以使用printf来输出,用format来做字符串输出,具体如下:
System.out.printf("12%d45%d789", 3,6);
123456789
用于printf的转换符如下
转换说明符 | 输出 |
%a | 浮点数、十六进制数字和p-记数法(C99) |
%A | 浮点数、十六进制数字和p-记数法(C99) |
%c | 一个字符 |
%d | 有符号十进制整数 |
%e | 浮点数、e-记数法 |
%E | 浮点数、E-记数法 |
%f | 浮点数、十进制记数法 |
%g | 根据数值不同自动选择%f或者%e。%e格式在指数小于-4或者大于等于精度时使用 |
%G | 根据数值不同自动选择%f或者%E。%E格式在指数小于-4或者大于等于精度时使用 |
%i | 有符号十进制整数(与%d相同) |
%o | 无符号八进制整数 |
%p | 指针(就是指地址) |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 使用十六进制数字0f的无符号十六进制整数 |
%X | 使用十六进制数字0F的无符号十六进制整数 |
%% | 打印一个百分号 |
这个最重要的应用就是用来打印时间。具体几个例子:
System.out.print("完整时间:");
System.out.printf("%tc",new Date());
System.out.println();
System.out.print("24小时间:");
System.out.printf("%tT",new Date());
System.out.println();
System.out.print("月的完整拼写:");
System.out.printf("%tB",new Date());
System.out.println();
System.out.print("时区:");
System.out.printf("%tZ",new Date());
完整时间:星期日 七月 08 18:26:32 CST 2018
24小时间:18:26:32
月的完整拼写:七月
时区:CST
这个是对应的表:
转换符 | 类型 | 举例 |
c | 完整的日期和时间 | Mon Feb 09 18:05:11 PST 2004 |
F | ISO 8061日期 | 2004-02-09 |
D | 美国格式的日期 | 02/09/2004 |
T | 24小时时间 | 18:03:23 |
r | 12小时时间 | 05:03:23 pm |
R | 24小时时间没有秒 | 18:05 |
Y | 4位数字的年(前面补0) | 2004 |
y | 年的后两位数字(前面补0) | 04 |
C | 年的前两位数字(前面补0) | 20 |
B | 月的完整拼写 | February |
b或h | 月的缩写 | Feb |
m | 两位数字的月(前面补0) | 02 |
d | 两位数字的日(前面补0) | 09 |
e | 两位数字的月(前面不补0) | 9 |
A | 星期几的完整拼写 | Monday |
a | 星期几的缩写 | Mon |
j | 三位数的年中的日子(前面补0),在001到366之间 | 069 |
H | 两位数字的小时(前面补0)。在0到23之间 | 18 |
k | 两位数字的小时(前面不补0)在0到23之间 | 8 |
I(大写的i) | 两位数字的小时(前面补0)。在0到12之间 | 06 |
l(小写的L) | 两位数字的小时(前面不补0),在0到12之间 | 6 |
M | 两位数字的分钟(前面补0) | 05 |
S | 两位数字的秒(前面补0) | 19 |
L | 三位数字的毫秒(前面补0) | 047 |
N | 九位数字的毫微秒(前面补0) | 047000000 |
P | 上午或者下午的大写标志 | PM |
p | 上午或者下午的小写标志 | pm |
z | 从GMT起。RFC822数字移位 | -0800 |
Z | 时区 | PST |
s | 从格林威治时间1970-01-01 00:00:00起的秒数 | 107884319 |
Q | 从格林威治时间1970-01-01 00:00:01起的毫秒数 | 107884319047 |