`

正确使用String类应注意的几点!

SQL 
阅读更多

java.lang.String类对大家来说最熟悉不过了,我们写java程序很少能不用String的。本文讲述如何正确的使用String,内容主要涉及初始化、串联和比较等操作。

首先我们必须清楚的一点是String类是final类型的,因此你不可以继承这个类、不能修改这个类。我们使用String的时候非常简单,通常都是String s = "hello",但是Java API中同时提供了一个构造函数为String(String s),因此你也可以这样使用String s = new String("hello"),对于后面这样初始化一个String的方式是不推荐的,因为new操作符意味着将会在heap上生成一个新的对象,如果这样的操作发生在一个循环中,那么代价是惨重的。比如
for(int i = 0;i<1000;i++)
{
String s = new String("hello");
}
这将会创建1000个String类型的对象,由于String类是final的,因此这样的操作事实上是每次都生成了一个新的String对象的。如果你使用String s = "hello";那么就可以实现复用了,为什么可以复用呢,下面会有解释。

当我们使用"+"实现串联操作的时候,比如String s = "hello"+"world";其实是通过StringBuffer类的append()方法实现的,最后返回String给s。如果有兴趣的话,你可以写一个简?在使用串联的时候我们同样应该注意String是final类,如果你需要多次串联比如:
String sql = "xxx";
sql = "xxxx";
sql = "ssssss";


那么为了提高效率节省空间,我们应该自己用StringBuffer来替代"+";

通常对String的比较有两种情况,一个是使用==,另一个是使用equals()方法,注意==是对对象的地址进行比较的,而String中的equals()方法是覆盖了Object类的方法,并且实现为对String对象的内容的比较。所以String s1 = new String("hello");String s2 = new String("hello"),我们对s1和s2进行上述比较的时候,前者应该返回false,因为使用new生成的是两个不同的对象。后者应该返回true因为他们的内容是一样的,都是"hello"。那么如果我们还有一个String s3 = "hello";他和s1的比较应该是什么样子的呢,答案是s1==s3为false,equals的比较位true。事实上String类是维持着一个String池的,这个池初始化为空的,当我们String x = "hello"的时候,hello就会被放入这个池中,当我们再次String y = "hello"的时候,他首先去检查池中是否存在一个和hello内容一样的对象,如果存在的话就会把这个引用返回给y,如果不存在的话,就会创建一个并放入到池中。这样就实现了复用。在String有一个方法intern()他可以把String的对象放入到池冲并返回池中的对象。如果我们对s1(String s1 = new String("hello"))调用intern,s1 = s1.intern()这时候,我们再把s1和s3进行“==”的判断,你会发现结果返回true!
看下面的例子

public class StringTest
{

public static void main(String[] args)
{
String s1 = "hello";
String s2 = new String("hello");
String s3 = new String("hello");

testString(s1,s2,s3);
s2 = s2.intern();
System.out.println("after s2.intern");
testString(s1,s2,s3); 

}
private static void testString(String s1,String s2,String s3)
{
System.out.println("s1 = s2 is "+(s1==s2));
System.out.println("s2 = s3 is "+(s2==s3));
System.out.println("s1.equals(s2) is "+s1.equals(s2));
System.out.println("s2.equals(s3) is "+s2.equals(s3));
}
}


输出结果为
s1 = s2 is false
s2 = s3 is false
s1.equals(s2) is true
s2.equals(s3) is true
after s2.intern
s1 = s2 is true
s2 = s3 is false
s1.equals(s2) is true
s2.equals(s3) is true
分享到:
评论
8 楼 javatestoracle 2009-01-20  
String s2 = new String("hello");  
这里是产生2个对象 S2只是一个reference 而已 "hello" 本身自己占一个空间,new 又占一个,如果string s2="hello",这里只有一个对象,就是"hell0"
7 楼 jcs7575 2009-01-16  
并不是+ 就比.append性能差

如果是简单的拼接个String用 + 和 append是一样的

只是有循环的时候 如果用+性能比append低
6 楼 gembler 2009-01-15  
炒饭好吃么?
小“+”一下,相信不会是溢出的凶手
5 楼 jltest 2009-01-15  
String a = "123";
String b = a + "123";

String a = "123";
StringBuilder s = new StringBuilder();
s.append(a);
s.append("123");
String b = s.toString();
其实是一样的把。
4 楼 oxromantic 2009-01-15  
howesen 写道
对,是StringBuffer,不是StringBuilder!

1.4 buffer, 1.5 builder
3 楼 sdh5724 2009-01-15  
何必呢, 除了大规模的string运算会有性能问题, 其他怎么连都不会出问题。 机器的性能是很强的。
2 楼 howesen 2009-01-15  
对,是StringBuffer,不是StringBuilder!
1 楼 ZangXT 2009-01-14  
“String s = "hello"+"world";其实是通过StringBuffer类的append()方法实现的”,错误的,这个例子是两个常量连接,这是编译期直接连接的,并不会运行时采用StringBuilder来处理。
String s = "hello";
s=s+"world";
这种情况会。

相关推荐

    正确使用String类的几点注意

    ### 正确使用String类的几点注意 在Java编程中,`java.lang.String`类是极为常见的基础数据类型之一,其重要性和应用范围不言而喻。为了更好地理解和使用String类,本文将从几个关键方面入手,探讨如何更加高效、...

    java基础String类选择题练习题

    根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...

    C++下基于QT的String类自己实现

    实现这些功能时,需要注意以下几点: - **内存管理**:C++中字符串的动态内存管理是关键,需要确保在分配和释放内存时避免内存泄漏。在自定义`String`类时,要特别关注构造、赋值、拷贝和析构过程中的内存处理。 -...

    C#_string_byte数组转换解析

    在进行这些转换时,需要注意以下几点: - 字符编码的选择至关重要,因为不同的编码方式会导致不同的字节序列。例如,UTF-8和Unicode编码对非ASCII字符的表示方式不同。 - 当处理16进制字符串时,确保字符串的长度是...

    字符串处理类String实现

    在C++中,实现自定义字符串类需要注意几个关键点: 1. **内存管理**:正确地管理内存是至关重要的,需要确保在适当的时候释放内存,防止内存泄漏。 2. **边界检查**:确保在访问字符串时不会超出其实际长度,防止...

    模仿MFC的CString自己写的一个String类

    模仿MFC的CString类创建自定义的String类,你需要考虑以下几个关键点: 1. **内存管理**:为了实现动态字符串,你需要一个内部的char数组或者使用std::vector来存储字符串数据。当字符串长度变化时,需要确保能正确...

    12基础篇之第十二(String的基本用法).docx

    关于 `String` 类对象的创建,需要注意以下几点: 1. 当使用字符串常量直接赋值时,例如 `String s = "hello";`,只会在常量池中创建一个字符串对象。 2. 使用 `new String()` 关键字创建 `String` 对象时,会在堆...

    date和string互相装换

    ### Date与String互相转换知识点详解 #### 一、引言 在Java开发过程中,日期(`Date`)与字符串(`String`)之间的相互转换是非常常见的需求。这不仅涉及到数据类型的转换,还涉及到时间格式的处理。本文将详细...

    c++ STL string学习资料

    关于`std::string`的注意点,开发者应了解以下几点: 1. `std::string`是可变的,修改一个字符串对象会影响其本身,而非创建新副本。 2. 拼接操作可能会导致内存重新分配,这在性能敏感的代码中需要注意。 3. 字符串...

    JAVA实验报告四(实现String类).doc

    下面,我们将从几个方面详细介绍该实验报告所涉及的知识点。 ### 一、概述 #### 1. 课程设计的目的 - **了解和掌握String类的实现原理**:在Java中,`String`类是一个非常重要的内置类,用于处理文本数据。它提供...

    java字符串中${}或者{}等的占位符替换工具类

    Java字符串中${}或者{}等占位符替换工具类 ...在使用该工具类时,需要注意以下几点: * 占位符的开头和结尾需要正确地指定。 * 占位符的值数组需要正确地传入。 * 字符串中的占位符需要正确地逃逸,以避免错误的替换。

    包含string对象的结构与memset初始化操作

    这种操作破坏了`std::string`对象的内部结构,具体包括但不限于以下几点: - **野指针问题**:`memset`会导致`std::string`中管理的指针变为野指针,使得后续对该指针的操作(例如读取或修改字符串内容)变得不可...

    MybatisPlus多数据源原理及使用注意点.pdf

    在使用MybatisPlus多数据源时,需要注意以下几点: 1. 配置文件中的数据源信息需要正确配置,否则将无法加载数据源。 2. 需要在application.properties或application.yml文件中配置数据源信息。 3. 在使用多数据...

    string 多线程 内存泄露

    当使用 `std::string` 时,需要注意以下几点: 1. **动态分配**:`std::string` 在内部为存储字符串动态分配内存。这意味着,在创建一个 `std::string` 对象时,并不一定立即分配足够的内存来容纳预期的字符串内容...

    解决dbf Failed to parse Number: For input string: "-.---"

    在实际应用中,处理DBF文件时需要特别注意以下几点: - 确保知道DBF文件使用的字符集,以便正确解码文本数据。 - 对于数值字段,需要进行有效性检查,确保数据格式正确,避免解析异常。 - 使用自定义的读写类时,要...

    (Java)json和String互转必备Jar包

    使用这些库时,需要注意以下几点: - 首先,确保将对应的Jar包添加到项目的类路径中。 - 其次,理解每个库的API,了解如何创建JSON对象,以及如何将JSON对象映射到Java类。 - 对于复杂的数据结构,如嵌套的对象和数...

    JNI 调 C C++ 参数String

    通过JNI传递Java的String参数,需要注意几个关键点: 1. 使用 `GetStringUTFChars` 获取String的UTF-8编码,这是一个非引用计数的API,因此调用完成后需要调用 `ReleaseStringUTFChars` 来释放内存。 2. 如果处理...

    Java实现的进制转换工具类完整示例

    在使用Java实现的进制转换工具类时,需要注意以下几点: * 在使用十六进制时,需要注意大小写问题,Java语言中,十六进制可以用小写或大写表示。 * 在使用十六进制时,需要注意编码问题,需要指定正确的编码方式。 ...

    有关日期Date 和String型相互转换

    在进行日期和字符串转换时,有几点需要注意: - **日期格式化模式**:模式定义了日期和时间的显示格式,例如"yyyy"代表四位年份,"MM"代表两位月份,"dd"代表两位日期,"HH"代表24小时制的小时,"mm"代表分钟,"ss...

Global site tag (gtag.js) - Google Analytics