`

第十三章 字符串

 
阅读更多
不可变String
public class Immutable {
	public static String upcase(String s) {
		return s.toUpperCase();
	}
	
	public static void main(String[] args) {
		String q = "howdy";
		System.out.println(q);
		String qq = upcase(q);
		System.out.println(q);
		System.out.println(qq);
	}
}
Output:
howdy
howdy
HOWDY

当把q传给upcase方法时,实际传递的是引用的一个拷贝。其实,每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未动过。
回到upcase定义,传入其中的引用有了名字s,只有在upcase运行的时候,局部引用s才存在。一旦upcase结束,s就消失了。当然了,upcase的返回值,其实只是最终结果的引用和s不是一个引用。这足以说明,upcase返回的引用已经指向了一个新的对象,而原本的q则还在原地。
难道你真的希望改变其参数吗?对与一个方法而言,参数时为该方法提供信息的,而不是想让该方法改变自己的。

重载“+”与StringBuilder

String s = “abf” + “sadf” + “da” + 47;

调用javap –c Concatenation
看输出代码,我们可以得到:
编译器自动引入了java.lang.StringBuilder类。虽然我们在源代码中并没有使用StringBuilder类,但是编译器却自作主张地使用了它,因为它更高效。
    在这个例子中,编译器创建了一个StringBuilder对象,用以构造最终的String,并为每个字符串调用一次StringBuilder的append方法,总计4次。最后调用toString生成结果。并存为s。
现在,也许你会觉得可以随意使用String对象,反正编译器会为你自动地优化性能。但是看下面两段代码:
public class Immutable {
	public static String upcase(String[] fields) {
		String result;
		for(int i=0; i<10; i++) {
			result += fields[i];
		}
		return result;
	}
	
	public static void main(String[] args) {
		StringBuilder result = new StringBuilder();
		for(int i=0; i<10; i++) {
			result.append(fields[i]);
		}
		result.toString();
	}
}


第一个每一次循环内部都会生成一个StringBuilder对象,但是最后这个代码只有一个。如果你要在toString方法中使用循环,那么最好自己创建一个StringBuilder对象,用它来构造最终的结果。

如果你想走捷径,例如append(a + “:” + b)那编译器就会掉入陷阱,从而为你另外创建一个StringBuilder对象来处理括号内的字符串操作。


如果你拿不准该用哪种方式,随时都可以用javap来分析你的程序。

StringBuilder提供了丰富而全面的方法,包括insert replace substring甚至reverse,但是最常用的还是append和toString还有delete方法。

Stringbuilder是java SE5引入的,在这之前java用的是StringBuffer。后者是线程安全的,因此开销也会大些。

格式化输出
public class SimpleFormat {
	public static void main(String[] args) {
		int x = 5;
		double y = 5.332466;
		System.out.println("Row 1: [" + x + " " + y + "]");
		System.out.format("Row 1: [%d %f]\n", x, y);
		System.out.printf("Row 1: [%d %f]\n", x, y);
	}
}
Output:
Row 1: [5 5.332466]
Row 1: [5 5.332466]
Row 1: [5 5.332466]


Formatter类

在java中,所有新的格式化功能都由java.util.Formatter类处理。可以将Formatter看作一个翻译器,它将你的格式化字符串与数据翻译成需要的结果。当你创建一个Formatter对象的时候,需要向其构造器传递一些信息,告诉它最终的结果将向哪里输出:
import java.io.PrintStream;
import java.util.Formatter;

public class Turtle {
	private String name;
	private Formatter f;
	public Turtle(String name, Formatter f) {
		this.name = name;
		this.f = f;
	}
	public void move(int x, int y) {
		f.format("%s the turtle is at (%d,%d)\n", name, x, y);
	}
	public static void main(String[] args) {
		PrintStream outAlias = System.out;
		Turtle tommy = new Turtle("Tommy", new Formatter(System.out));
		Turtle terry = new Turtle("terry", new Formatter(outAlias));
		tommy.move(0, 0);
		terry.move(4, 8);
	}
}
Output:
Tommy the turtle is at (0,0)
terry the turtle is at (4,8)


格式化说明符

在插入数据时,如果想要控制空格与对齐,你需要更精细复杂的格式修饰符。一下是语法:
%[argument_index$][flags][width][.precision]conversion
%               -     15    .5
共15位小数5位左对齐。
最常见的应用时控制一个域的最小尺寸,这可以通过指定width来实现。Formatter对象通过在必要时添加空格,来去日报一个域至少达到某个长度。在默认情况下,数据是右对齐,不过可以通过使用“-”标志来改变对齐方向。
与width相对的是precision,它用来指明最大尺寸。Width可以应用于各种类型的数据转换,并且其行为方式都一样。Precision则不然,不是所有类都可以使用,String的时候表示输出字符最大数量,而小数的时候,位数过多则舍入,少了就补零。所以无法应用于整数,如果应用则会发生异常。

Formatter转换

d 整数型            c Unicode字符
b Boolean值          s String
f 浮点数(十进制)      e 浮点数(科学计数)
x整数(十六进制)      h散列码(十六进制)    % 字符“%”
程序中每个变量都使用了b转型,只要不是null转型都是true,即使是数字0转换结果依然是true。

String.format()

String.format()放回一个String对象。其实在String.format()内部,它也是创建一个Formatter对象,然后将你传入的参数转给该Formatter。不过,与其自己做这些事情,不如使用便捷的String.format()方法,何况这样的代码更清晰易读。

正则表示式

应用正则表达式的最简单的途径,就是利用String内建的功能。
public static void main(String[] args) {
		System.out.println("-1234".matches("-?\\d+"));
}
Output:
True


String.split()还有一个重载的版本,它允许你限制字符串分割的次数。
String类自带的最后一个正则表达式工具是“替换”。你可以只替换正则表达式第一个匹配的子串,或是替换所有匹配的地方。

public static void main(String[] args) {
		System.out.println(s.replaceFirst("f\\w+", "located"));
		System.out.println(s.replaceAll("shrubbery|tree|herring", "banana"));
	}
分享到:
评论

相关推荐

    Java编程思想第十三章字符串.pptx

    Java编程思想第十三章字符串.pptx

    第13章 字符串处理函数

    第13章主要讲解了字符串处理函数,涵盖了输入输出、复制和拼接等基本操作。以下是这些知识点的详细说明: 1. **输入和输出函数** - **putchar函数**:用于向标准输出设备(通常是显示器)打印一个字符。其函数原型...

    Python程序设计董付国(第二版)第4章字符串与正则表达式.pptx

    Python程序设计董付国第二版第四章字符串与正则表达式知识点总结 1. 字符串编码:ASCII、UTF-8、UTF-16、UTF-32、GB2312、GBK、CP936、base64等,了解不同编码格式的特点和应用场景。 2. Python字符串类型:Python...

    第03章 字符串用法.rar

    本章我们将深入探讨字符串的常见操作和使用技巧,以帮助你更好地理解和运用字符串这一重要的编程工具。 一、字符串定义与创建 字符串是由一个或多个字符组成的序列,通常用于存储文本信息。在很多编程语言中,如...

    java笔记字符串的应用

    Java 字符串应用笔记 在 Java 中,字符串是最基本的数据类型之一,理解字符串的应用是 Java 开发的基础。本篇笔记将详细介绍 Java 中 equals 和 == 的区别、字符串相关的几个函数介绍、String 和 StringBuffer 的...

    第五章 数组、字符串与类库

    本章主要探讨了数组,特别是字符串以及类库的使用。 一、数组 1. 一维数组 - 定义与创建: - 方式一:先声明数组变量,再创建数组对象。如 `int a[];` 后跟 `a = new int[3];` - 方式二:同时定义并创建数组,...

    第4章 python字符串.pptx

    值得注意的是,Python允许使用三引号('''或""")来创建多行字符串。 在字符串中,转义字符是一个重要的概念。转义字符以反斜线`\`开头,用于表示特殊功能或插入特殊字符。例如,`\n`用于插入一个换行符,`\t`插入...

    c语言函数库-第四章(字符串函数)[参照].pdf

    C语言函数库中的第四章主要聚焦于字符串处理函数,这些函数在软件开发中扮演着重要角色,特别是对于处理文本数据时。以下是对其中一些关键函数的详细解释: 1. `atof`:此函数用于将一个字符串转换为浮点型数值。它...

    POINTERS ON C 第九章编程练习16按照指定的格式字符串对一个数字字符进行格式化

    在第九章的“POINTERS ON C”中,编程练习16着重于使用格式化字符串来处理数字字符。这涉及到C语言的`printf`函数,它是`stdio.h`库中的一个关键组成部分,用于向标准输出(通常是控制台)打印格式化的数据。 `...

    优质Python教程 Python3.7从基础入门到精通进阶教程 第04章 熟练操作字符串 共10页.ppt

    第13章 基于thinter的GUI编程.ppt 第14章 Python的高级技术.ppt 第15章 数据库的应用.ppt 第16章 网络编程的应用.ppt 第17章 CGI程序设计.ppt 第18章 Web网站编程.ppt 第19章 经典游戏应用-开发弹球游戏.ppt 第20章 ...

    第6章-数组和字符串-练习题.pdf

    "数组和字符串-练习题.pdf" 本资源摘要信息是关于数组和字符串的练习题,共15道选择题,涵盖了数组和字符串的基本概念、数组下标、数组初始化、数组元素访问、字符串数组、数组拷贝等知识点。 一、数组基本概念 *...

    18.C#字符串和正则表达式参考手册 影印版

    第3章 字符串转换 68 3.1 ToString()方法 68 3.2 把数值表示为字符串 69 3.3 把日期和时间表示为字符串 74 3.4 把其他对象表示为字符串 76 3.5 用字符串表示字符串 78 3.6 把字符串转换为其他类型 79 3.6.1 把字符串...

    第12章04自定义字符串类_String.zip_综合类 自定义string

    在编程领域,自定义字符串类(如题目中的`_String`)是一种常见的实践,它允许开发者根据特定需求扩展或修改标准库中字符串类的功能。在本案例中,我们聚焦于如何构建一个综合性的自定义字符串类,以实现与C++标准库...

    《C Primer Plus》第六版 第十一章编程练习答案

    "《C Primer Plus》第六版 第十一章编程练习答案" 本资源摘要信息是关于《C Primer Plus》第六版 第十一章的编程练习答案,涵盖了多个与C语言相关的知识点。下面对这些知识点进行详细的解释和分析。 1. 输入字符串...

    第6章数组指针与字符串.

    本章主要讨论了数组、指针以及字符串的基本概念和使用方法。 数组是存储相同类型元素的集合,可以通过索引来访问每个元素。例如,数组A[10][5][15]是一个三维数组,它有10个元素,每个元素本身又是一个含有5个元素...

    C++数据结构与算法

    第1章 C++面向对象程序设计  1.1 抽象数据类型  1.2 封装  1.3 继承  1.4 指针  1.4.1 指针与数组  1.4.2 指针与复制构造函数 ...第13章 字符串匹配 附录A 计算大O 附录B 标准模板库中的算法 附录C NP完整性

Global site tag (gtag.js) - Google Analytics