首页 Java java教程 Java编程中的字符串的进阶使用

Java编程中的字符串的进阶使用

Jan 16, 2017 am 10:59 AM

JAVA虽然是在C++基础上发展而来,但却对C++的许多缺陷有所改进,其中一个不得不提的就是字符串,我们知道,随着学习的深入,进入MFC时,当处理字符串或字符时,常会需要通过_T()宏将字符或字符串变成UNICODE型,否则,会在处理中出现BUG,而在JAVA中,字符char或存储在Character类中的字符,不是一个字节,而是2个字节,采用UNICODE,这是为了支持全世界上的所有字符。

        字符的序列组成字符串,有两种类型的字符串:一种是创建以后不需要修改的,称为字符串常量,在JAVA中,用String类存储;
     一种是创建以后需要对其进行修改的,称为字符串变量,在JAVA中,用StringBuffer类操作和管理。

 StringBuffer类

1、创建StringBuffer类对象

     StringBuffer类对象表示的是字符串变量(注意是"变量"),每一个StringBuffer类对象都是可以扩充和修改的字符串变量。以下是常用的StringBuffer类构造函数:

      (1)public StringBuffer()

       创建一个新的空的StringBuffer类的对象,其容量初值设置成16个字符(注意是16个字符)

   (2)public StringBuffer(int length)

       创建一个新的空的StringBuffer类的对象,其容量初值设置成length个字符

    (3)public StringBuffer(String str)

       创建一个新的StringBuffer类的对象,其内容为str的内容,容量设置成str长度再加16个字符 (注意:再加上16个字符)


2、StringBuffer类对象的常用方法

     (1)StringBuffer类对象的扩充

         StringBuffer类提供两组方法用来扩充StringBuffer对象所包含的字符,分别是:

        1)public StringBuffer append

                            (Object  obj)

          append方法用于扩充StringBuffer对象所包含的字符,该方法将指定的参数对象转化为字符串后,将其附加在原来的StringBuffer对象之后,并返回新的StringBuffer对象。附加的的参数对象可以是各种数据类型的,如int、char、String、double等。

2)public StringBuffer insert(

        int插入位置offset,参数对象类型,参数对象名)

    该方法将指定的参数对象转化为字符串后,将其插入在原来的StringBuffer对象中指定的位置,并返回新的StringBuffer对象。

    (2)StringBuffer类对象的长度与容量

    一个StringBuffer类对象的长度指的是它包含的字符个数;容量指的是被分配的字符空间的数量。

     1)public int length()

        该方法返回当前StringBuffer类对象包含的字符个数。

    2)public int capacity()

   该方法返回当前StringBuffer类对象分配的字符空间的数量。
(3)StringBuffer类对象的修改

   public void setCharAt(intindex,charch)

     该方法将当前StringBuffer对象中的index位置的字符替换为指定的字符ch。

    (4)字符串的赋值和加法

      字符串是在程序中要经常使用的数据类型,在Java编译系统中引入了字符串的赋值和加法操作。

   (5)其它方法类似String类的方法
3、利用StringTokenizer类分解字符串

StringTokenizer类位于java.util包中, 在使用该类时在程序开始加上

importjava.util.StringTokenizer或

importjava.util.*

StringTokenizer类

对于StringTokenizer类,其主要作用是将字符串按照给定的分割符进行分割,其功能和String类的split方法类似

1、StringTokenizer类的构造函数

(1)StringTokenizer(Stringstr)

         为给定的字符串str创建一个StringTokenizer对象,其分隔符默认设置为“\t\n\r\f”,亦即:空格、水平制表符tab、换行、回车、表格符

(2)StringTokenizer(String str,String delim)

              为给定的字符串str创建一个StringTokenizer对象,其分隔符为指定的字符串delim,默认不包含分隔符

 


3)StringTokenizer(String str,String delim,boolean returnDelims)

             为给定的字符串str创建一个StringTokenizer对象,其分隔符为指定的字符串delim,如果returnDelims为true,则创建的StringTokenizer对象中的每个字符串包含有分隔符,否则不包含分隔符

2、StringTokenizer类的常用方法

nIntcountTokens()
返回StringTokenizer对象中被分割后子字符串的个数
nBooleanhasMoreElements()
该方法的功能和hasMoreTokens()方法的功能一样
nBooleanhasMoreTokens()
检测StringTokenizer对象中是否包含分割好的子字符串,有则返回true,否则返回false
ObjectnextElement()

该方法具有nextToken()一样的功能,主要区别是它返回的不是String对象,而是一个Object对象

StringnextToken()

返回StringTokenizer对象中下一个分割好的子字符串

StringnextToken(String delim)

返回StringTokenizer对象中下一个分割好的子字符串,但是分隔符被重新设定为delim

n其实在有些编程语言中,比如C语言,其字符串就是由字符数组构成的,每个字符串的结尾用“\0”标志,但是在Java中却不是这样的。
n在Java中,字符串通常是作为String类的对象存在着,如:Strings=“I like Java!”,其中“Ilike Java!”就是一个对象。
所以说,Java中的字符串和字符数组是完全不相同的,和C语言中的字符串也是不一样的!

 


n为了方便字符串和字符数组的转换,在String类中提供了许多这样的构造函数和方法
n如构造函数String(char[] value)
n方法toCharArray()
方法valueOf(char[] data)


常量池

对于源程序中出现的字符串常量,当程序运行时,会统一保存到一个常量池中进行缓存。
对引用这些缓存在常量池中的字符串的变量进行比较,用==也会得到正确的结果。

但在运行时,对字符串的各种操作如+、substring等等,都是会产生新的字符串对象的。
但是强大的编译器会对字符串常量的拼接进行优化,诸如s3 = "hell" + "o"时,s3仍然会
指向常量池中的字符串。但对于变量的运算,总不能要求虚拟机执行诸如s1 + s2时还要
判断结果是否已在常量池中了吧。因此,要用equals而非==去判断两个字符串是否相等。

public static void main(String[] args) { 
  
 // String constants are put in constant pool. 
 String s1 = "hello"; 
 String s2 = "hello"; 
 String s3 = "hell" + "o"; 
 System.out.println(s1 == s2); 
 System.out.println(s1 == s3); 
   
 // Operation like +,substring on string create new one. 
 String s4 = "hell"; 
 String s5 = s4 + "o"; 
 System.out.println(s1 == s5); 
 System.out.println(s1.equals(s5)); 
   
 // substring has special handle on substring(0) 
 String s6 = s1.substring(0); 
 System.out.println(s1 == s6); 
}
登录后复制

测试代码s1、s2、s3的字节码:

0: ldc #16; //String hello
2: astore_1
3: ldc #16; //String hello
5: astore_2
6: ldc #16; //String hello
8: astore_3

测试代码s4、s5的字节码:

41: ldc #30; //String hell
43: astore 4
45: new #32; //class java/lang/StringBuilder
48: dup
49: aload 4
51: invokestatic #34; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
54: invokespecial #40; //Method java/lang/StringBuilder."":(Ljava/lang/String;)V
57: ldc #43; //String o
59: invokevirtual #45; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
62: invokevirtual #49; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

注意一点是substring方法,substring(0,3)是得到从字符0到2的字符串。这样设计的原因
也许是这样容易计算子串的长度,3-0=3。同时substring对于特殊参数有特别的优化处理:

public String substring(int beginIndex, int endIndex) { 
 if (beginIndex < 0) { 
  throw new StringIndexOutOfBoundsException(beginIndex); 
 } 
 if (endIndex > count) { 
  throw new StringIndexOutOfBoundsException(endIndex); 
 } 
 if (beginIndex > endIndex) { 
  throw new StringIndexOutOfBoundsException(endIndex - beginIndex); 
 } 
 return ((beginIndex == 0) && (endIndex == count)) ? this : 
  new String(offset + beginIndex, endIndex - beginIndex, value); 
}
登录后复制

由此看出,String对象背后并没有什么神奇之处,对字节码有了些了解可以更好的理解它。
其实常量池中还保存类及其方法的很多信息,如包名、类名、方法签名等等,有兴趣可以深入研究。

更多Java编程中的字符串的进阶使用相关文章请关注PHP中文网!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Java的类负载机制如何起作用,包括不同的类载荷及其委托模型? Java的类负载机制如何起作用,包括不同的类载荷及其委托模型? Mar 17, 2025 pm 05:35 PM

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存? 如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存? Mar 17, 2025 pm 05:44 PM

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射? 如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射? Mar 17, 2025 pm 05:43 PM

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案? 如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案? Mar 17, 2025 pm 05:46 PM

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)? 如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)? Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

See all articles