Java中的字符串操作

 

1. API文档

1.1. JDK API

1.1.1. 什么是 JDK API

API文档是用来我们了解JDK中提供的类库,我们可以先通过索引输入并找到我们需要了解的类,而后我们就可以方便的了解该类的作用,常量的作用,以及该类提供的所有方法的作用,以及方法的参数及返回值的含义。

1.1.2. JDK包结构

JDK包是由sun开发的一组已经实现的类库,里面有非常丰富的功能类。可以为我们的开发提供各种支持。

JDK根据提供的功能不同,将类库划分为若干个包,比如用于操作输入输出的java.io包,java程序语言设计基础类的java.lang包,提供各种数学运算的java.math包,基于网络应用的java.net包,以及一些共用程序类所在的java.util包等等。

1.2. 文档注释规范

1.2.1. 文档注释

通过注释提高Java源程序代码的可读性;使得Java程序条理清晰,易于区分代码行与注释行。另外通常在程序开头加入作者,时间,版本,要实现的功能等内容注释,方便后来的维护以及程序员的交流。

1.2.2. 文档注释规范

常用的文档注释规范有:

1、@author

用来标注该类的作者信息,例如:

/**
 * 这个是一个类
 * @author Xiloer
 *
 */

2、@deprecated

用来标注一个类、方法、变量已过时,不再建议使用。

/**
 * 这是一个普通方法,该方法具有设计缺陷,不建议再使用。
 * @deprecated
 */
public String sayHello(String name){
	return null;		
}

3、@since

用来标注从哪个版本开始启用,例如:

/**
 * 这是一个普通方法
 * @since 1.5.1
 */

4、@param

用来标注方法的参数说明,例如:

/**
 * 这是一个普通方法
 * @param name 该参数用来设置当前用户的名字
 */
public void setName(String name){
	.....
}

5、@return

用来标注方法的返回值说明,例如:

/**
 * 获取当前用户的用户名
 * @return  当前用户的用户名
 */
public String getName(){....}

1.2.3. javadoc命令生成文档

通过使用javadoc命令,可以将已经编写好的带有文档注释的类,或某个包下的所有类对应的生成一个API文档

2. 字符串基本操作

2.1. String及其常见API

2.1.1. String是不可变对象

由于字符串在实际开发中被广泛使用,那么在频繁使用某个字符串时,会出现频繁创建一个字符串对象的现象,java为此对字符串的使用采用了一个优化措施,使得Stirng对象为不可变对象,一旦在内存中创建,内容不能发生变化,若要对字符串内容改变,那么就会创建新对象。这样做的目的是可以最大程度的重用相同内容的字符串以减小系统资源的开销。那么字符串对象是如何做到重用的?我们通过2.1.2来了解

2.1.2. String常量池

上一节我们已经知道,JVM对字符串有一个限制,让字符串作为不变对象,这样就可以做到重用。事实上,当我们通过字面量,常量来初始化一个字符串时,JVM首先会从字符串的常量池(一个JVM内部维护的内存区域,用来保存已经创建过的字符串对象)中查询用来保存该字符串的对象是否存在,若存在则直接引用,若不存在则创建该字符串对象并存入常量池,然后引用它。因为字符串内容不能改变,所以我们可以放心的重用他们。

2.1.3. 内存编码及长度

java存储每一个字符均使用2个字节保存,使用的是Unicode编码。并且任何一个字符(无论是英文还是汉字)每个字符的长度都是1。所以字符串的长度就是该字符串所有的字符个数。

int length():返回当前字符串的长度。

例如:

  String str = "HelloWorld";
  System.out.println(str.length());//10


2.1.4. 使用indexOf实现检索

int indexOf(int ch):用来检查给定的一个字符在当前字符串中第一次出现的下标位置。这里的下标和数组的下标意思相近,0表示该字符串的第1个字符,以此类推。当该字符串中并不包含给定的字符时,那么该方法返回-1。

例如:

  String str = "HelloWorld";
  System.out.println(str.indexOf('W'));//5
  System.out.println(str.indexOf('h'))//-1


2.1.5. 使用substring获取子串

String substring(int begin,int end):用来截取当前字符串的部分内容以获取这个子字符串。我们只需要传入两个整数,一个用来表示从哪里开始,另一个用来表示截取到哪里。这里的位置要使用字符串的下标来表示,并且要注意,这两个数字表示的范围是“含头不含尾的”,换句话说就是包含开始下标的字符,但是不包含结束下标的字符。

例如:

  String str = "HelloWorld";
  String subStr = str.substring(0,5);  
  System.out.println(subStr)//Hello


2.1.6. trim

String trim():将字符串两边的空白(空白有很多种,空格是其中之一)去除掉,并将去除后的新字符串返回给我们。

例如:

	String str ="  Hello   World		";
	String trim = str.trim();
	System.out.println(trim);// Hello   World


2.1.7. charAt

char charAt(int index):用于给定一个下标位置,来获取该字符串中这个位置的字符。

例如:

	String str = "HelloWorld";
	char chr = str.charAt(5);
	System.out.println(chr);//W


2.1.8. startsWith和endsWith

boolean startsWith(String suffix):用来判断当前字符串是否是以给定的字符串开始的。这里要注意大小写是敏感的。

boolean endsWith(String suffix):用来判断当前字符串是否是以给定的字符串结尾的。

例如我们可以使用endsWith()就可以根据一个文件的名字来判断它是否是以".jpg",".gif"等字符串结尾来得知该文件是否为图片。

例如:

	String str = "java.jpg";
	if(str.endsWith(".jpg")){
		System.out.println("是一张图片");
	}else{
        System.out.println("不是一张图片");
	}


2.1.9. 大小写变换

String toUpperCase():用来将当前字符串中的英文部分的字符全部变为大写后再将新的字符串返回

String toLowerCase():用来将当前字符串中的英文部分的字符全部变为小写后再将新的字符串返回

例如,我们上网时长会要求我们输入验证码,图片中的英文可能是大写的,但我们输入时并不需要严格按照大小写输入却依旧可以验证成功。这就得力于该方法。我们可以将输入的验证码全部转换为大写,在将图片中显示的内容也全部转换为大写后再比较即可。

例如:

	String str = "HelloWorld";
	String lower = str.toLowerCase();
	String upper = str.toUpperCase();
	System.out.println("lower:"+lower);//helloworld
	System.out.println("upper:"+upper);//HELLOWORLD


2.1.10. valueOf

字符串提供了很多重载的valueOf()方法,可以将其他基本类型的值以字符串的形式描述。

  • static String valueOf(int i): 返回 int 参数的字符串表示形式
  • static String valueOf(boolean b): 返回 boolean 参数的字符串表示形式
  • static String valueOf(char c): 返回 char 参数的字符串表示形式
  • static String valueOf(double d): 返回 double 参数的字符串表示形式
  • static String valueOf(char[] c): 返回 char 数组参数的字符串表示形式
  • static String valueOf(char[] c,int offset,int count): 返回 char 数组参数的特定子数组的字符串表示形式。
  • static String valueOf(float): 返回 float 参数的字符串表示形式
  • static String valueOf(long l): 返回 long 参数的字符串表示形式
  • static String valueOf(Object o): 返回 Object 参数的字符串表示形式

例如:

	double pi = 3.1415926;	
    int value = 123;
	boolean flag = true;
	char[] charArr = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }; 

	String str = String.valueOf(pi);
	System.out.println(str); 

	str = String.valueOf(value);
	System.out.println(str); 

	str = String.valueOf(flag);
	System.out.println(str); 

	str = String.valueOf(charArr);
	System.out.println(str);


2.2. StringBuilder及其常用API

2.2.1. StringBuilder封装可变字符串

String类我们已经得知,它是不变对象,那么每当对内容修改时都会引发新对象的创建。那么当我们有一个需求是需要频繁修改字符串时,这样不仅不能减少内存的开销,返回会增加内存的开销。为此java为我们提供了一个专门用于修改字符串内容的类:StringBuilder.

该类封装了可变的字符串,换句话说,当我们需要改变字符串内容时,并不会创建新对象,而是在原对象基础上进行修改。从而减小了内存的开销。

2.2.2. StringBuilder常用方法

StringBuilder类的常用方法有:

  • append(String str):追加字符串;
  • insert (int dstOffset,String s):插入字符串;
  • delete(int start,int end):删除字符串;
  • replace(int start,int end,String str): 替换字符串;
  • reverse():字符串反转。

2.2.3. StringBuilder

StringBuilder的很多方法的返回值均为StringBuilder类型。这些方法的返回语句均为:return this。

由于改变封装的字符序列后又返回了该对象的引用。可以按照如下简洁的方式书写代码:

    buf.append("ibm").append("java").insert(3, "oracle").replace(9, 13, "JAVA");
    System.out.println(buf.toString());

2.2.4. 使用append实现追加

StringBuilder append(String):用于将给定的字符串追加到当前字符串末尾。

例如:

	StringBuilder builder = new StringBuilder("Hello");
	builder.append("World");	
	System.out.println(builder);//HelloWorld


2.2.5. 使用insert实现插入

StringBuilder insert(int offset, String str):用于将给定的字符串插入到指定的位置。这个位置也是字符串的下标。

例如:

	StringBuilder builder = new StringBuilder("HelloWorld");
	builder.insert(5,"!");	
	System.out.println(builder);//Hello!World

2.2.6. 使用delete实现删除

StringBuilder delete(int start,int end):用于删除给定字符串中的部分内容。需要传入两个参数,描述要删除的字符串的范围,同样这个范围是"含头不含尾的"

例如:

	StringBuilder builder = new StringBuilder("HelloWorld");
	builder.delete(0,5);	
	System.out.println(builder);// World


2.2.7. StringBuilder 总结

StringBuilder是可变字符串。字符串的内容计算,建议采用StringBuilder实现,这样性能会好一些。

java的字符串连接的过程是利用StringBuilder实现的,代码如下所示:

String s = "AB";  String s1 = s + "DE"+1;
String s1 = 
new StringBuilder(s).append("DE").append(1).toString();

StringBuffer 和StringBuilder的区别:

  • StringBuffer是线程安全的,同步处理的,性能稍慢;
  • StringBuilder是非线程安全的,并发处理的,性能稍快。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Closeable Closeable 是可以关闭的数据源或目标。 DataInput DataInput 接口用于从二进制流读取字节,并根据所有 Java 基本类型数据进行重构。 DataOutput DataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流。 Externalizable Externalizable 实例类的唯一特性是可以被写入序列化流,该类负责保存和恢复实例内容。 FileFilter 用于抽象路径名的过滤器。 FilenameFilter 实现此接口的类实例可用于过滤器文件名。 Flushable Flushable 是可刷新数据的目标地。 ObjectInput ObjectInput 扩展 DataInput 接口以包含对象的读操作。 ObjectInputValidation 允许验证图形对象的回调接口。 ObjectOutput ObjectOutput 扩展 DataOutput 接口以包含对象的写入操作。 ObjectStreamConstants 写入 Object Serialization Stream 的常量。 Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。 类摘要 BufferedInputStream BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。 BufferedOutputStream 该类实现缓冲的输出流。 BufferedReader 从字符输入流读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 ByteArrayInputStream ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流读取的字节。 ByteArrayOutputStream 此类实现了一个输出流,其的数据被写入一个 byte 数组。 CharArrayReader 此类实现一个可用作字符输入流的字符缓冲区。 CharArrayWriter 此类实现一个可用作 Writer 的字符缓冲区。 Console 此类包含多个方法,可访问与当前 Java 虚拟机关联的基于字符的控制台设备(如果有)。 DataInputStream 数据输入流允许应用程序以与机器无关方式从底层输入流读取基本 Java 数据类型。 DataOutputStream 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流。 File 文件和目录路径名的抽象表示形式。 FileDescriptor 文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。 FileInputStream FileInputStream 从文件系统的某个文件获得输入字节。 FileOutputStream 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。 FilePermission 此类表示对文件和目录的访问。 FileReader 用来读取字符文件的便捷类。 FileWriter 用来写入字符文件的便捷类。 FilterInputStream FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。 FilterOutputStream 此类是过滤输出流的所有类的超类。 FilterReader 用于读取已过滤的字符流的抽象类。 FilterWriter 用于写入已过滤的字符流的抽象类。 InputStream 此抽象类是表示字节输入流的所有类的超类。 InputStreamReader InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。 LineNumberInputStream 已过时。 此类错误假定字节能充分表示字符。 LineNumberReader 跟踪行号的缓冲字符输入流。 ObjectInputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。 ObjectInputStream.GetField 提供对从输入流读取的持久字段的访问权限。 ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。 ObjectOutputStream.PutField 提供对要写入 ObjectOutput 的持久字段的编程访问。 ObjectStreamClass 类的序列化描述符。 ObjectStreamField Serializable 类 Serializable 字段的描述。 OutputStream 此抽象类是表示输出字节流的所有类的超类。 OutputStreamWriter OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流的字符编码成字节。 PipedInputStream 管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。 PipedOutputStream 可以将管道输出流连接到管道输入流来创建通信管道。 PipedReader 传送的字符输入流。 PipedWriter 传送的字符输出流。 PrintStream PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。 PrintWriter 向文本输出流打印对象的格式化表示形式。 PushbackInputStream PushbackInputStream 为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。 PushbackReader 允许将字符推回到流的字符流 reader。 RandomAccessFile 此类的实例支持对随机访问文件的读取和写入。 Reader 用于读取字符流的抽象类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值