一、String的综述和各种赋值区别
综述:
str只是一个String对象的引用,并不是String对象本身。
引用是4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。
1.String str = null;
未分配存储空间,表示str不指向任何字符串对象,空引用
null代表声明了一个空对象,对空对象做任何操作都不行的,除了=和==
2.String str;
分配了一个内存空间,没存入任何对象,未初始化的引用
在方法中定义:直接使用时编译是不通过的,必须赋初值
在类中定义(static 静态变量):可以不赋初值直接引用,默认赋值为null
3.String str = "";
分配存储空间,表示str指向一个长度为0的字符串对象
""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。
4.String str = "a";与String str = new String("a");区别
前者是在字符串池里写入一个字符'a',然后用str指向它
后者是在堆上创建一个内容为"a"的字符串对象。
//变量a和b将会指向同一内存地址(""的地址)
String a = "";
String b = "";
if(a == b){
System.out.println("a和b地址相等"+true);
}
if(a.equals(b)){
System.out.println("a和b值相等"+true);
}
//变量c和d不会指向同一地址,而是两个""内容的地址
String c = new String("");
String d = new String("");
if(c==d){
System.out.println("c和d地址相等"+true);
}
if(c.equals(d)){
System.out.println("c和d值相等"+true);
}
变量a,b方式:先去字符串池中查找字符串是否已经存在,如果在就直接指向该地址,如果不在生成一个实例放入池中再指向该地址。
变量c,d方式:通过new关键字来生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会去检测该对象是否已经存在的。因此通过new来创建对象,创建出的一定是不同的对象,即使字符串的内容是相同的
所以:a,b方式性能更高。
5.str.equals("abc")和"abc".equals(str)
推荐种写法,可以省略掉对null的判断。
String str = null;
if(str.equals("abc"))//空指针异常java.lang.NullPointerException
if("abc".equals(str))//可以正常运行
6.如何判断字符串是否为空:
if(str != null && str != "")
顺序最好不要写反:
String str = null;
if(str != "" && str != null)//抛出空指针异java.lang.NullPointerException
7.判断字符串是否相等
== : 是判断 str 的地址是否相等。
equals : 是判读 str 指向的对象值是否相等。
二、String、StringBuilder、StringBuffer
1.String
前面说了:
String str = "abc";
str只是一个字符串对象"abc"的引用,存储的是"abc"在内存中存放的地址。
str = "def";时
内存空间重新创建新对象"def",引用str重新指向新对象,实际内存中"abc"的值并未改变。
对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
javac对String的实现机制也是通过JavaBuilder来实现的。
2.StringBuilder
//无参数的构造方法
StringBuilder sb = new StringBuilder();
//源码:
public StringBuffer() {
super(16);
}
//super(16);源码:
char[] value;
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
新建StringBuilder()对象时候,默认是构建一个大小为16字节的字符数组char[],StringBuilder预先开辟了空间,append的时候只是向内存地址赋值。如果长度不够时候再重新开辟内存。
3.StringBufffer
StringBuffer与StringBuilder基本类似。
StringBuilder和StringBuffer类拥有的成员属性以及成员方法基本相同,区别是StringBuffer类的成员方法前面多了一个关键字:synchronized。
=>StringBuffer是线程安全的。
4.三者性能
对于几个字符串的拼接,基本差不多。
大量数据:StringBuilder > StringBuffer > String
http://www.cnblogs.com/dolphin0520/p/3778589.html
这个文章里面的面试题可以参考下
基本就这些,后续再补充吧。
分享到:
相关推荐
在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String 对象,就不能修改它的值。每次对 String 对象的...
"Java 中 String、StringBuffer 和 StringBuilder 的区别及用法" Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,了解它们之间的区别对 Java 开发者来说非常重要。本文将详细介绍这三者...
C#中String、StringBuilder和StringBuffer三个类是字符串操作中经常使用的类,本文将对这三个类的用法进行详细介绍。 String类 String类是C#中最基本的字符串类型,字符串一旦赋值就不可改变,也就是说字符串具有...
Java 中 String 和 StringBuffer 与 StringBuilder 的区别及使用方法 Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,每个类都有其特点和使用场景。在开发过程中,正确选择合适的字符串...
在Java编程语言中,`String`和`StringBuffer`是两个非常重要的类,它们都用于表示文本字符串。然而,它们之间存在着本质的区别,这主要体现在它们的可变性、性能和使用场景上。 首先,`String`类是不可变的,意味着...
本文主要关注Java中的三个字符串相关类:`String`、`StringBuilder`和`StringBuffer`。理解它们的特性和使用方法对于编写高效、线程安全的代码至关重要。 一、`String`类 `String`类在Java中是一个不可变类,意味着...
理解Java中的String不可变性和引用传递的概念非常重要,这有助于避免潜在的错误,提高程序的效率,并有助于理解内存管理。在实际编程中,如果需要频繁修改字符串,可以考虑使用`StringBuilder`或`StringBuffer`类,...
在Java编程语言中,`String`、`StringBuilder`和`StringBuffer`都是处理字符串的重要类,但它们在处理方式和性能上有显著的区别。下面将详细解释这三个类的特点和使用场景。 1. **String类** - `String`类是final...
### 正确使用String类的几点注意 在Java编程中,`java.lang.String`类是极为常见的基础数据类型之一,其重要性和应用范围不言而喻。为了更好地理解和使用String类,本文将从几个关键方面入手,探讨如何更加高效、...
### JavaSE之StringBuilder类与String类 ...以上内容详细介绍了如何使用`String`和`StringBuilder`类,以及它们之间的区别。这对于JavaSE入门者来说是非常实用的知识点,希望这些知识点能够帮助到正在学习JavaSE的你。
以下就是10个关于Java String的面试问题,这些问题涵盖了String的基础、性能优化以及一些高级特性。 1. **String是不可变的吗?** 是的,String在Java中是不可变的。这意味着一旦创建了一个String对象,就不能更改...
以上就是对 Java 中 `String` 类的主要函数的总结,包括了字符串的创建、连接、获取信息、各种操作方法以及格式化和正则表达式的使用等内容。这些知识点对于日常开发非常重要,希望对你有所帮助。
### JAVA开发需注意的六个问题 在JAVA编程中,有许多重要的细节...在实际开发过程中,需要充分考虑字符串操作的特点以及如何有效地使用 `String`、`StringBuilder` 和 `StringBuffer`,以提高代码的性能和可维护性。
理解String对象的不可变性对于Java开发者来说至关重要,因为它影响着代码的编写、内存管理和多线程环境下的行为。 首先,不可变性意味着一旦一个String对象被创建,它的值就不能再被修改。例如: ```java String ...
本文详细介绍了Java中字符串处理的相关知识点,包括`String`类的基本概念、构造方法、字符串常量与编译器优化、`StringBuffer`和`StringBuilder`类的区别以及常用的方法等。这些知识点对于Java开发者来说非常重要,...
在 Java 中,`String` 类和 `StringBuffer` 类是处理文本字符串的两个重要工具。`String` 类主要用于创建不可变的字符串,适合于不经常修改的文本。而 `StringBuffer` 类则提供了可变的字符串,适用于需要频繁修改...
总的来说,理解和熟练掌握Java中的字符串操作是成为Java程序员的基础,包括创建、比较、拼接以及字符串的内存管理,这些都是编写高效且无错误的Java代码的关键。在实际开发中,根据具体需求选择合适的字符串处理方法...