`
Strive_sprint
  • 浏览: 22499 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

String类有多少你不知道的事

 
阅读更多

 

String类是我们再熟悉不过的了,但是如果不深入分析,熟悉的也不过是表面的变量的定义,方法的调用,而且好多东西只是记忆不是理解。

下面小弟来初步分析分析,如果有不对的或者不全面的希望各位大神指出来,3Q

 

在这之前,我先简单的分析一下内存分配:

内存总体分为了4个部分,堆,栈,常量池和方法区

如:Student stu = new Student();

定义了一个stu引用,这个引用存在栈内存中new出来的学生对象是存放在堆内存中的,最后用这个stu引用指向堆中的学生对象。在方法中定义的局部变量也是存放在栈中

再如:public final int temp = 10;

这里的定义了一个常量temp,这个temp就存在常量池中

方法则是存放在方法区中,多个对象共享这个方法区。

 

首先String类是final修饰的,所以是不能被继承的,而String类的本质是字符数组char[],所以值是不能改变的,如果是要改变,那么提供了StringBuffer和Stringbuilder类。

 

要创建字符串,大概有4中形式:

1.String str = new String("abcd");

2.String str = "abcd";

3.String str = "ab"+"cd";

4.String str1 = "ab";

String str2 = str1+"cd";

其内存分配如下:

第一种,就是最常规的用new来创建字符串对象,为其在堆中分配内存空间。

第二种,首先在常量池中找有没有"abcd"对象,如果有那么就用引用str指向这个对象,如果没有那么先在常量池中创建这个对象,然后再用引用指向这个对象。常量池中的对象是不重复的,相同的对象只创建了一次。

第三种,编译的时候直接拼接成"abcd"放入常量池中。

第四种,是字符串和对象的拼接,分配的是堆内存。

在常量池中创建对象分配内存时在编译的时候进行的。

 

另外就是String类中方法的使用,这个查API基本都会用,这里不做分析。

 

还有几点需要注意的:

1.String str;和String str = "null";第一句只是创建了一个引用,没有创建对象,它指向null(没有对象让它指),如果调用方法则会报NullPointerException(空指针异常),而第二句是创建了一个字符串对象"null",存在常量池中,引用str指向这个对象。

2.equals方法和==。如:String str1 = new String("student");String str2 = new String("student"); str1.equals(str2);返回true,因为比较的是str1和str2的内容,都为"student",而str1==str2;返回false,比较的是内存地址,显然创建了两个对象,内存地址不一样。

3.String实例一旦生成就不能改变, 如:String str = "abc"; String str = "xyz"; 这里不是把对象"abc"变成了"xyz",而是引用指向了对象"xyz",如果不再有引用指向"abc",那么对象"abc"就会被垃圾回收器回收掉,释放其内存空间。

4.String不是常用的数据类型,虽然我们经常这样写,int temp = 10; System.out.println("临时变量为:"+temp);这里一样会输出"临时变量为:10",当字符串和非字符串实例拼接的时候,非字符串实例会继承并调用Object类中的toString()方法将其转换成字符串类型。

分享到:
评论

相关推荐

    javaString 和StringBuffer的区别

    这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供的字符串进行修改.当你知道字符数据要改变的时候你就可以使用 StringBuffer.典型地,你可以使用 StringBuffers来动态构造字符数据.

    C语言和C++语言中 string类详解.docx

    在C++语言中,string类是常用的一个类,它非常重要,我们有必要在此单独讲解一下。使用string类需要包含头文件<string>,下面的例子介绍了几种定义string变量(对象)的方法: 1. 无初始化的变量定义:string s1; ...

    简单说说JAVA的String和byte[]的关系

    - **String**: 在Java中,`String`是一个不可变的类,用于表示字符序列。默认情况下,`String`对象使用Unicode编码(通常是UTF-16),这意味着每个字符占用两个字节。 - **byte[]**: 这是一个字节数组,通常用来表示...

    Java中的String为什么是不可变的?-String源

    在Java编程语言中,String类是一个非常特殊且重要的类,它是不可变的。这个特性意味着一旦创建了一个String对象,它的值就不能被改变。这个设计决策背后有多种原因,包括性能、安全性和线程安全性。 首先,理解...

    java.lang.NumberFormatException For inputstring 4294967295处理方法

    1. **使用Long类型**:如果你知道输入的数字可能超过 `int` 的范围,可以使用 `Long.parseLong()` 或 `Long.valueOf()` 方法,因为 `long` 类型可以存储更大的数值。 ```java try { long num = Long.parseLong(...

    串匹配算法c++实现string matching algorithm

    利用这个表,当发生不匹配时,我们可以知道下一个应该匹配的字符,无需回溯。KMP算法的时间复杂度为O(n+m)。 4. **Shift-And 和 Shift-Or 算法**:这两种算法基于位操作,将模式串转换成位掩码,然后通过位与运算...

    c#中 String和string的区别介绍

    不知道大家有没有发现,在c# string类型可以写成string和String,那么,它们有什么区别呢? string是c#中的类; String是Framework的类; C# string 映射为 Framework的 String。 如果用string,编译器会把它编译成...

    java string用法详解

    String 类是 final 类型的,因此不能被继承。如果类可以被继承,那么就会破坏类的不可变性机制。因为子类可以覆盖父类的方法,并且可以改变父类的成员变量值,一旦子类以父类的形式出现时,就不能保证类是不可变的。...

    c++中由类名(string)创建这个类对象(RTTI)

    在给定的场景中,“c++中由类名(string)创建这个类对象”涉及到了RTTI的使用,特别是在动态类型转换和工厂模式的应用上。 首先,让我们深入理解RTTI。C++中的RTTI主要通过两个关键字来实现:`dynamic_cast` 和 `...

    STL_string_class_src.zip_CString_STL_string

    标题提到的"STL_string_class_src.zip_CString_STL_string"可能是一个项目或代码示例,其目标是实现一个类似于MFC(Microsoft Foundation Classes)中的`CStringT`类,但使用了STL的`std::string`。`CStringT`在...

    Java string不可变原理实例解析

    Java中的String类是不可变的,这意味着一旦创建了一个String对象,就不能改变它的内容。这个特性是由几个关键的设计决策和语言特性共同决定的。首先,String类被声明为final,这防止了其他类对其进行子类化并改变其...

    vc++6.0中动态数组实现(例如string类对象数组等)[文].pdf

    我们可以在运行时动态分配数组,而不需要在编译时知道数组的长度。例如: ```cpp size_t n = get_size(); // get_size returns number of elements needed int *p = new int[n]; for (int *q = p; q != p + n; ++q) ...

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

    本文将深入探讨标题和描述中提到的问题:“解决dbf Failed to parse Number: For input string: "-.---""”,以及如何在不依赖特定jar包的情况下处理DBF文件。 首先,"Failed to parse Number: For input string: ...

    你知道String、StringBuffer和StringBuilder的区别吗

    首先,`String`类是最基础的字符串处理类,它被设计为不可变类。这意味着一旦一个String对象被创建,它的内容就不能更改。例如,当声明`String a = "111"; a = "222";`时,实际上并没有改变原来的"111"对象,而是...

    Java 中的 String对象为什么是不可变的

    String类的设计使其不可变,有以下几个主要原因: 1. **线程安全**:由于String对象不可变,所以在多线程环境中,多个线程可以安全地共享同一个String对象,无需担心同步问题。这提高了程序的并发性能。 2. **缓存...

    常用类的方法集合

    **String 类** 在 Java 语言中扮演着极其重要的角色,它是不可变的对象(immutable object),这意味着一旦一个 `String` 对象被创建,它的值就不能被更改。这特性使得 `String` 类非常适合用于处理文本数据。 ####...

    Java String转换时为null的解决方法

    慎用方法2,对于不知道具体类型的情况下,可以使用方法3,只是转换后String的判null条件改为:if (!objStr.equals('null'))。 掌握Java String转换时为null的解决方法对我们在开发中是非常重要的,可以避免空指针...

    C#中String StringBuilder StringBuffer类的用法

    String类是C#中最基本的字符串类型,字符串一旦赋值就不可改变,也就是说字符串具有恒定性。当我们对String类型的字符串进行拼接、赋值等操作时,实际上是在内存中重新分配一个新的内存空间,而不是在原来的内存空间...

    使用Iterator模式将对象转成String.docx

    在Java中,Iterator接口是实现此模式的主要工具,它允许我们遍历任何集合,如ArrayList、LinkedList等,而无需知道底层数据结构的细节。 在上述描述中,提到了如何使用Iterator模式来解决在JSOM、XML、Java bean等...

    Java中关于String的全面解析

    Java中的String是一个非常重要的类,它提供了两种创建方式和一种特殊的存储机制(String intern pool),并且String类中声明了一个char[]数组和一个int类型的变量hash,用于存储字符串的内容和哈希值。

Global site tag (gtag.js) - Google Analytics