可能以前一直对String类的一些认识不太够,所以感觉一直都不是很懂,最近看书,有了一些新的认识,所以记下来
在Java中,字符串是做为String类的实例出现的,其实字符串就是字符数组,
首先String对象有几个基本的方法,如
- public class StringDemo {
- public static void main(String[] args) {
- String text = "hello";
-
- System.out.println("字符串内容:" + text);
- System.out.println("字符串长度:" + text.length());
- System.out.println("等于hello?" +
- text.equals("hello"));
- System.out.println("转为大写:" +
- text.toUpperCase());
- System.out.println("转为小写:" +
- text.toLowerCase());
- }
- }
这很好理解,就不多说了,
因为字符串的本质就是字符数组,这样也就具有了数组索引的性质,如
- public class CharAtString {
- public static void main(String[] args) {
- String text = "One's left brain has nothing right.\n"
- + "One's right brain has nothing left.\n";
-
- System.out.println("字符串内容: ");
- for(int i = 0; i < text.length(); i++)
- System.out.print(text.charAt(i));
-
- System.out.println("\n第一个left: " +
- text.indexOf("left"));
- System.out.println("最后一个left: " +
- text.lastIndexOf("left"));
-
- char[] charArr = text.toCharArray();
- System.out.println("\n字符Array内容:");
- for(int i = 0; i < charArr.length; i++)
- System.out.print(charArr[i]);
- }
- }
这也很好理解,略过,String对象里还有个endsWith()方法蛮有意思的
接着我想说的是,
字符串是不可变的
一个字符串对象一旦被配置,它的内容就是固定不可变的,如
- String str = "Just";
- str = "Justin";
上面的语句并没有改变一个字符串对象的内容,事实上在这个程序片段中会有两个字符串对象,一个是Just字符串对象, 一个是Justin字符串对象,两个是不同的字符串对象,
在Java中,使用"="将一个字符串对象指定给一个变量名称, 其意义为改变该名称所引用的对象,原来被引用的字符串对象若没有其它名称来引用它,就会在适当的时候被Java的"垃圾回收"机制回收.
在Java执行时会维护一个String Pool,对于一些可以共享的字符串对象,会先在String Pool中查找是否存在相同的String内容,如果有就直接返回,而不是直接创造一个新的String对象,以减少内存的耗用,
如果在程序中使用下面的方式来声明,则实际上是指向同一个字符串对象:
- String str1 = "flyweight";
- String str2 = "flyweight";
- System.out.println(str1 == str2);
其结果会
注: 在Java中,如果==被使用于两个对象类型的变量,它是用于比较两个变量是否引用自同一对象.
在这还要提一上String的intern()方法,如
- public class InternString {
- public static void main(String[] args) {
- String str1 = "fly";
- String str2 = "weight";
- String str3 = "flyweight";
- String str4 = null;
-
- str4 = str1 + str2;
- System.out.println(str3 == str4);
-
- str4 = (str1 + str2).intern();
- System.out.println(str3 == str4);
- }
- }
其结果为
在Java中使用 + 串联字符串会产生一个新的字符串对象,所以在第一次比较str3 与 str4对象是否为同一个对象时,结果为false,
然, intern()方法会先检查String Pool中是否存在字符部分相同的字符串对象,如果有就返回,由于程序中之前已经声明flyweight字符串对象,intern()方法在String Pool中发现了它,所以直接返回,这时再比较,str3 与 str4 就指向同一个对象了,所以结果为true
另外提一点:
- String str1 = new String("hello");
- String str2 = new String("hello");
-
- System.out.println(str1.equals(str2);
如上,这才产生了两个不同的String对象,使用 == 在这是用来比较两个字符串对象是否指向同一对象的,要比较两个字符串对象内容是否相同要使用equals()方法
接下来我想说一下StringBuilder类的使用
这是在jdk5.0中新增的一个类,
一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符至String对象中,也许可以使用 + 来串联字符串以达到目的,但 + 会产生一个新的String对象, 如果程序对这种附加字符串的需求很频繁, 并不建议用 + 来串联,这时候,StringBuilder就派上用场了,不过在之前的版本中的StringBuffer也可以实现同样的操作.这样就可以让程序的效率大大提高,
现给出证明代码
- public class AppendStringTest {
- public static void main(String[] args) {
- String text = "";
-
- long beginTime = System.currentTimeMillis();
- for(int i = 0; i < 10000; i++)
- text = text + i;
- long endTime = System.currentTimeMillis();
- System.out.println("执行时间:" + (endTime - beginTime));
-
- StringBuilder builder = new StringBuilder("");
- beginTime = System.currentTimeMillis();
- for(int i = 0; i < 10000; i++)
- builder.append(String.valueOf(i));
- endTime = System.currentTimeMillis();
- System.out.println("执行时间:" + (endTime - beginTime));
- }
- }
其运行结果大概为:
此差距是明显的,
说明一点的是,如果在单机非多线程的情况下使用StringBuilder会有较好的效率,因为StringBuilder没有处理同步问题
所以在多线程情况下就使用StringBuffer会好一些..
这就是我对String对象的一些认识,记下来而已..
分享到:
相关推荐
总之,"java自制string类例程"是一个很好的实践项目,可以帮助初学者巩固对Java字符串概念的理解,提高编程技能,并对面向对象编程的核心原则有更深入的认识。在实际编程中,虽然我们通常使用内置的String类,但这种...
这篇博客“一些常用的string的校验和测试类”提供了一些实用的工具和源码,帮助我们更高效地处理字符串相关问题。 首先,我们需要了解什么是字符串校验。字符串校验通常是指对输入的字符串进行格式检查,以确保它们...
在C++编程中,实现String类是一个常见的练习题,旨在考查程序员对类的构造、析构以及赋值等行为的理解程度。...通过对String类的实现,可以加深对类的封装性、数据隐藏、资源管理等面向对象基本概念的认识。
在Java编程语言中,类和对象是核心概念,它们构成了面向对象编程的基础。本章将深入探讨这两个概念,以及如何在实际编程中运用它们。...同时,通过练习编写和运行这些代码,你将深化对Java类和对象的理解。
这是近期练习过的JavaSE基础源代码,含义注释及说明,适合复习Java基础使用,欢迎有需要的朋友下载交流学习。另外,热门专栏“Python从入门到人工智能”持续更新中,欢迎大家订阅学习和交流。
因此,对`Object`类的理解是每个Java开发者的基本功。本文将深入探讨`Object`类,以及其核心方法`equals()`与Java中的`==`操作符之间的差异。 `Object`类位于Java的核心库`java.lang`包中,它提供了基本的方法来...
以下是对Java Class类的详细说明: 1. **Class类对象的创建**:在Java中,我们不能直接创建Class对象,因为它的构造函数是private的。当我们加载一个类时,Java虚拟机(JVM)会自动创建对应的Class对象。类的加载...
Java集合框架还包含了一些直接或间接实现`Collection`接口的类,例如`ArrayList`、`LinkedList`、`HashSet`、`TreeSet`等。这些类提供了不同的性能特性和用途,比如: - **ArrayList**:基于数组实现,适合于随机...
通过学习这个实例,不仅可以提升编程技能,还能增进对中国传统文化的认识。同时,这种结合文化背景的编程实践也体现了编程不仅仅是逻辑和算法,更是一种表达和传播文化的手段。 在提供的压缩包“练习-唐诗三百首”...
GEE(Google Earth Engine)是谷歌推出的一个云计算平台,主要用于处理和分析地球科学...通过本节的学习,我们应该已经了解了这两种数据类型在GEE中的基本用法和构建函数,并对GEE命令语言的基本语法有了初步的认识。
比如C#和Java等语言,它们的String类提供了丰富的操作方法。这些方法可以给开发者提供灵感,以确定需要为JavaScript的String对象补充哪些功能。 ### 4. 编程风格 文章中提出了关于如何编写扩展库时的最佳编程风格...
物理学的发展历程中充满了统一事件,即不同现象被认识到是相互关联的,并通过调整理论来反映这种认识。其中最显著的例子之一发生在19世纪,当迈克尔·法拉第发现变化的磁场能够产生电场后,詹姆斯·克拉克·麦克斯韦...
在本实验中,指针String、String1和String2用于存储字符串,需要正确地分配和释放内存,以防止内存错误。此外,通过实验,作者认识到理解和熟练掌握拷贝构造函数和深拷贝的重要性,以及灵活思考问题解决方案的必要性...
在这个例子中,我们将定义一个“弓箭手”的类,并为其添加一些基本的属性和方法。 ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine; // 定义所有英雄的基类 public ...
在编程世界中,类是面向对象编程的基础,...通过以上介绍,我们对类的声明有了全面的认识,包括其组成部分、语法结构以及在实际编程中的应用。继续深入学习面向对象编程,将有助于我们更好地设计和构建复杂的软件系统。
在IT行业的嵌入式开发与通信领域中,串口编程是一项基本且重要的技能。...通过本文的介绍,相信读者已经对`SerialPort`类有了更为全面的认识,能够在未来的项目中更加得心应手地运用这一关键技术。
很好的c++字符串参考手册,我就是通过它认识c++的强大的,并且学起来很有进
通过这个函数的使用说明和示例,我们可以了解到PHP处理XML数据的灵活性和便利性,同时也认识到了在处理XML数据时需要注意的一些细节。simplexml_load_string函数是一个强大的工具,可以帮助开发者在应用程序中轻松地...
Java语言是一种广泛应用于服务器端开发、移动应用、嵌入式设备和云计算等领域的...通过这些实验,初学者将对Java语言有基本的认识,为后续深入学习面向对象编程、异常处理、集合框架、多线程等高级主题打下坚实基础。