`

String和char的源码

 
阅读更多

String:源码如下,由一个char的数组组成。

1、该对象是放在常量池的,

2、对象内容不可变(不是绝对,通过反射可以修改),所有的修改内容操作,,都是new一个新的String对象返回。

3、Sting s = "hello";字符串放到常量池,太多放不下的时候就GC那些没有引用的。因为等价于String s = new String("hello").intern();(这个说法待定!!!)

4、String s = new String("hello");不会放到常量池,同理:String s = "hello"+1;在源码中重新new了一个字符串,并没有涉及intern()操作,所以"hello"会放入但"hello1"不会放到常量池。(只有通过String s = "hello";或者调用intern(),才会放入常量池。)所以for循环拼接时,其实是在内存中不断开辟空间存储新的字符串,浪费时间和内存空间。

5、intern()方法,是将当前字符串放到常量池,如果常量池已存在相同字符串则返回已存在的字符串引用,如果不存在则将当前字符串拷贝一份放到常量池,并返回拷贝的字符串引用(注意:java6以及之前版本常量池是放在永久代的,java7之后常量池也在堆内存里)。

网上的总结:

1)不要在Java 6及以前的版本使用String.intern()将字符串放入常量池,因为这是的字符串常量池是存储在固定大小的内存区(PermGen)

2)Java 7和8中将字符串常量池存储在堆内存中。

3)Java 7和8中可以通过JVM参数-XX:StringTableSize来控制字符串常量池的大小。

4)-XX:StringTableSize的默认值在Java 7中是1009,在Java 8中大概是25~50K

5)在多线程情况下可以随意使用Stirng.intern()方法。8个写线程只比1个写线程的负载多了17%,1个写7个读线程只比一个线程的负载多了9%

6)字符串常量池不是线程隔离的

7)虽然Java 7+对String.intern()做了很多优化,但是它还是花费CPU资源。在简单的例子中没有调用String.intern()方法的程序比调用了的程序要快3.5倍。所以不需要对所有的字符串调用String.intern()方法,只需要对经常被使用的字符串(例如:省、市等)调用String.intern()方法加入常量池。

 

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    private final char value[];
    private int hash; // Default to 0
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
    public native String intern();
}

 

 其中,在虚拟机规范所说的那样,JVM中的内存分为5个虚拟的区域:堆、方法区和持久代(非堆)、JVM栈、本地栈、PC寄存器

Java8的JVM持久代 - 何去何从?

java8以后,持久代已经被彻底删除了,取代它的是另一个内存区域也被称为元空间。

元空间:

1、它是本地堆内存中的一部分

2、它可以通过-XX:MetaspaceSize和-XX:MaxMetaspaceSize来进行调整

3、当到达XX:MetaspaceSize所指定的阈值后会开始进行清理该区域

4、如果本地空间的内存用尽了会收到java.lang.OutOfMemoryError: Metadata space的错误信息。

5、和持久代相关的JVM参数-XX:PermSize及-XX:MaxPermSize将会被忽略掉。 

 

 

char:包装类为Character

分享到:
评论

相关推荐

    Delphi String类型和PChar类型使用的区别.rar

    Delphi 以实例演示String类型和PChar类型使用的区别,演示了PChar静态分配空间和PChar动态分配空间:  procedure TForm1.Button1Click(Sender: TObject);  var  PStr:array [0..100] of Char;  begin  StrPCopy...

    C# String类型判断数据源码

    在这个"String类型判断数据源码"中,我们很可能会看到如何检查字符串的各种属性,比如空值、特定格式、包含特定子串等。下面将详细介绍C#中关于String类型的一些关键知识点。 1. **字符串初始化**:在C#中,字符串...

    String_raw-源码.rar

    这个“String_raw-源码.rar”文件很可能包含了Java标准库中`String`类的原始源代码,这对于深入理解`String`类的工作原理非常有帮助。在这里,我们将深入探讨`String`类的一些关键知识点。 1. **字符串常量池**:在...

    Oracle中TO_DATE、TO_CHAR,Oracle函数大全

    在Oracle数据库中,`TO_DATE` 和 `TO_CHAR` 是两个非常重要的转换函数,它们用于在日期和字符串之间进行转换。这两个函数对于处理日期相关的数据至关重要,尤其在数据分析和报表生成时。 `TO_DATE` 函数是将字符...

    三种方式统计string中出现次数最多的char

    在编程领域,统计一个字符串中出现次数最多的字符是一项常见的任务,尤其在数据分析和文本处理中。下面我们将详细探讨三种不同的方法来实现这个功能,分别基于循环遍历、使用哈希表以及利用Python的内置函数。 1. *...

    Java String 源码解析

    答:String 内部存储结构是char数组,源码如下: public final class String implements java.io.Serializable, Comparable, CharSequence { /** 该值用于字符存储. */ private final char value[]; 2.String源码中...

    VC 使用StdString类代替CString类的方法和示例源码.rar

    1. 如何创建和初始化`StdString`对象,包括空字符串和从C风格字符串或`const char*`初始化。 2. 使用`+`或`+=`操作符进行字符串拼接。 3. 使用`substr()`、`find()`、`replace()`等函数进行字符串操作。 4. 将`Std...

    Java类库复习——java.lang.String

    `String`类提供了多种构造方法,如`String()`用于创建空字符串,`String(char[] value)`通过字符数组初始化,`String(String original)`用于复制已有字符串,以及`String(char[] value, int offset, int count)`用于...

    (String)字符串原理详解

    1、JDK1.8中String类的源码定义 1.1、主要的类变量如下所示: public final class String implements java.io.Serializable, Comparable, CharSequence { //存储字符串的字符数组 private final char value[]; /...

    C++语言string类的实现 完整源代码 pdf

    ### C++语言中的自定义String类:MyString 在C++编程中,标准库提供了一个功能强大的`std::string`类来处理字符串相关的操作。不过,深入理解如何手动实现一个字符串类不仅能帮助开发者更好地掌握底层原理,还能...

    FTP客户端源码

    跨平台的C++FTP客户端源码 class ftpclient { public: ftpclient(const char* connmode="port", const char* transmode="binary"); ~ftpclient(void); int connect(const char* addr, short port); int ...

    java String源码和String常量池的全面解析

    Java String 源码和 String 常量池的全面解析 Java String 源码和 String 常量池是 Java 语言中非常重要的两个概念,它们之间存在着紧密的联系。在 Java 语言中,String 类是不可变的,finalize 方法被禁用,以确保...

    论坛增加版块源码

    论坛增加版块源码 网站源码 API网站编程源码 CSP源码 CGI源码 // AddUser.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include &lt;string.h&gt; #include #...

    java中的String类常用方法解析(一)

    本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符串。 - `String(char[] value)`:根据字符数组创建字符串。 - `String(String ...

    5152单片机proteus仿真和源码字符串函数string.h应用举例

    在本篇文章中,我们将深入探讨5152单片机在Proteus环境下的仿真以及如何在实际项目中运用字符串函数库string.h的相关知识点。通过本文的介绍,读者可以了解到5152单片机的基本特性、Proteus仿真的操作步骤及应用场景...

    每天学点C++(C++实例教程:教程+源码)01string容器.zip

    这个压缩包“每天学点C++(C++实例教程:教程+源码)01string容器.zip”显然是为了帮助初学者通过实例来学习`std::string`的用法。 首先,`std::string` 是一个动态数组,可以自动调整大小以容纳更多的字符。你可以...

    java源码包---java 源码 大量 实例

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    String与StringBuffer区别详解

    - 查看`String`的源码,我们可以看到`String`的构造函数和`concat`方法都是通过创建新对象来完成字符串的连接。 - 对于`StringBuffer`,它的`append`方法内部直接修改了`char[]`数组,无需创建新的对象。 综上所...

    java String详解

    `String`类在JDK的源码中是用C++实现的,但其主要接口和方法都是在Java中定义和使用的。 通过以上知识点,我们可以更好地理解和使用Java中的`String`类,有效地处理字符序列并优化代码性能。在实际开发中,合理运用...

Global site tag (gtag.js) - Google Analytics