Java 从入门到精通(第4版)第5章 字符串

开始讲解之前,先列出本章的提纲,如下图所示:

5.1 String类

5.1.1 声明字符串

String str;

5.1.2 创建字符串

String str1 = new String("student");
System.out.println(str1);

char a[] = {‘s‘, ‘t‘, ‘u‘, ‘d‘, ‘e‘, ‘n‘, ‘t‘};
String str2 = new String(a);
System.out.println(str2);

char b[] = {‘s‘, ‘t‘, ‘u‘, ‘d‘, ‘e‘, ‘n‘, ‘t‘};
String str3 = new String(b, 2, 4);
System.out.println(str3);

// 字符串常量
String str4 = "We are students";
String str5 = "We are students";
System.out.println(str4 == str5); // str4与str5引用相同的内存地址

输出结果如下图所示:

5.2 连接字符串

5.2.1 连接多个字符串

String str1 = new String("hello");
String str2 = new String("world");
String str = str1 + " " + str2;
System.out.println(str);    // 输出hello world

注意事项:Java中一句相连的字符串不能分开在两行中写,如下图所示

可以看出,这种写法是错误,无法编译通过,如果一个字符串过长,为了便于阅读,想将这个字符串分在两行上书写,此时可以使用“+”将两个字符串连接起来,之后在加号处换行,如下面语句所示:

System.out.println("I like " +
                "Java");

5.2.2 连接其他数据类型

int booktime = 4;
float practice = 2.5f;
System.out.println("我每天花费" + booktime + "小时看书;" + practice + "小时上机练习");

输出结果如下图所示:

5.3 获取字符串信息

5.3.1 获取字符串长度

String str = "We are students";
int size = str.length();

System.out.println(size);   // 输出15

5.3.2 字符串查找

indexOf():返回搜索的字符或者字符串在字符串中首次出现的位置,如果没有检索到,则返回-1。

lastIndexOf():返回搜索的字符或者字符串在字符串中最后一次出现的位置,如果没有检索到,则返回-1。

String str = "We are students";
int size = str.indexOf("a");
System.out.println(size);   // 输出3

size = str.indexOf("o");
System.out.println(size);   // 输出-1

size = str.indexOf("");
System.out.println(size);   // 输出0
String str = "We are students";
int size = str.lastIndexOf("s");
System.out.println(size);   // 输出14

size = str.lastIndexOf("o");
System.out.println(size);   // 输出-1

size = str.lastIndexOf("");
System.out.println(size);   // 输出15

注意事项:如果lastIndexOf()方法中的参数是空字符串""(注意没有空格),则返回的结果与调用该字符串的length()方法的返回结果相同。

5.3.3 获取指定索引位置的字符

String str = "hello world";
char myChar = str.charAt(6);
System.out.println("字符串str中索引位置是6的字符为:" + myChar);

输出结果如下图所示:

5.4 字符串操作

5.4.1 获取子字符串

String str = "hello world";
String substr = str.substring(3);   // lo world

System.out.println(substr);

substr = str.substring(0, 3);
System.out.println(substr); // hel,不包括endIndex

注意事项:在字符串中空格占用一个索引位置。

5.4.2 去除空格

String str = "  Java  class   ";
System.out.println("字符串原来的长度:" + str.length());
// 去掉str的前导和尾部的空格
System.out.println("去掉空格后的长度:" + str.trim().length());

输出结果如下图所示:

5.4.3 字符串替换

String str = "address";
String newStr = str.replace("a", "A");

System.out.println(newStr); // 输出Address

说明:

  1.如果要替换的字符在字符串中没有出现,则将原字符串返回

  2.如果要替换的字符在字符串中重复出现多次,会将要替换的字符全部替换为新字符

  3.要替换的字符的大小写要与原字符串中字符的大小写保持一致,否则不能成功的替换

String str = "address";
String newStr = str.replace("b", "B");

System.out.println(newStr); // 输出address

newStr = str.replace("d", "D");

System.out.println(newStr); // 输出aDDress

newStr = str.replace("A", "B");

System.out.println(newStr); // 输出address

5.4.4 判断字符串的开始与结尾

String num1 = "22045612";
String num2 = "21304578";
boolean b1 = num1.startsWith("22");
boolean b2 = num1.endsWith("78");
boolean b3 = num2.startsWith("22");
boolean b4 = num2.endsWith("78");

System.out.println("字符串num1是以‘22‘开始的吗?" + b1);
System.out.println("字符串num1是以‘78‘结束的吗?" + b2);
System.out.println("字符串num2是以‘22‘开始的吗?" + b3);
System.out.println("字符串num2是以‘78‘结束的吗?" + b4);

输出结果如下图所示:

5.4.5 判断字符串是否相等

对字符串对象进行比较不能简单地使用比较运算符"==",因为比较运算符比较的是两个字符串的地址是否相同。即使两个字符串的内容相同,两个对象的内存地址也可能是不同的,使用比较运算符仍然会返回false。

因此,要比较两个字符串内容是否相等,应使用equals()方法和equalsIgnoreCase()方法。

String s1 = new String("abc");
String s2 = new String("ABC");
String s3 = new String("abc");
String s4 = "abc";
String s5 = "abc";

boolean b1 = s1.equals(s2);
boolean b2 = s1.equalsIgnoreCase(s2);
boolean b3 = s1.equals(s3);
boolean b4 = s1 == s3;
boolean b5 = s4 == s5;

System.out.println(s1 + " equals " + s2 + ":" + b1);
System.out.println(s1 + " equalsIgnoreCase " + s2 + ":" + b2);
System.out.println(s1 + " equals " + s3 + ":" + b3);
System.out.println(s1 + " == " + s3 + ":" + b4);
System.out.println(s4 + " == " + s5 + ":" + b5);

输出结果如下图所示:

5.4.6 按字典顺序比较两个字符串

compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,按字典顺序将此String对象表示的字符序列与参数字符串所表示的字符序列进行比较。

如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数。

如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数。

如果这两个字符串相等,则比较结果为0。

String str = new String("b");
String str2 = new String("a");
String str3 = new String("c");
String str4 = new String("b");

System.out.println(str + " compareTo " + str2 + ":" + str.compareTo(str2));
System.out.println(str + " compareTo " + str3 + ":" + str.compareTo(str3));
System.out.println(str + " compareTo " + str4 + ":" + str.compareTo(str4));

输出结果如下图所示:

说明:compareTo()方法只有在equals(Object)方法返回true时才返回0。

5.4.7 字母大小写转换

String str = new String("abc DEF");
String newStr = str.toLowerCase();
String newStr2 = str.toUpperCase();

System.out.println(newStr); // abc def
System.out.println(newStr2); // ABC DEF

说明:使用toLowerCase()方法和toUpperCase()方法进行大小写转换时,数字或非字符不受影响。

5.4.8 字符串分割

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();

输出结果如下图所示:

5.5 格式化字符串

5.5.1 日期和时间字符串格式化

Date date = new Date();

String year = String.format("%tY", date);
String month = String.format("%tB", date);
String day = String.format("%td", date);
String hour = String.format("%tH", date);
String minute = String.format("%tM", date);
String second = String.format("%tS", date);
String form = String.format("%tF", date);

System.out.println("今年是:" + year + "年");
System.out.println("现在是:" + month);
System.out.println("今天是:" + day + "号");
System.out.println("现在是:" + hour + "时" + minute + "分" + second + "秒");
System.out.println("年-月-日格式:" + form);

输出结果如下图所示:

5.5.2 常规类型格式化

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);

输出结果如下图所示:

5.6 使用正则表达式

正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式,正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。

以下表格为常用的元字符:

元字符 正则表达式中的写法 意义
. . 代表任意一个字符
\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{Digit} \\p{Digit} 十进制数字,即0~9
\p{Blank} \\p{Blank} 空格或制表符\t


说明:在正则表达式中"."代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符".",必须使用转义字符"\" 。

在正则表达式中可以使用方括号括起若干个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。

例如,[abc]4,字符串a4,b4,c4都是匹配的字符串。方括号元字符还可以为其他格式,如:

[^456]:代表4、5、6之外的任何字符。

[a-r]:代表a~r中的任何一个字母。

[a-zA-Z]:代表任意一个英文字母。

在正则表达式中,允许使用限定修饰符来限定元字符出现的次数。

限定修饰符的用法如下表所示:

限定修饰符 意义 示例
? 0次或1次 A?
* 0次或多次 A*
+ 1次或多次 A+
{n} 正好出现n次 A{2}
{n,} 至少出现n次 A{3,}
{n,m} 出现n~m次 A{2,6}

String regex = "\\[email protected]\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
String str1 = "[email protected]";
String str2 = "aaaaa";
String str3 = "[email protected]";

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地址格式");
}

运行结果如下图所示:

5.7 字符串生成器

String str = "";
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
      str = str + i;
}
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
System.out.println("String消耗时间:" + time);

StringBuilder builder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int j = 0; j < 10000; j++) {
      builder.append(j);
}
endTime = System.currentTimeMillis();
time = endTime - startTime;
System.out.println("StringBuilder消耗时间:" + time);

运行结果如下图所示:

通过运行的耗时可以看出,如果在程序中需要频繁的附加字符串,建议使用StringBuilder。

StringBuilder bf = new StringBuilder("hello");
bf.insert(5, "world");
System.out.println(bf.toString());  // 输出helloworld

bf = new StringBuilder("StringBuilder");
bf.delete(5, 10);
System.out.println(bf.toString());  // 输出Strinder

原文地址:https://www.cnblogs.com/zwwhnly/p/10034156.html

时间: 2024-08-01 04:26:09

Java 从入门到精通(第4版)第5章 字符串的相关文章

《Java 从入门到精通(第二版)》 观书有感

笔者今天认真试读了下此书,首先,按照笔者看书的习惯来说,喜欢先看看前面的部分.作者在前言里放了张学习java的路线图,是一个比较标准的学习流程.可是为什么在编程进阶那里放了个设计模式,然后下次才是抽象类与接口,包及访问权限(这名字和java编程思想好熟悉啊),个人认为,设计模式不应该放上来的,可能作者这里的设计模式有其它的含义吧.         全书文字和图像布局都比较合理,看着也挺舒服的.并且发现书还不是一个人写的,不由好几个不同的人共同撰写的.接下来就是目录了,从目录的结构来看,知识点很全

《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路

以前很多时候会开玩笑,说什么,三天学会PHP,七天精通Nodejs,xx天学会xx ... 一般来说,这样子说的多半都带有一点讽刺的意味,我也基本上从不相信什么快速入门.我以前在学校的时候自觉过很多门语言,但基本都只是了解了一个大概,入门肯定也算不上了.顶多也就能吹吹牛,说几个大的概念而已. 公司最近转型,决定抛弃PHP了,我们的出路是:要么H5,要么JAVA,要么走人.纠结了一段时间后,决定还是转JAVA了. 当一个人在自己熟悉的领域的时候,好像说什么都很有自信,都觉得自己是对的.那时候我们的

linux从入门到精通(第2版)下载 &#493590;

下载地址: http://www.gqylpy.com/di/14 <Linux从入门到精通(第2版)>PDF高清完整版-下载 内容简介 编辑 Linux是目前增长最迅速的操作系统.<Linux从入门到精通>由浅入深.循序渐进地向读者介绍Linux的基本使用和系统管理.全书内容包括Linux概述.Linux安装.Linux基本配置.桌面环境基本操作.Shell基本命令.文件和目录管理.软件包管理.磁盘管理.用户与用户组管理.进程管理.网络配置.浏览网页.收发邮件.文件传输和共享.远

Java从入门到精通pdf电子版

Java从入门到精通pdf电子版 链接:https://pan.baidu.com/s/1nzy8LV6d2_qAD3oKS-Fj9Q 提取码:at3x 简介: <Java从入门到精通>从初学者小白角度出发,通过通俗易懂的白话语言.丰富多彩的实战实例,详细介绍了使用Java语言进行程序开发应该掌握的各方面技术和技能,让你在编程开发中越走越远 目录 · · · · · · 第一篇 基础篇 第1章 Java概述 第2章 Java基本语言 第3章 控制流程语句 第4章 数组 第二篇 面向对象 第5章

linux从入门到精通(第2版)pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介编辑Linux是目前增长最迅速的操作系统.<Linux从入门到精通>由浅入深.循序渐进地向读者介绍Linux的基本使用和系统管理.全书内容包括Linux概述.Linux安装.Linux基本配置.桌面环境基本操作.Shell基本命令.文件和目录管理.软件包管理.磁盘管理.用户与用户组管理.进程管理.网络配置.浏览网页.收发邮件.文件传输和共享.远程登录.多媒体应用.图像浏览和处理.打印机配置.办公软件的使用.Linux编程工具.Shell编程.服务

【PHP】最详细PHP从入门到精通(四)——PHP中的字符串

 PHP从入门到精通 之PHP中的字符串 大家好,继续跟进PHP最详尽的知识更新,本周,跟大家重点讲一下PHP中字符串的使用.在PHP中,字符串是非常重要的一个概念,基本上大家想到的字符串的处理功能,系统都已有相关函数了.php自诞生之初,就是为web开发而来的,网站开发中,字符串处理,是php的一大亮点. 下面博主将带给详细的给大家介绍PHP中常用的字符串: 字符串三种声明方式 1."":双引号中可以解析变量"{$a}",双引号中可以使用任何转义字符:2.'':单

Java 从入门到精通(第4版)第6章 数组

开始讲解之前,先列出本章的提纲,如下图所示: 6.1 数组概述 数组是具有相同数据类型的一组数据的集合. 数组中的每个元素具有相同的数据类型. 可根据数组的维数将数组分为一维数组.二维数组…… 6.2 一维数组的创建及使用 6.2.1 创建一维数组 1.先声明,再用new运算符进行内存分配 int arr[]; arr = new int[5]; 2.声明的同时为数组分配内存 int month[] = new int[12];  说明:使用new关键字为数组分配内存时,整型数组中各个元素的初始

Java从入门到精通05-抽象类、接口、Final

1.父类方法不能确定时 ,可以用abstract关键字来修饰该方法: 2.当一个类继承的父类是抽象类的话,需要我们把抽象类中的所有抽象方法全部实现: 抽象类的注意事项:1.抽象类不能被实例化:2.抽象类不一定要包含抽象方法,也就是说,抽象类可以没有abstract方法:3.一旦包含类abstract方法,则这个类必须声明为abstract:4.抽象方法不能有主体,如:abstract void aaa(){}: ------------------------------------------

Java从入门到精通12-BorderLayout布局

边界布局管理器把容器的的布局分为五个位置:CENTER.EAST.WEST.NORTH.SOUTH.依次对应为:上北(NORTH).下南(SOUTH).左西(WEST).右东(EAST),中(CENTER),如下图所示. 特征: l  可以把组件放在这五个位置的任意一个,如果未指定位置,则缺省的位置是CENTER. l  南.北位置控件各占据一行,控件宽度将自动布满整行.东.西和中间位置占据一行;若东.西.南.北位置无控件,则中间控件将自动布满整个屏幕.若东.西.南.北位置中无论哪个位置没有控件