由字符组成的一串字符序列,称为“字符串”。

1.Java中的字符串
Java中的字符串是由双引号括起来的多个字符,下面示例都是表示字符串常量:
"Hello World"
"\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"
"世界你好"
"A"
""
注意:单个字符如果用双引号括起来,那它表示的是字符串,而不是字符了,"A"是表示字符串A,而不是字符A。
""表示空字符串,双引号中没有任何内容,空字符串不是null,空字符串是分配内存空间,而null是没有分配内存空间。
Java SE提供了三个字符串类:String、StringBuffer和StringBuilder。String是不可变字符串,StringBuffer和StringBuilder是可变字符串。

2.使用API文档
Java中很多类,每一个类又有很多方法和变量,通过查看Java API文档能够知道这些类、方法和变量如何使用。Java官方为Java SE提供了已经生成HTML的API文档。
Java官方提供了Java 8在线API文档,网址是http://docs.oracle.com/javase/8/docs/api/。
查询API的一般流程是:找包→找类或接口→查看类或接口→找方法或变量。

3.不可变字符串
很多计算机语言都提供了两种字符串,即不可变字符串和可变字符串,它们区别在于当字符串进行拼接等修改操作时,不可变字符串会创建新的字符串对象,而可变字符串不会创建新对象。

3.1 String
Java中不可变字符串类是String,属于java.lang包,它也是Java非常重要的类。

ava.lang包中提供了很多Java基础类,包括Object、Class、String和Math等基本类。在使用java.lang包中的类时不需要引入(import)该包,因为它是由解释器自动引入的。当然引入java.lang包程序也不会有编译错误。
创建String对象可以通过构造方法实现,常用的构造方法:
String():使用空字符串创建并初始化一个新的String对象。
String(String original):使用另外一个字符串创建并初始化一个新的 String 对象。
String(StringBuffer buffer):使用可变字符串对象(StringBuffer)创建并初始化一个新的 String 对象。
String(StringBuilder builder):使用可变字符串对象(StringBuilder)创建并初始化一个新的 String 对象。
String(byte[] bytes):使用平台的默认字符集解码指定的byte数组,通过byte数组创建并初始化一个新的 String 对象。
String(char[] value):通过字符数组创建并初始化一个新的 String 对象。
String(char[] value, int offset, int count):通过字符数组的子数组创建并初始化一个新的 String 对象;offset参数是子数组第一个字符的索引,count参数指定子数组的长度。
创建字符串对象示例代码如下:

// 创建字符串对象
String s1 = new String();
String s2 = new String("Hello World");
String s3 = new String("\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064");
System.out.println("s2 = " + s2);
System.out.println("s3 = " + s3);

char chars[] = { 'a', 'b', 'c', 'd', 'e' };
// 通过字符数组创建字符串对象
String s4 = new String(chars);
// 通过子字符数组创建字符串对象
String s5 = new String(chars, 1, 4);
System.out.println("s4 = " + s4);
System.out.println("s5 = " + s5);

byte bytes[] = { 97, 98, 99 };
// 通过byte数组创建字符串对象
String s6 = new String(bytes);
System.out.println("s6 = " + s6);
System.out.println("s6字符串长度 = " + s6.length());

输出结果:

s2 = Hello World
s3 = Hello World
s4 = abcde
s5 = bcde
s6 = abc
s6字符串长度 = 3

3.2 字符串池
获得字符串对象时可以直接使用字符串常量,但Java中对象是使用new关键字创建,字符串对象也可以使用new关键字创建,代码如下:

String s9 = "Hello";                //字符串常量
String s7 = new String("Hello");    //使用new关键字创建

使用new关键字与字符串常量都能获得字符串对象,但它们之间有一些区别。先看下面代码运行结果:

String s7 = new String("Hello");
String s8 = new String("Hello");

String s9 = "Hello";
String s10 = "Hello";

System.out.printf("s7 == s8 : %b%n", s7 == s8);
System.out.printf("s9 == s10: %b%n", s9 == s10);
System.out.printf("s7 == s9 : %b%n", s7 == s9);
System.out.printf("s8 == s9 : %b%n", s8 == s9);

输出结果:

s7 == s8 : false
s9 == s10: true
s7 == s9 : false
s8 == s9 : false

==运算符比较的是两个引用是否指向相同的对象,从上面的运行结果可见,s7和s8指的是不同对象,s9和s10指向的是相同对象。
Java中的不可变字符串String常量,采用字符串池(String Pool)管理技术,字符串池是一种字符串驻留技术。采用字符串常量赋值时,会字符串池中查找改字符串常量,如果已经存在把引用赋值给字符串,否则创建该字符串对象,并放到池中。根据此原理,可以推定s10与s9是相同的引用,指向同一个对象。但此原理并不适用于new所创建的字符串对象。

3.3 字符串拼接
String字符串虽然是不可变字符串,但也可以进行拼接只是会产生一个新的对象。String字符串拼接可以使用+运算符或String的concat(String str)方法。+运算符优势是可以连接任何类型数据拼接成为字符串,而concat方法只能拼接String类型字符串。

3.4 字符串查找
在给定的字符串中查找字符或字符串是比较常见的操作。在String类中提供了indexOf和lastIndexOf方法用于查找字符或字符串,返回值是查找的字符或字符串所在的位置,-1表示没有找到。这两个方法有多个重载版本:
int indexOf(int ch):从前往后搜索字符ch,返回第一次找到字符ch所在处的索引。
int indexOf(int ch, int fromIndex):从指定的索引开始从前往后搜索字符ch,返回第一次找到字符ch所在处的索引。
int indexOf(String str):从前往后搜索字符串str,返回第一次找到字符串所在处的索引。
int indexOf(String str, int fromIndex):从指定的索引开始从前往后搜索字符串str,返回第一次找到字符串所在处的索引。
int lastIndexOf(int ch):从后往前搜索字符ch,返回第一次找到字符ch所在处的索引。
int lastIndexOf(int ch, int fromIndex):从指定的索引开始从后往前搜索字符ch,返回第一次找到字符ch所在处的索引。
int lastIndexOf(String str):从后往前搜索字符串str,返回第一次找到字符串所在处的索引。
int lastIndexOf(String str, int fromIndex):从指定的索引开始从后往前搜索字符串str,返回第一次找到字符串所在处的索引。

提示:字符串本质上是字符数组,因此它也有索引,索引从零开始。String的charAt(int index)方法可以返回索引index所在位置的字符。

3.5 字符串比较
字符串比较是常见的操作,包括比较相等、比较大小、比较前缀和后缀等。
比较相等
String提供的比较字符串相等的方法:
boolean equals(Object anObject):比较两个字符串中内容是否相等。
boolean equalsIgnoreCase(String anotherString):类似equals方法,只是忽略大小写。
比较大小
有时不仅需要知道是否相等,还要知道大小,String提供的比较大小的方法:
int compareTo(String anotherString):按字典顺序比较两个字符串。如果参数字符串等于此字符串,则返回值 0;如果此字符串小于字符串参数,则返回一个小于 0 的值;如果此字符串大于字符串参数,则返回一个大于 0 的值。
int compareToIgnoreCase(String str):类似compareTo,只是忽略大小写。
比较前缀和后缀
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束。
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始。

3.6 字符串截取
Java中字符串String截取方法主要的方法如下:
String substring(int beginIndex):从指定索引beginIndex开始截取一直到字符串结束的子字符串。
String substring(int beginIndex, int endIndex):从指定索引beginIndex开始截取直到索引endIndex - 1处的字符,注意包括索引为beginIndex处的字符,但不包括索引为endIndex处的字符。

4.可变字符串
可变字符串在追加、删除、修改、插入和拼接等操作不会产生新的对象。

4.1 StringBuffer和StringBuilder
Java提供了两个可变字符串类StringBuffer和StringBuilder,中文翻译为“字符串缓冲区”。
StringBuffer是线程安全的,它的方法是支持线程同步,线程同步会操作串行顺序执行,在单线程环境下会影响效率。StringBuilder是StringBuffer单线程版本,Java 5之后发布的,它不是线程安全的,但它的执行效率很高。

StringBuffer和StringBuilder具有完全相同的API,即构造方法和普通方法等内容一样。StringBuilder的中构造方法有4个:
StringBuilder():创建字符串内容是空的StringBuilder对象,初始容量默认为16个字符。
StringBuilder(CharSequence seq):指定CharSequence字符串创建StringBuilder对象。CharSequence接口类型,它的实现类有:String、StringBuffer和StringBuilder等,所以参数seq可以是String、StringBuffer和StringBuilder等类型。
StringBuilder(int capacity):创建字符串内容是空的StringBuilder对象,初始容量由参数capacity指定的。
StringBuilder(String str):指定String字符串创建StringBuilder对象。
上述构造方法同样适合于StringBuffer类,这里不再赘述。

提示:字符串长度和字符串缓冲区容量区别。字符串长度是指在字符串缓冲区中目前所包含字符串长度,通过length()获得;字符串缓冲区容量是缓冲区中所能容纳的最大字符数,通过capacity()获得。当所容纳的字符超过这个长度时,字符串缓冲区自动扩充容量,但这是以牺牲性能为代价的扩容。

4.2字符串追加
StringBuilder在提供了很多修改字符串缓冲区的方法,追加、插入、删除和替换等。字符串追加方法是append,append有很多重载方法,可以追加任何类型数据,它的返回值还是StringBuilder。StringBuilder的追加法与StringBuffer完全一样,这里不再赘述。

4.3字符串插入、删除和替换
StringBuilder中实现插入、删除和替换等操作的常用方法说明如下:
StringBuilder insert(int offset, String str):在字符串缓冲区中索引为offset的字符位置之前插入str,insert有很多重载方法,可以插入任何类型数据。
StringBuffer delete(int start, int end):在字符串缓冲区中删除子字符串,要删除的子字符串从指定索引start开始直到索引end - 1处的字符。start和end两个参数与substring(int beginIndex, int endIndex)方法中的两个参数含义一样。
StringBuffer replace(int start, int end, String str)字符串缓冲区中用str替换子字符串,子字符串从指定索引start开始直到索引end - 1处的字符。start和end同delete(int start, int end)方法。
以上介绍的方法虽然是StringBuilder方法,但StringBuffer也完全一样,这里不再赘述。

Java基础(7)字符串相关推荐

  1. java基础-String字符串字符长度校验

    java基础-String字符串字符长度校验 /*** 校验字符串是否在规定字符数内* @param str* @param maxLength* @return*/ public static bo ...

  2. 【Java 基础】字符串StringBuilder、StringBuffer,工具StringJoiner

    字符串StringBuilder.StringBuffer,工具StringJoiner 一.概述 二.StringBuilder 三.StringBuffer 三.StringBuilder .St ...

  3. 八门神器java版本_【修改教程】java基础知识字符串处理_八门神器

    [Java基础知识]字符串处理1.获取字符串的长度 String s = "AIDE"; System.out.println(s "长度为:" s.lengt ...

  4. 【Java 基础】字符串(String、StringBuilder),日期(Date、SimpleDateFormat、Calendar)

    字符串.日期 字符串(String) 字符串常量池(String Constant Pool) 字符串的初始化 intern 方法 字符串的常用方法(截取) 可变字符串(StringBuilder) ...

  5. java基础之字符串

    除了数字和java关键字外,其他的由多个字符组成的一串字符,都可以叫做字符串.在java中,字符串需要用双引号引起来. 使用String对象存储字符串 String s = "Hello W ...

  6. Java基础篇——字符串处理(String,StringBuffer,StringBuild)

    提前说明本次的文章很长但是很有用,有耐心看完的必定不是凡人,必定会有很大的收获.本人在总结的过程中也收获了很多的知识,希望我们可以一起学习.写下这篇文章完全是抱着可以帮助到他人的态度. 虽然要写出很高 ...

  7. 【Java基础】字符串与数组

    字符串创建于存储机制 字符串的声明和初始化的两种情形: 1. str1 = "abc"; str2 = "abc";在JVM中存在着一个常量池,其中保存着很多的 ...

  8. Java基础知识----字符串

    一.创建字符串 1.声明字符串 在Java语言中的字符串必须在一对" "(双引号)之内. 例如: "33"."Hello"."世界 ...

  9. qstring 字符相同 不相等_我的编程手册 -- Java 基础篇·字符串 String

    在程序开发中,我们最常用的就是字符串,我们经常声明或初始化各类字符串. 针对String 类型的字符串,a=null,说明其不指向内存区任何一个字符串,但是a=""不同,其指向内存 ...

  10. Java基础之字符串String:

    String ----------------------------------------------------------------------------------------- 一.S ...

最新文章

  1. IIS的虚拟目录和子应用程序
  2. 开发日记-20190902 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 7
  3. 编程之美-24点游戏方法整理
  4. 活动 | 玩转“视”界杯 —— 2018 上半年广告数据分析及短视频分享
  5. mxnet基础到提高(10)--读写文件
  6. c++关联容器的成员函数find的一个例子
  7. 从struts2拦截器到自定义拦截器
  8. 常用类一一枚举类一一定义和调用
  9. 开机出现 Invalid Partition Table 怎么办
  10. python官方下载电脑版-Python for windows
  11. underscore 系列之内部函数 restArgs
  12. 【转】Java程序员最常用的8个Java日志框架
  13. sketchup草图家具拆单软件 衣柜橱柜拆单 SU 全屋定制拆单 有屋软件 下料机
  14. 微信小程序选项卡demo
  15. zemax---System Explorer(系统选项)
  16. linux下dbf是什么文件,dbf是什么文件?dbf文件怎么读取
  17. 七千年来被国人误解的七句古话
  18. 机器学习(周志华) 第一章 引言
  19. 12-16 云计算平台基础架构
  20. 帝国CMS插件自动采集发布文章插件

热门文章

  1. 公羊优链蜘蛛池【高权重】(白狐 公羊seo)
  2. js 中英文混合字符串 截取固定长度字节 方法封装
  3. 软件测试流程有哪些?
  4. Form表单及模板引擎
  5. python list[list] or list[list, list, list]
  6. 深度学习(二)---算法岗面试题
  7. 2020.3.13 美国数学大联盟杯赛复赛成绩出来了
  8. 计算机及其应用本课程,北京08自考计算机及应用(独本)课程设置
  9. Qt实现mqtt客户端和mqtt服务器搭建
  10. php 上传图片方法