事实上,Java是没有内置的字符串类型的,而是在标准Java类库中提供了一个预定义类String。每个用双引号括起来的字符串都是String类的一个实例:

String str = ""; // an empty string
String greeting = "Hello";

1.子串

  String类的substring方法可以从一个较大的字符串提取出一个子串。例如:

String greeting = "Hello";
String str = greeting.substring(0,3); //str is "Hel"

创建了一个由字符"Hel"组成的字符串。

  substring方法的第二个参数是不想复制的第一个位置。这里要复制的位置为0、1和2(从0到2,包括0和2)的字符。在substring中下标从0开始计数,直到3为止,但不包含3(就像数学中的区间表示其范围【0,3))。

  substring的工作方式有一个优点:容易计算子串的长度。字符串s.substring(a,b)的长度为b-a。例如,子串"Hel"的长度为3-0=3。

2.拼接

  与绝大多数的程序设计语言一样,Java语言允许使用+号连接(拼接)两个字符串。

String str = "str";
String jack = "jack";
String message = str + jack; //message is "strjack"

  上述代码将"strjack"赋给变量message(注意,单词之间没有空格,+号按照给定的次序将两个字符串拼接起来)。

  当将一个字符串与一个非字符串的值进行拼接时,后者会被转换成字符串(任何一个Java对象都可以转换成字符串)。例如:

int age = 18;
String rating = "PG" + age; // rating is "PG18"

  我们可以得到rating的值为"PG18"。这种特性通常用在输出语句中。例如:

System.out.println("The answer is" + rating);

  这是一条合法的语句,并且将会打印出所希望的结果(The answer is PG18),如果单词is后面加了一个空格,输出时也会加上这个空格。

3.不可变字符串

  查看源码可以知道,String类是final修饰的不可变类:

public final class String implements java.io.Serializable, Comparable<String>, ChaSequence{...}

  由此可见,String类没有提供用于修改字符串的方法。但是如果希望将greeting的内容修改为"Help!",不能直接的将greeting的最后两个位置的字符修改为"p"和"!"。这对于C程序员来说,将会感到无从下手。如何修改这个字符串呢?在Java中实现这个操作非常容易。首先提取需要的字符,然后再拼接上替换的字符串:

greeting = greeting.substring(0,3) + "p!"; //greeting is "Help!"

  由于不能修改Java字符串中的字符,所以在Java文档将String类对象称为不可变字符串,如同数字3永远是数字3一样,字符串"Hello"永远包含字符H,e,l和o的代码单元序列,而不能修改其中的任何一个字符。当然,可以修改字符串变量greeting,让它引用另外一个字符串,这就如同可以将存放3的数值变量改成存放4一样。

  有人会问,这样做是否会降低运行效率呢?看起来修改一个代码单元要比创建一个新的字符串更加简洁。答案是:也对,也不对。的确,通过拼接"Hel"和"p!"来创建一个新字符串的效率确实不高。但是,不可变字符串却有一个优点:编译器可以让字符串共享。

  如果不是很清楚,可以想象将各种字符创存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。

  总而言之,Java的设计者认为共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率。查看一下写过的程序会发现:很少需要修改字符串,而是往往需要对字符串进行比较(有一种例外情况,将源自于文件或键盘的单个字符或较短的字符串汇集成字符串。为此,Java提供了一个独立的类,在下面"构建字符串"中将详细的给予介绍)。

4.检测字符串是否相等

  可以使用equals方法检测两个字符串是否相等。对于表达式:

s.equals(t)

  如果字符串s与字符串t相等,则返回true;否则,返回false。需要注意,s与t可以是字符串变量,也可以是字符串常量。例如,下面表达式是合法的:

"Hello".equals(greeting)

  要想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnorCase方法:

"Hello".equalsIgnorCase(greeting)

  注意:一定不能使用 == 运算符检测两个字符串是否相等!这个运算符只能确定两个字符串是否放在同一个位置上(栈区存放的是引用地址,其实堆区存放的才是实际的值,而 == 运算符比较的就是栈区里面的值)。当然,如果字符串存放在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝位置放在不同的位置上。

String greeting = "Hello"; //initialize greeting to a string
if (greeting == "Hello")...
//probably true
if (greeting.substring(0,3) == "Hel")...
//probably false

  如果虚拟机始终将相同的字符串共享,就可以使用 == 运算符检测是否相等。但实际上只有字符串常量是共享的,而+或者substring等操作产生的结果并不是共享的。因此,千万不要使用 == 运算符测试字符串的相等性,以免在程序中出现糟糕的bug。从表现上看,这种bug很像随机产生的间歇性错误。

5.构建字符串

  有些时候,需要由较短的字符串构建字符串,例如,按键或来自文中的单词。采用字符串连接的方式达到此目的的效率比较低。每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类就可以避免这个问题的发生。

  如果需要用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行。首先,构建一个空的字符串构造器:

StringBuilder builder = new StringBuilder();

  当每次需要添加一部分内容时,就调用append方法:

builder.append("ch"); //appends a single character
builder.append("str"); //appends a string

  在需要构建字符串时就调用toString方法,将可以得到一个String对象,其中包含了构建器中的字符序列。

String completedString = builder.toString();

  注意:在JDK5.0中引入StringBuilder类。这个类的前身是StringBuffer(基于线程安全),它的效率略微有些低,但允许采用多线程的方式执行添加或删除字符的操作。如果所有字符串在一个单线程中(通常都是这样)编辑,则应该用StringBuilder替代它。

Java基础—字符串的更多相关文章

  1. Java基础-字符串(String)常用方法

    Java基础-字符串(String)常用方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.java的API概念 Java的API(API:Application(应用) Pr ...

  2. Java基础-字符串连接运算符String link operator

    Java基础-字符串连接运算符String link operator 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 字符串链接运算符是通过“+”进行拼接的. 一.使用“+”进行字 ...

  3. java基础 字符串 “==” 和 “equals” 比较

    demo: public class TestStringEquals { public static void main(String[] args) { String a = "test ...

  4. [Java基础]字符串

    1.字符串特点 字符串是常量,创建之后不能修改: 字符串的内容一旦修改,就会马上创建一个新的对象: 字符串实际为一个char value[]={'a','a'};数组: 2.==与equal判断字符串 ...

  5. [Java 基础]字符串

    String类 实例化String对象 String 对象初始化方式有多种. 如下代码中,各种初始化方式的效果是一样的,初始化后,String 对象的内容为 "hello" . p ...

  6. java基础---字符串string

    1.字符创的概念 java字符串就是Unicode字符序列.例如,串“Java\u2122”由5个Unicode字符J.a.v.a和TM.java没有内置的字符串类型,而是在标准库Java类库中提供了 ...

  7. Java基础——字符串构建器

    StringBuilder类: 可以将许多小段的字符串构建一个字符串. StringBuilder builder = new StringBuilder(); //构造一个空的字符串构建器 buil ...

  8. Java基础——字符串String

    String类 1. String类位于java.lang包中,使用时无需导包. 2. 创建字符串的两种方式: ① 直接指定(字面量声明):String str = "abc"; ...

  9. Java基础 -- 字符串(格式化输出、正则表达式)

    一 字符串 1.不可变String String对象是不可变的,查看JDK文档你就会发现,String类中每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以包含修改后 ...

  10. Java基础 - 字符串 String

    字符串就是用字符拼接成的文本值,字符串在存储上类似数组,在java语言中把字符串当做对象进行处理 创建字符串 package com.mingri.chapter_02; public class d ...

随机推荐

  1. Java实现导入导出Excel:POI和EasyExcel

    文章与CSDN同步,欢迎访问:https://blog.csdn.net/qq_40280582/article/details/107300081 代码地址:https://gitee.com/il ...

  2. uPDF-功能强大的PDF文件处理小工具

    前几天因为工作原因,需要将一个PDF压缩一下. 网上找了半天,要么收费,要么就是转换的质量不太好.论坛也找到一些破解的软件,但是总有点不太合适,有些功能还挺复杂.也有些在线转换的,又考虑到自己较为隐私 ...

  3. 用Graphviz画简单依赖图示例

    代码: digraph module { 0 [label="global.h"]; 1 [label="bst_operator.c"]; 2 [label= ...

  4. Vue JSX、自定义 v-model

    ​博客地址:https://ainyi.com/92 最初用到 JSX,就是做这个博客的时候.iview 表格组件,不支持像 element 那样直接写 html 代码渲染,只能通过 render 函 ...

  5. 足球动图gif(二)

  6. kubernetes系列(十七) - 通过helm安装dashboard详细教程

    1. 前提条件 2. 配置https证书为secret 3. dashboard安装 3.1 helm拉取dashboard的chart 3.2 配置dashboard的chart包配置 3.3 he ...

  7. Fisher算法+两类问题

    文章目录 一.Fisher算法 二.蠓的分类问题: 三.代码实现: 一.Fisher算法 二.蠓的分类问题: 两种蠓Af和Apf已由生物学家根据它们的触角和翼长加以区分(Af是能传播花粉的益虫,Apf ...

  8. 题解 洛谷 P5303 【[GXOI/GZOI2019]逼死强迫症】

    可以先去考虑没有\(1 \times 1\)的砖块的情况,对于最后一个位置只有两种情况,一个是竖着用一块砖铺设\(2 \times 1\),另一个为横着用两块砖铺设\(2 \times 2\). 设没 ...

  9. 题解 洛谷 P6351 【[PA2011]Hard Choice】

    删边操作不好处理,所以先将操作倒序,将删边转化为加边. 考虑对于两个点的询问,若这两点不连通或这两个点分别处于两个不同的边双连通分量中(两点间存在桥)时,是不满足题目要求的. 可以用\(LCT\)来维 ...

  10. ubuntu安装 jdk

    首先查一下当前JDK的版本 ,一般是系统自带Jdk$ java -version 然后根据版本8安装完整版的OpenJDK $ sudo apt-get install openjdk-8-jdk 如 ...