`

对String类的一些认识

阅读更多
可能以前一直对String类的一些认识不太够,所以感觉一直都不是很懂,最近看书,有了一些新的认识,所以记下来
在Java中,字符串是做为String类的实例出现的,其实字符串就是字符数组,
首先String对象有几个基本的方法,如
 
  1. public class StringDemo {   
  2.     public static void main(String[] args) {   
  3.         String text = "hello";   
  4.    
  5.         System.out.println("字符串内容:" + text);   
  6.         System.out.println("字符串长度:" + text.length());   
  7.         System.out.println("等于hello?" +   
  8.                                  text.equals("hello"));   
  9.         System.out.println("转为大写:" +   
  10.                                  text.toUpperCase());   
  11.         System.out.println("转为小写:" +   
  12.                                  text.toLowerCase());   
  13.     }   
  14. }   

这很好理解,就不多说了,
因为字符串的本质就是字符数组,这样也就具有了数组索引的性质,如
 
  1. public class CharAtString {   
  2.     public static void main(String[] args) {   
  3.         String text = "One's left brain has nothing right.\n"   
  4.                  + "One's right brain has nothing left.\n";   
  5.    
  6.         System.out.println("字符串内容: ");   
  7.         for(int i = 0; i < text.length(); i++)   
  8.             System.out.print(text.charAt(i));   
  9.   
  10.         System.out.println("\n第一个left: " +   
  11.                               text.indexOf("left"));   
  12.         System.out.println("最后一个left: " +   
  13.                               text.lastIndexOf("left"));   
  14.    
  15.         char[] charArr = text.toCharArray();   
  16.         System.out.println("\n字符Array内容:");   
  17.         for(int i = 0; i < charArr.length; i++)   
  18.             System.out.print(charArr[i]);   
  19.     }   
  20. }  

这也很好理解,略过,String对象里还有个endsWith()方法蛮有意思的

接着我想说的是,

字符串是不可变的
一个字符串对象一旦被配置,它的内容就是固定不可变的,如
 
  1. String str = "Just";  
  2. str = "Justin";  
上面的语句并没有改变一个字符串对象的内容,事实上在这个程序片段中会有两个字符串对象,一个是Just字符串对象, 一个是Justin字符串对象,两个是不同的字符串对象,
在Java中,使用"="将一个字符串对象指定给一个变量名称, 其意义为改变该名称所引用的对象,原来被引用的字符串对象若没有其它名称来引用它,就会在适当的时候被Java的"垃圾回收"机制回收.
在Java执行时会维护一个String Pool,对于一些可以共享的字符串对象,会先在String Pool中查找是否存在相同的String内容,如果有就直接返回,而不是直接创造一个新的String对象,以减少内存的耗用,
如果在程序中使用下面的方式来声明,则实际上是指向同一个字符串对象:
 
  1. String str1 = "flyweight";  
  2. String str2 = "flyweight";  
  3. System.out.println(str1 == str2);  

其结果会
 
  1. true  

注:   在Java中,如果==被使用于两个对象类型的变量,它是用于比较两个变量是否引用自同一对象.

在这还要提一上String的intern()方法,如
 
  1. public class InternString {   
  2.     public static void main(String[] args) {   
  3.         String str1 = "fly";   
  4.         String str2 = "weight";   
  5.         String str3 = "flyweight";   
  6.         String str4 = null;   
  7.   
  8.         str4 = str1 + str2;  
  9.         System.out.println(str3 == str4);   
  10.   
  11.         str4 = (str1 + str2).intern();   
  12.         System.out.println(str3 == str4);   
  13.     }   
  14. }  

其结果为
 
  1. false  
  2. true  

在Java中使用 + 串联字符串会产生一个新的字符串对象,所以在第一次比较str3 与 str4对象是否为同一个对象时,结果为false,

然, intern()方法会先检查String Pool中是否存在字符部分相同的字符串对象,如果有就返回,由于程序中之前已经声明flyweight字符串对象,intern()方法在String Pool中发现了它,所以直接返回,这时再比较,str3 与 str4 就指向同一个对象了,所以结果为true

另外提一点:
 
  1. String str1 = new String("hello");  
  2. String str2 = new String("hello");  
  3. // System.out.println(str1 == str2);  
  4. System.out.println(str1.equals(str2);  

如上,这才产生了两个不同的String对象,使用 == 在这是用来比较两个字符串对象是否指向同一对象的,要比较两个字符串对象内容是否相同要使用equals()方法

接下来我想说一下StringBuilder类的使用
这是在jdk5.0中新增的一个类,
一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符至String对象中,也许可以使用 + 来串联字符串以达到目的,但 + 会产生一个新的String对象, 如果程序对这种附加字符串的需求很频繁, 并不建议用 + 来串联,这时候,StringBuilder就派上用场了,不过在之前的版本中的StringBuffer也可以实现同样的操作.这样就可以让程序的效率大大提高,
现给出证明代码

 
  1. public class AppendStringTest {  
  2.     public static void main(String[] args) {  
  3.         String text = "";  
  4.   
  5.         long beginTime = System.currentTimeMillis();  
  6.         for(int i = 0; i < 10000; i++)  
  7.             text = text + i;  
  8.         long endTime = System.currentTimeMillis();  
  9.         System.out.println("执行时间:" + (endTime - beginTime));  
  10.   
  11.         StringBuilder builder = new StringBuilder("");  
  12.         beginTime = System.currentTimeMillis();  
  13.         for(int i = 0; i < 10000; i++)  
  14.             builder.append(String.valueOf(i));  
  15.         endTime = System.currentTimeMillis();  
  16.         System.out.println("执行时间:" + (endTime - beginTime));  
  17.     }  
  18. }  

其运行结果大概为:

 
  1. 执行时间: 4641  
  2. 执行时间: 16  

此差距是明显的,
说明一点的是,如果在单机非多线程的情况下使用StringBuilder会有较好的效率,因为StringBuilder没有处理同步问题
所以在多线程情况下就使用StringBuffer会好一些..

这就是我对String对象的一些认识,记下来而已..
分享到:
评论

相关推荐

    java自制string类例程

    总之,"java自制string类例程"是一个很好的实践项目,可以帮助初学者巩固对Java字符串概念的理解,提高编程技能,并对面向对象编程的核心原则有更深入的认识。在实际编程中,虽然我们通常使用内置的String类,但这种...

    一些常用的string的校验和测试类

    这篇博客“一些常用的string的校验和测试类”提供了一些实用的工具和源码,帮助我们更高效地处理字符串相关问题。 首先,我们需要了解什么是字符串校验。字符串校验通常是指对输入的字符串进行格式检查,以确保它们...

    C++实现String类实例代码

    在C++编程中,实现String类是一个常见的练习题,旨在考查程序员对类的构造、析构以及赋值等行为的理解程度。...通过对String类的实现,可以加深对类的封装性、数据隐藏、资源管理等面向对象基本概念的认识。

    Java第4章 认识类和对象.含源代码

    在Java编程语言中,类和对象是核心概念,它们构成了面向对象编程的基础。本章将深入探讨这两个概念,以及如何在实际编程中运用它们。...同时,通过练习编写和运行这些代码,你将深化对Java类和对象的理解。

    阶段性章节复习:String类的使用 以及与基本数据类型变量间的运算 认识进制 常用运算符回顾之算术运算符、赋值运算符

    这是近期练习过的JavaSE基础源代码,含义注释及说明,适合复习Java基础使用,欢迎有需要的朋友下载交流学习。另外,热门专栏“Python从入门到人工智能”持续更新中,欢迎大家订阅学习和交流。

    Java Object类认识

    因此,对`Object`类的理解是每个Java开发者的基本功。本文将深入探讨`Object`类,以及其核心方法`equals()`与Java中的`==`操作符之间的差异。 `Object`类位于Java的核心库`java.lang`包中,它提供了基本的方法来...

    认识Java的Class类.doc

    以下是对Java Class类的详细说明: 1. **Class类对象的创建**:在Java中,我们不能直接创建Class对象,因为它的构造函数是private的。当我们加载一个类时,Java虚拟机(JVM)会自动创建对应的Class对象。类的加载...

    认识类集、Collection接口

    Java集合框架还包含了一些直接或间接实现`Collection`接口的类,例如`ArrayList`、`LinkedList`、`HashSet`、`TreeSet`等。这些类提供了不同的性能特性和用途,比如: - **ArrayList**:基于数组实现,适合于随机...

    Javascript实例-String对象-唐诗三百首

    通过学习这个实例,不仅可以提升编程技能,还能增进对中国传统文化的认识。同时,这种结合文化背景的编程实践也体现了编程不仅仅是逻辑和算法,更是一种表达和传播文化的手段。 在提供的压缩包“练习-唐诗三百首”...

    第 04 节_GEE 的数据类型 (String, Number).pdf

    GEE(Google Earth Engine)是谷歌推出的一个云计算平台,主要用于处理和分析地球科学...通过本节的学习,我们应该已经了解了这两种数据类型在GEE中的基本用法和构建函数,并对GEE命令语言的基本语法有了初步的认识。

    Javascript string 扩展库代码

    比如C#和Java等语言,它们的String类提供了丰富的操作方法。这些方法可以给开发者提供灵感,以确定需要为JavaScript的String对象补充哪些功能。 ### 4. 编程风格 文章中提出了关于如何编写扩展库时的最佳编程风格...

    A First Course in String Theory

    物理学的发展历程中充满了统一事件,即不同现象被认识到是相互关联的,并通过调整理论来反映这种认识。其中最显著的例子之一发生在19世纪,当迈克尔·法拉第发现变化的磁场能够产生电场后,詹姆斯·克拉克·麦克斯韦...

    C++定义一个MyString类,实现两个字符串相加

    在本实验中,指针String、String1和String2用于存储字符串,需要正确地分配和释放内存,以防止内存错误。此外,通过实验,作者认识到理解和熟练掌握拷贝构造函数和深拷贝的重要性,以及灵活思考问题解决方案的必要性...

    让不懂编程的人爱上Unity3d游戏开发024-认识Unity3d的好基友C#07-C#中的类和方法.pdf

    在这个例子中,我们将定义一个“弓箭手”的类,并为其添加一些基本的属性和方法。 ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine; // 定义所有英雄的基类 public ...

    一起学习,一个小代码示例:类的声名.rar

    在编程世界中,类是面向对象编程的基础,...通过以上介绍,我们对类的声明有了全面的认识,包括其组成部分、语法结构以及在实际编程中的应用。继续深入学习面向对象编程,将有助于我们更好地设计和构建复杂的软件系统。

    串口编程中SerialPort类介绍以及应用

    在IT行业的嵌入式开发与通信领域中,串口编程是一项基本且重要的技能。...通过本文的介绍,相信读者已经对`SerialPort`类有了更为全面的认识,能够在未来的项目中更加得心应手地运用这一关键技术。

    c++ string

    很好的c++字符串参考手册,我就是通过它认识c++的强大的,并且学起来很有进

    PHP中simplexml_load_string函数使用说明

    通过这个函数的使用说明和示例,我们可以了解到PHP处理XML数据的灵活性和便利性,同时也认识到了在处理XML数据时需要注意的一些细节。simplexml_load_string函数是一个强大的工具,可以帮助开发者在应用程序中轻松地...

    Java语言认识训练

    Java语言是一种广泛应用于服务器端开发、移动应用、嵌入式设备和云计算等领域的...通过这些实验,初学者将对Java语言有基本的认识,为后续深入学习面向对象编程、异常处理、集合框架、多线程等高级主题打下坚实基础。

Global site tag (gtag.js) - Google Analytics