String类
声明字符串
字符串必须包含在一对双引号("")之内。
"23.23"、"ABCDEF"、"你好"
可以用以下语法格式来声明字符串变量
String str;
注意:声明字符串变量必须经过初始化才能使用,否则编译器会报出“变量未初始化错误”
创建字符串
在java语言中,将字符串作为对象来处理,因此可以像创建其他类对象一样来创建字符串对象。创建对象要使用类的构造方法。
String类的构造方法如下
1.String(char a[])
char a[] = {'g','o','o','d'};
String = new String(a);
或者
String s = new String("good");
2.String(char a[],int offset,int length)
char a[] = {'s','t','u','d','e','n','t'};
String s = new Stirng(a,2,4);
或者
String s = new String("udent");
3.String(char [] value)
该构造方法可分配一个新的String对象,使其表示字符数组参数中所有元素连结的结果
char a[] = {'s','t','u','d','e','n','t'};
String s = new String(a);
或者
String s = new String("student");
还可以通过将字符串常量的引用赋值给一个字符串变量俩创建字符串
String str1,str2;
str1 = "We are students";
str2 = "We are students";
连接字符串
eg.先连接一副对联的上、下联,再分行输出在控制台上
public class Join {
public static void main(String[] args) {
String s1 = new String("春色绿万里");
String s2 = new String("马蹄香万家");
String s = s1 + "\n" + s2;
System.out.println(s);
}
}
连接其他数据类型
eg.统计每天阅读和上机时间
public class Link {
public static void main(String[] args) {
int booktime = 4;
float practice = 2.5f;
System.out.println("我每天花费" + booktime + "小时学习;" + practice + "小时上机练习");
}
}
注意:只要“+”运算符的一个操作数是字符串,编译器就会将另一个操作数传唤成字符串类型,所以应谨慎地将其他数据类型的数据与字符串相连接。
获取字符串信息
获取字符串长度
使用String类的length()方法可获取声明的字符串对象的长度
str.length(); //其中str为字符串对象
字符串查找
String类提供了两种查找字符串的方法,即indexOf()与lastInsexOf()方法。
-
indexOf(String s)
该方法用于返回参数字符串s在指定字符串中首次出现的索引位置。调用时从当前字符开始,搜索s的位置,如果没有返回值则返回-1;
Stirng str = "We are student";
int size = str.indexOf("a");
-
lastIndexOf(String str)
该方法用于返回值指定字符串最火一次出现的索引位置。如果没有检索到则返回-1;
str.lastIndexOf(substr);
用两种方法判断字符串长度
public class Test {
public static void main(String[] args) {
String str = "We are students";
int size = str.lastIndexOf("");
System.out.println("空字符串在字符串str中的位置是:" + size);
System.out.println("字符串str的长度是:" + str.length());
}
}
获取指定索引位置的字符
使用charAt方法可将指定索引处的字符返回。
str.charAt(int index);
查看指定索引位置上的字符
public class Ref {
public static void main(String[] args) {
String str = "hello world";
char mychar = str.charAt(6);
System.out.println("字符串str中索引位置是6的字符为:" + mychar);
}
}
字符串操作
通过String类的substring()方法可对字符串进行截取。下标从0开始进行截取。
获取字符串
1.substring(int beginIndex)
eg.
String str = "Hello world";
String substr = str.substring(3);
注意:空格占用一个索引位置
2.substring(int beginIndex,int endIndex)
该方法返回的是从字符串子啊整个字符串的结束位置
public class Subs4 {
public static void main(String[] args) {
String str = "《将进酒》:李白(唐)";
String substr = str.substring(6,8);
System.out.println("《将进酒》的作者是:" + substr);
}
}
去除空格
trim()方法返回字符串副本,忽略前导空格和尾部空格
str.trim()
//去掉字符串串首和串尾空格
public class Blak {
public static void main(String[] args) {
String str = " Java class ";
System.out.println("字符串原来的长度为:" + str.length());
System.out.println("去掉空格后的长度为:" + str.trim().length());
}
}
字符串替换
replace()方法可实现将指定的字符或字符串替换成新的字符或字符串
str.replace(CharSequence target,CharSequence replacement)
//将字符串中的a替换成A
public class NewStr {
public static void main(String[] args) {
String str = "address";
String newstr = str.replace("a","A");
System.out.println(newstr);
}
}
注意:如果旧字符串中的替换字符重复出现,则replace()方法会将所有的字符替换
判断字符串的开始与结尾
startWith()方法和endsWith()方法分别用于判断字符串是否以指定的内容开始或结束。
1.startWith()方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。
str.startWith(String prefix)
2.endsWith()方法
该方法用于判断当前字符串是否为以给定的子字符串结束
str.endsWith(Stirng suffix)
//判断字符串是否以指定的内容开始或结束
public class StartOrEnd {
public static void main(String[] args) {
String num1 = "22045612";
String num2 = "21304578";
boolean b = num1.startsWith("22");
boolean b2 = num2.endsWith("78");
System.out.println("字符串num1是以‘22’开始的吗?" + b);
System.out.println("字符串num2是以‘78’结尾的吗?" + b2);
}
}
判断字符串是否相等
不能使用比较运算符比较字符串是否相等
1.equals()方法
如果亮哥哥字符串具有相同的字符和长度,使用该方法时返回的值为true
str.eqauls(String otherstr)
2.eqaulsIgnoreCase()方法
1中的eqauls()方法时区分大小写的,而该方法是忽略大小写进行比较的
eqaulsIgnoreCase(String Otherstr)
eg.判断“abc”与“ABC”是否相等
public class Opinion {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("ABC");
boolean b = s1.equals(s2);
boolean b2 = s2.equalsIgnoreCase(s2);
System.out.println(b);
System.out.println(b2);
}
}
按字典顺序比较两个字符串
compareTo()方法是使用字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值进行比较
str.compareTo(String otherstr)
eg.
//判断字母b的位置
public class Wordbook {
public static void main(String[] args) {
String str1 = new String("b");
String str2 = new String("a");
String str3 = new String("c");
System.out.println(str1 + "compareTo" + str2 + str1.compareTo(str2));
System.out.println(str1 + "compareTo" + str3 + str1.compareTo(str3));
}
}
字母大小写转换
String类的toLowerCase()方法可将字符串中的所有大写字母改写成小写字母
String类的toUpperCase()方法可将字符串中的所有小写字母改写成大写字母
eg.
//字母大小写转换
public class UpAndLower {
public static void main(String[] args) {
String str = new String("Oh My God");
String newstr = str.toLowerCase();
String newstr2 = str.toUpperCase();
System.out.println(newstr);
System.out.println(newstr2);
}
}
字符串分割
使用split()方法可以使字符串按指定的分割字符或字符串进行分割,并将结果存储在字符串数组中
1.split(String sign)
没有统一的对字符进行分割的符号。如果想定义多个分隔符,可以使用“|”eg.“,|=”表示分隔符为“,”和“|”
2.split(String sign,int limit)
该方法可根据给定的分割符进行拆分,并限定拆分次数。语法如下:
str.split(String sign,int limit)
eg.
//按要求分割“192.167.0.1”
public class Division {
public static void main(String[] args) {
String str = "192.168.0.1";
String[] firstArray = str.split("\\.");
String[] secondArray = str.split("\\.",2);
System.out.println("str的原值为:[" + str + "]");
System.out.println("全部分割的结果:");
for(String a : firstArray){
System.out.print("[" + a + "]");
}
System.out.println();
System.out.println("分割两次的结果:");
for(String a : secondArray){
System.out.print("[" + a + "]");
}
System.out.println();
}
}
格式化字符串
String类的静态format()方法用于创建格式化的字符串,以下是format()方法的两种重载形式:
1.format(String format,Object...args)
str.format(String format,Object...args)
2.format(Local I,String format,Object...args)
str.format(Local I,String format,Object...args)
日期和时间字符串格式化
日期格式化
Data data = new Data(); //创建Data对象data
String s = String.format("%te",data); //通过format()方法对data进行初始化
转换符 | 说明 | 示例 |
%te | 一月中的某一天(1~31) | 2 |
%tb | 指定语言环境的月份简称 | Feb(英文)、二月(中文) |
%tB | 指定语言环境的月份全称 | February(英文)、二月(中文) |
%tA | 指定语言环境的星期几全称 | Monday(英文)、星期一(中文) |
%ta | 指定语言环境的星期几简称 | Mon(英文)、星期一(中文) |
%tc | 包括全部日期和时间信息 | 星期二 三月 25 13:37:22 CST 2008 |
%tY | 4位年份 | 2008 |
%tj | 一年中的第几天(001~366) | 085 |
%tm | 月份 | 03 |
%td | 一个月中的第几天(1~31) | 02 |
%ty | 2位月份 | 08 |
eg.按照格式输出今年的年、月、日
import java.util.Date;
public class Eval {
public static void main(String[] args) {
Date date = new Date();
String year = String.format("%tY",date);
String month = String.format("%tB",date);
String day = String.format("%td",date);
System.out.println("今年是:" + year + "年");
System.out.println("现在是:" + month);
System.out.println("今天是:" + day + "号");
}
}
时间格式化
时间格式转换符表
转换符 | 说明 | 示例 |
%tH | 2位数字的24时制的小时(00~23) | 14 |
%tI | 2位数字的12时制的小时(01~12) | 05 |
%tk | 2位数字的24时制的小时(0~23) | 5 |
%tl | 2位数字的12时制的小时(1~12) | 10 |
%tM | 2位数字的分钟数(00~59) | 05 |
%tS | 2位数字的秒数(00~60) | 12 |
%tL | 3位数字的毫秒数(000~999) | 920 |
%tN | 9位数字的毫秒数(000000000~999999999) | 062000000 |
%tp | 指定语言环境上下午或者下午标记 | 下午(中文)、pm(英文) |
%tz | 相对于GMT RFC82格式的数字时区偏移量 | +0800 |
%tZ | 时区缩写形式的字符串 | CST |
%ts | 1970-01-01 00:00:00 至现在经过的秒数 | 120426646 |
%tQ | 1970-01-01 00:00:00 至现在经过的秒毫数 | 1206426737453 |
//按照下列格式输出当下的时、分、秒
import java.util.Date;
public class GetData {
public static void main(String[] args) {
Date date = new Date();
String hour = String.format("%tH",date);
String minute = String.format("%tM",date);
String second = String.format("%tS",date);
System.out.println("现在是:" + hour + "时" + minute + "分" + second + "秒");
}
}
格式化常见的日期时间组合
转换符 | 说明 | 示例 |
%tF | “年-月-日”格式(4位年份) | 2008-03-25 |
%tD | “月-日-年”格式(2位年份) | 03/25/08 |
%tc | 全部日期和时间信息 | 星期二 三月 25 15:20:00 CST 2008 |
%tr | “时:分:秒PM(AM)”格式(12时制) | 03:22:06下午 |
%tT | “时:分:秒”格式(24时制) | 15:23:06 |
%tR | “时:分”格式(24时制) | 15:25 |
eg.按照格式输出当下的年、月、日
import java.util.Date;
public class DataAndTime {
public static void main(String[] args) {
Date date = new Date();
String time = String.format("%tc",date);
String form = String.format("%tF",date);
System.out.println("全部的时间信息是:"+time);
System.out.println("年-月-日格式:" + form);
}
}
常规类型格式化
转换符 | 说明 | 示例 |
%b、%B | 结果被格式化为布尔类型 | true |
%h、%H | 结果被格式化为散列码 | A05A5198 |
%s、%S | 结果被格式化为字符串类型 | “abcd” |
%c、%C | 结果被格式化为字符类型 | ‘a’ |
%d | 结果被格式化为十进制整数 | 40 |
%x、%X | 结果被格式化为八进制整数 | 11 |
%e | 结构被格式化为十六进制整数 | 4b1 |
%a | 结果被格式化为带有效位数和指数的十六进制浮点数 | 1.700000e+01 |
%n | 结果为特定于平台的行分隔符 | |
%% | 结果为字面值“%” | % |
eg.使用转换符获取表达式的结果
public class General {
public static void main(String[] args) {
String str = String.format("%d",400/2);
String str2 = String.format("%b",3>5);
String str3 = String.format("%x",200);
System.out.println("400的一半是:" + str);
System.out.println("3 > 5正确吗?" + str2);
System.out.println("200的十六进制" + str3);
}
}
使用正则表达式
元字符 | 正则表达式中的写法 | 意义 |
. | . | 任意一个字符 |
\d | \\d | 0~9的任何一个数字 |
\D | \\D | 任何一个非数字字符 |
\s | \\s | 空白字符、如'\t'、'\n' |
\S | \\S | 非空白字符 |
\w | \\w | 可用于标识符的字符,但不包括美金符号 |
\W | \\W | 不可用于标识符的字符 |
\p{Lower} | \\p{Lower} | 小写字母a~z |
\p{Upper} | \\p{Upper} | 大写字母A~Z |
\p{ASCII} | \\p{ASCII} | ASCII字符 |
\p{Alpha} | \\p{Alpha} | 字母字符 |
\p{Digit} | \\p{Digit} | 十进制数字,即0~9 |
\p{Alnum} | \\p{Alnum} | 数字或字母字符 |
\p{Punct} | \\p{Punct} | 标点字符 |
\p{Graph} | \\p{Graph} | 标点字符:[\p{Alnum}\p{Punct}] |
\p{Print} | \\p{Print} | 可见字符:[\p{Graph}\x20] |
\p{Blank] | \\p{Blank} | 可打印字符:[\p{}Graph] |
\p{Cntrl} | \\p{Cntrl} | 控制字符:[\x00-\x1F\x7F] |
eg.验证E-mail地址是否“合法”
public class Judge {
public static void main(String[] args) {
String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
String str1 = "aaa@";
String str2 = "aaaaa";
String str3 = "1111@111ffyu.dfg.com";
if(str1.matches(regex)){
System.out.println(str1 + "是一个合法的E-mail地址格式");
}
if(str2.matches(regex)){
System.out.println(str2 + "是一个合法的E-mail地址格式");
}
if(str3.matches(regex)){
System.out.println(str3 + "是一个合法的E-mail地址格式");
}
}
}
字符串生成器
eg.效率比拼
public class Jerque {
public static void main(String[] args) {
String str = "";
long starTime = System.currentTimeMillis();
for(int i = 0;i < 10000;i ++){
str = str + i;
}
long endTime = System.currentTimeMillis();
long time = endTime - starTime;
System.out.println("String消耗的时间:" + time);
StringBuffer builder = new StringBuffer("");
starTime = System.currentTimeMillis();
for(int j = 0;j < 10000;j ++){
builder.append(j);
}
endTime = System.currentTimeMillis();
time = endTime - starTime;
System.out.println("StringBuilder消耗时间:" + time);
}
}