目录
4. String(char[] value,int offset,int count)
substring(前序号,后序号) 部分替换 String restr=str.replace
全部替换 正则表达式(数字) String restrAll=str.replaceAll
5.4.3字符串分割 字符串.split(子串<可传正则表达式>,次数);
StringBuffer和Stringbuilder 的使用方法:
StringBuffer和Stringbuilder 的使用方法:
5.1 String类
5.1.1声明字符串
字符串是 Java 中特殊的类,使用方法像一般的基本数据类型,被广泛应用在 Java 编程中。Java 没有内置的字符串类型,而是在标准 Java 类库中提供了一个 String 类来创建和操作字符串。
在 Java 中定义一个字符串最简单的方法是用双引号把它包围起来。这种用双引号括起来的一串字符实际上都是 String 对象,如字符串“Hello”在编译后即成为 String 对象。因此也可以通过创建 String 类的实例来定义字符串。
不论使用哪种形式创建字符串,字符串对象一旦被创建,其值是不能改变的,但可以使用其他变量重新赋值的方式进行更改。
5.1.2创建字符串
直接定义字符串是指使用双引号表示字符串中的内容,例如“Hello Java”、“Java 编程”等。具体方法是用字符串常量直接初始化一个 String 对象。
注意:字符串变量必须经过初始化才能使用。
1. String()
初始化一个新创建的 String 对象,表示一个空字符序列。
2. String(String original)
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列。换句话说,新创建的字符串是该参数字符串的副本。例如:
String str1 = new String("Hello Java");
String str2 = new String(str1);
这里 str1 和 str2 的值是相等的。
3. String(char[ ]value)
分配一个新的字符串,将参数中的字符数组元素全部变为字符串。该字符数组的内容已被复制,后续对字符数组的修改不会影响新创建的字符串。例如:
char a[] = {'H','e','l','l','0'};String sChar = new String(a);a[1] = 's';
4. String(char[] value,int offset,int count)
分配一个新的 String,它包含来自该字符数组参数一个子数组的字符。offset 参数是子数组第一个字符的索引,count 参数指定子数组的长度。该子数组的内容已被赋值,后续对字符数组的修改不会影响新创建的字符串。例如:
char a[]={'H','e','l','l','o'};String sChar=new String(a,1,4);a[1]='s';
5.2连接字符串
1.使用连接运算符“+”
与绝大多数的程序设计语言一样,Java 语言允许使用“+”号连接(拼接)两个字符串。“+”运算符是最简单、最快捷,也是使用最多的字符串连接方式。在使用“+”运算符连接字符串和 int 型(或 double 型)数据时,“+”将 int(或 double)型数据自动转换成 String 类型。
int[] no = new int[] { 501, 101, 204, 102, 334 }; // 定义学号数组
String[] names = new String[] { "张城", "刘丽丽", "李国旺", "孟红霞", "贺宁" }; // 定义姓名数组
String[] classes = new String[] { "数学", "语文", "数学", "英语", "英语" }; // 定义课程数组
System.out.println("本次考试学生信息如下:");
// 循环遍历数组,连接字符串
for (int i = 0; i < no.length; i++) {
System.out.println("学号:" + no[i] + "|姓名:" + names[i] + "|课程:" + classes[i] + "|班级:" + "初二(三)班");
}
}
本次考试学生信息如下:
学号:501|姓名:张城|课程:数学|班级:初二(三)班
学号:101|姓名:刘丽丽|课程:语文丨班级:初二(三)班
学号:204|姓名:李国旺|课程:数学|班级:初二(三)班
学号:102|姓名:孟红霞|课程:英语|班级:初二(三)班
学号:334|姓名:贺宁|课程:英语|班级;初二(三)班
2.使用 concat() 方法
在 Java 中,String 类的 concat() 方法实现了将一个字符串连接到另一个字符串的后面。
字符串 1.concat(字符串 2);
public static void main(String[] args) {
String info = "三国演义、";
info = info.concat("西游记、");
info = info.concat("水浒传、");
info = info.concat("红楼梦");
System.out.println(info);
String cn = "中国";
System.out.println(cn.concat("北京").concat("海淀区").concat("人民公园"));
}
执行该段代码,
三国演义、西游记、水浒传、红楼梦
中国北京海淀区人民公园
3.连接其他类型数据
前面介绍的例子都是字符串与字符串进行连接,其实字符串也可同其他基本数据类型进行连接。如果将字符串同这些数据类型数据进行连接,此时会将这些数据直接转换成字符串。
public static void main(String[] args) {
String book = "三国演义"; // 字符串
int price = 59; // 整型变量
float readtime = 2.5f; // 浮点型变量
System.out.println("我买了一本图书,名字是:" + book + "\n价格是:" + price + "\n我每天阅读" + readtime + "小时");
}
上述代码实现的是将字符串变量 book 与整型变量 price 和浮点型变量 readtime 相连后将结果输出。在这里定义的 price 和 readtime 都不是字符串,当它们与字符串相连时会自动调用自身的 toString() 方法将其转换成字符串形式,然后再参与连接运算。因此,程序运行后的结果如下所示:
我买了一本图书,名字是:三国演义
价格是:59
我每天阅读2.5小时
System.out.println("我买了一本图书,名字是:"+book+"\n 价格是:"+price+"\n我每天阅读"+(price+readtime)+"小时");
因为运算符具有优先级,而圆括号的优先级最高,所以先计算 price 与 readtime 的和,再将结果转换成字符串进行连接。此时的运行结果如下所示:
我买了一本图书,名字是:三国演义
价格是:59
我每天阅读61.5小时
注意:只要“+”运算符的一个操作数是字符串,编译器就会将另一个操作数转换成字符串形式,所以应该谨慎地将其他数据类型与字符串相连,以免出现意想不到的结果。
5.3提取字符串信息
5.3.1获取字符串长度
在 Java 中,要获取字符串的长度,可以使用 String 类的 length() 方法,其语法形式如下:
字符串名.length();
在学生信息管理系统中对管理员密码有这样的规定,即密码长度必须大于 6 位且小于 12 位。因为密码太短容易被破解,太长的话又不容易记住。这就需要首先获取用户输入的密码字符串,然后调用 length() 方法获取长度,再做进一步的长度判断,最终实现代码如下所示:
public static void main(String[] args) {
String sys = "学生信息管理";// 字义一个字符串表示系统名称
System.out.println("欢迎进入《" + sys + "》系统");// 输出系统名称
System.out.println("请设置一个管理员密码:");
Scanner input = new Scanner(System.in);
String pass = input.next();// 获取用户输入的密码
int length = pass.length();// 获取密码的长度
if (length > 6 && length < 12) {
System.out.println("密码长度符合规定。");
System.out.println("已生效,请牢记密码:" + pass);
} else if (length >= 12) {
System.out.println("密码过长。");
} else {
System.out.println("密码过短。");
}
}
欢迎进入《学生信息管理》系统
请设置一个管理员密码:
123456
密码过短。
欢迎进入《学生信息管理》系统
请设置一个管理员密码:
abc12345678
密码长度符合规定。
已生效,请牢记密码:abc12345678
5.4字符串的操作
截取字符串
substring(前序号,后序号)
部分替换 String restr=str.replace
全部替换 正则表达式(数字) String restrAll=str.replaceAll
public static void main(String[] args) {
// TODO Auto-generated method stub
String str ="0123456789abc\\d";// 创建字符串,前十位是数字
String restr=str.replace("\\d","?");// 使用replace()将符合“\\d”表达式的字符串替换“?”
String restrAll=str.replaceAll("\\d","?");// 使用 replaceAll()将符合“\\d”//输出结果 表达式的字符串替换“?”
System.out .println("字符串str:"+ str);//输出字符串
System.out .println("使用replace()替换的结果:"+restr);//输出使用replace()替换的结果
System.out.println("使用replaceA1l()替换的结果;"+ restrAll);//输出替换后的结果
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str ="8I want to marry you, so I need you!";// 创建字符串
String noNumber =str.replaceFirst("\\d","");//将开头的数字替换成两个双引号“”
String youToHer=noNumber.replaceFirst("you","her");// 将第一次出现的“you替换成“her”
System.out.println("替换之后的结果是:"+youToHer);//输出结果
}
}
5.4.3字符串分割
字符串.split(子串<可传正则表达式>,次数);
public static void main(String[] args) {
String str="a1b2,c,d e f |gh";//创建字符串,包含多种类型字符
String[] al =str.split(",");//使用“,”分割
String[] a2 =str.split("");// 使用空格分割
String[] a3 =str.split("\\|");//使用“|”分割
String[] a4 =str.split("\\d");//使用正则表达式分割,本行用数字分割
//同时用”、空格、“”、数字分割,用符号“|”连接所有分隔符
String[] a5 =str.split(",| |\\||\\d");
System.out.println("str的原值:["+str+"]");//显示str的原值
//使用for-each 循环展示“,”分割的结果
System.out.print("使用\"\"分割:");
for (String b:al){
System.out.print("["+b+"]");
}
System.out.println(); //换行
//使用for-each循环展示空格分割的结果
System.out.print("使用空格分割:");
for (String b:a2) {
System.out.print("["+b+"]");
}
System.out.println();
//使用for-each循环展示“|”分割的结果
System.out.print("使用\"|\"分割:");
for(String b:a3){
System.out.print("[" +b+"]");
}
System.out.println();
//使用for-each循环展示数字分割的结果
System.out.print("使用数字分割:");
for(String b:a4) {
System.out.print("["+b+"]");
}
System.out.println();
//使用for-each环展示所有分隔符同时分割的结果
System.out.print("同时使用所有分隔符:");
for(String b:a5) {
System.out.print("[" +b +"]");
}
System.out.println();
}
}
// TODO Auto-generated method stub
String str = "192.168.0.1";//创建字符串
String[] firstArray=str.split("\\.");//按照“”进行分割
String[]secondArray=str.split("\\.",2);//按照“”进行两次分制
System.out.println("str的原值为:["+str+"]");//输出s原值
//输出全部分结果
System.out.print("全部分割的结果:");
for (String a :firstArray) {
System.out.print("[" +a+"]");
}
System.out.println();//换行
//输出分两次结果
System.out.print("分割两次的结果:");
for (String a :secondArray){
System.out.print("["+a+"]");
}
System.out.println();
}
}
5.4.4转换成小写 toLowerCase
转换成大写 toUpperCase
*比较字符串是否相等
a==b 位置
a.equals 值
a.equalsIgnoreCase(b)
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="a b cd efg";//利用正则表达式,将字符串中所有的空白内容都换成"";
String shortstr= str.replaceAll("\\s", "") ;// 创建字符串堆
System.out.println("str的原值是:[" + str + "]");//输出结果
System.out.println("删除空内容之后的值是:["+ shortstr + "]");//输出结果
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String strl="abc";//创建字符串对象,内容全部小写
String str2="ABC";//创建字符串对象,内容全部大写
System.out.println("区分大小写的结果:"+strl.equals(str2));//比较两个字符串的内容是否相等
//比较两个字符串的内容否相等,不区分大小写
System.out.println("不区分大小写的结果:"+strl.equalsIgnoreCase(str2));
}
}
字符串转换
(1)日期格式化
public static void main(String[] args) {
// TODO Auto-generated method stub
String strl =String.format("%c",'X'); // 输出字符
System.out.println("字母x大写:"+strl);
String str2 = String.format("%d",1251 +3950);// 输出数字
System.out.println("1251+3950的结果是:"+ str2);
String str3=String.format("%.2f",Math. PI);//输出小数点后两位
System.out.println("n取两位小数点:"+ str3);
String str4=String.format("%b",2<3);//输出布尔值
System.out.println("2<3的结果是:"+ str4);
String str5=String.format("%h",3510);// 输出哈希散列码。等同Integer.toHexString(3510);
System.out.println("3510的hashCode值:"+ str5);
String str6=String.format("%o",33);//输出8进制
System.out.println("33的8进制结果是:"+str6);
String str7 = String.format("%x",33);// 输出16进制
System.out.println("33的16进制结果是:"+str7);
String str8 =String.format("%e",120000.1); // 输出科学计数法
System.out.println("120000.1用科学计数法表示:"+str8);
String str9=String.format("%a",40.0);// 输出带有效位数和指数的 16 进制浮点值
System.out.println("40.0的16进制浮点值:"+ str9);//输出百分号和数字
System.out.println(String.format("天才是由%d%%的灵感,%d%%的汗水。",1,99));//输出
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1 = String.format("%5d", 123);//让字符串输出最大的长度为5,不足长度的在前端补空格
System.out.println("输出长度为5的字符串|"+str1+"|");
String str2=String.format("%-5d",123 );///现字得事方对齐
System.out.println("左对齐|"+ str2+"|");
String str3=String.format("%#o",33);//在在进制前加个。
System.out.println("33的8进制结果是:"+str3);
String str4 = String.format("%#x",33);//在16进制前加个0x
System.out.println("33的16进制结果是:"+str4);
String str5 = String.format("%+d",1);//显不数字正负号
System.out.println("我是正数:"+ str5);
String str6 = String.format("%+d",-1); // 显示数字正负号
System.out.println("我是负数:"+str6);
String str7 = String.format("%d",1 ); // 在正数前补一个空格
System.out.println("我是正数,前面有空格"+str7);
String str8 = String.format("% d",-1);//在负数前补一个负号
System.out.println("我是负数,前面有负号"+str8);
String str9 = String.format("%05d",12);//让字符串输出的最大长度为5,不足度在前端补0
System.out.println("前面不够的数用0填充:"+str9);
String str10 = String.format("%,d",123456789);//用号分隔数字
System.out.println("用运号分隔:"+str10);
String str11 = String.format("%(d",13); // 正数无影响
System.out.println("我是正数,我没有括号:"+str11);
String str12 = String.format("%(d",-13);//让负数用括号括起来
System.out.println("我是负数,我有括号的:"+ str12);
}
}
5.5可变字符串
类名 对象类型 执行效率 线程安全性
String 指向另外的空间 常量 慢 不安全
StringBuffer 指向在原来的基础上添加 变量 中 有锁 安全
Stringbuilder 在原来的基础上添加 变量 快 无 锁 不安全
StringBuffer和Stringbuilder 的使用方法:
追加 字符串名.append (需要追加的值);
修改某个元素的值 字符串名.setCharAT(序号,值);
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer sbf=new StringBuffer("门前大桥下,");//创建StringBuffer 对象
sbf.append("游过一群鸭,");// 追加字符串常量
StringBuffer tmp=new StringBuffer("快来快来数一数,");// 追加StringBuffer 对象
sbf.append(tmp); int x=24678;
sbf.append(x);//追加整型变量
System.out.println(sbf.toString());// 输出}
}
}
StringBuffer和Stringbuilder 的使用方法:
插入 字符串名.insert(序号,值);
反转 字符串名.reverse();
删除 字符串名.delate(前序号,后序号);
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer sbf = new StringBuffer("ABCDEFG");// 创建字符串序列
int lenght = sbf.length();// 获取字符串序列的长度
char chr = sbf.charAt(5); // 获取索引为5的字符
int index = sbf.indexOf("DEF");// 获取DEF字符串所在的索引位置
String substr = sbf.substring(0, 2);// 截取从索引0开始至索引2之间的字符串
StringBuffer tmp = sbf.replace(2, 5, "1234");// 将从索引2开始至索引5之间的字符序列替换成"1234"
System.out.println("sbf的原值为:" + sbf);//输出
System.out.println("sbf的长度为:" + lenght);//输出
System.out.println("索引为5的字符为:" + chr);//输出
System.out.println("DEF字符串的索引位置为:" + index);//输出
System.out.println("索引0开始至索引2之间的字符串:" + substr);//输出
System.out.println("替换后的字符串为:" + tmp);//输出
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = ""; // 创建空字符串
// 定义对字符串执行操作的起始时间
long starTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) { // 利用for循环执行10000次操作
str = str + i; // 循环追加字符串
}
long endTime = System.currentTimeMillis(); // 定义对字符串操作后的时间
long time = endTime - starTime; // 计算对字符串执行操作的时间
System.out.println("String循环1万次消耗时间:" + time); // 将执行的时间输出
StringBuilder builder = new StringBuilder(""); // 创建字符串生成器
starTime = System.currentTimeMillis(); // 定义操作执行前的时间
for (int j = 0; j < 10000; j++) { // 利用for循环进行操作
builder.append(j); // 循环追加字符
}
endTime = System.currentTimeMillis(); // 定义操作后的时间
time = endTime - starTime; // 追加操作执行的时间
System.out.println("StringBuilder循环1万次消耗时间:" + time); // 将操作时间输出
StringBuilder builder2 = new StringBuilder(""); // 创建字符串生成器
starTime = System.currentTimeMillis(); // 定义操作执行前的时间
for (int j = 0; j < 50000; j++) { // 利用for循环进行操作
builder2.append(j); // 循环追加字符
}
endTime = System.currentTimeMillis(); // 定义操作后的时间
time = endTime - starTime; // 追加操作执行的时间
System.out.println("StringBuilder循环5万次消耗时间:" + time); // 将操作时间输出
}
}