Java基础—字符串
事实上,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基础—字符串的更多相关文章
- Java基础-字符串(String)常用方法
Java基础-字符串(String)常用方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.java的API概念 Java的API(API:Application(应用) Pr ...
- Java基础-字符串连接运算符String link operator
Java基础-字符串连接运算符String link operator 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 字符串链接运算符是通过“+”进行拼接的. 一.使用“+”进行字 ...
- java基础 字符串 “==” 和 “equals” 比较
demo: public class TestStringEquals { public static void main(String[] args) { String a = "test ...
- [Java基础]字符串
1.字符串特点 字符串是常量,创建之后不能修改: 字符串的内容一旦修改,就会马上创建一个新的对象: 字符串实际为一个char value[]={'a','a'};数组: 2.==与equal判断字符串 ...
- [Java 基础]字符串
String类 实例化String对象 String 对象初始化方式有多种. 如下代码中,各种初始化方式的效果是一样的,初始化后,String 对象的内容为 "hello" . p ...
- java基础---字符串string
1.字符创的概念 java字符串就是Unicode字符序列.例如,串“Java\u2122”由5个Unicode字符J.a.v.a和TM.java没有内置的字符串类型,而是在标准库Java类库中提供了 ...
- Java基础——字符串构建器
StringBuilder类: 可以将许多小段的字符串构建一个字符串. StringBuilder builder = new StringBuilder(); //构造一个空的字符串构建器 buil ...
- Java基础——字符串String
String类 1. String类位于java.lang包中,使用时无需导包. 2. 创建字符串的两种方式: ① 直接指定(字面量声明):String str = "abc"; ...
- Java基础 -- 字符串(格式化输出、正则表达式)
一 字符串 1.不可变String String对象是不可变的,查看JDK文档你就会发现,String类中每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以包含修改后 ...
- Java基础 - 字符串 String
字符串就是用字符拼接成的文本值,字符串在存储上类似数组,在java语言中把字符串当做对象进行处理 创建字符串 package com.mingri.chapter_02; public class d ...
随机推荐
- 三种安装python第三方库的方法
还记得第一天的时候我们说python拥有丰富的库,那这么多的第三方库,我们如何使用呢?今天我们可以看一下python库的安装. 方法一:使用python命令进行离线安装 我以urllib5库 ...
- Java中多线程的使用(超级超级详细)线程安全原理解析 4
Java中多线程的使用(超级超级详细)线程安全 4 什么是线程安全? 有多个线程在同时运行,这些线程可能会运行相同的代码,程序运行的每次结果和单线程运行的结果是一样的,而且其他变量的值也和预期的值一样 ...
- 性能测试必备知识(2)- 查看 Linux 的 CPU 相关信息
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 查看系统 CPU 信息 cat /proc/ ...
- OSCP Learning Notes - Exploit(3)
Modifying Shellcode 1. Search “vulnserver exploit code” on the Internet. Find the following website ...
- 设计模式:bridge模式
目的:将“类的功能层次结构”和“类的实现层次结构”分类 类的功能层次:通过类的继承添加功能(添加普通函数) 类的实现层次:通过类的继承实现虚函数 理解:和适配器模式中的桥接方法相同 例子: class ...
- 循序渐进nginx(二):反向代理、负载均衡、缓存服务、静态资源访问
目录 反向代理 使用 1.创建代理目标服务端: 2.配置nginx反向代理目标服务端: 3.测试使用: 负载均衡 使用 1.准备服务端 2.修改nginx配置 3.测试 负载均衡策略 负载均衡的额外参 ...
- 分布式ID生成服务,真的有必要搞一个
目录 阐述背景 Leaf snowflake 模式介绍 Leaf segment 模式介绍 Leaf 改造支持RPC 阐述背景 不吹嘘,不夸张,项目中用到ID生成的场景确实挺多.比如业务要做幂等的时候 ...
- python为什么这么火?里面肯定是有原因的
因为人生苦短要用python啊! 看完本文,你将在结尾得到本文的一个福利彩蛋 你瞧瞧其他语言之父... Java之父——James Gosling PHP之父 ——Rasmus Lerdorf Obj ...
- EF批量插入太慢?那是你的姿势不对
大概所有的程序员应该都接触过批量插入的场景,我也相信任何的程序员都能写出可正常运行的批量插入的代码.但怎样实现一个高效.快速插入的批量插入功能呢? 由于每个人的工作履历,工作年限的不同,在实现这样的一 ...
- 旧的成功的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="htt ...