• string的一些特殊点


    无论是String还是new String最终都指向了String constant pool中,只不过是String直接指向了Stringconstant pool中。而new String是在Heap中创建了一个指向String constant pool中的引用。
    java中,如果定义了String类型的字符串,最终的都存在String constant pool 中。

    String constant pool就是jvm规范中所谓的方法区。

    一个对象由对象头,对象实际数据,以及对齐填充(可能存在)三部分组成。

    new一个对象会有两个东西占用内存,引用和实例。

    new一个Object对象占用24个字节(64位) 或 12个字节(32位)

    在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此不用担心String对象共享而带来程序的混乱。

    String str = new String("abc"); 创建了几个对象?

    一个或两个:abc 字符串之前没有用过,这毫无疑问创建了两个对象,一个是new  String 创建的一个新的对象,一个是常量“abc”对象的内容创建出的一个新的String对象。

          如果之前创建了‘abc’字符串,则只创建了一个对象。

    创建一个类的实例(对象)的方法有以下两种:
    一、使用new创建对象。
    二、调用Class类的newInstance方法,利用反射机制创建对象。

    string比较特殊,有第三种方式,

    String str="abc";

    这种方式是String特有的,并且它与new的方式存在很大区别。

    String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。

    栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。
    堆(heap):用于存储对象

  • 相关阅读:
    生成函数解决多重集合的计数问题
    kmp板子
    poj1001
    【题解】洛谷P1315 [NOIP2011TG] 观光公交(前缀和+贪心)
    【题解】洛谷P1941 [NOIP2014TG] 飞扬的小鸟(背包DP)
    【题解】洛谷P2679 [NOIP2015TG] 子串(DP+滚动数组)
    【题解】洛谷P1514 [NOIP2010TG] 引水入城(DFS+DP)
    【题解】洛谷P1052 [NOIP2005TG] 过河(DP+离散化)
    [arc063F]Snuke's Coloring 2-[线段树+观察]
    [agc001E]BBQ Hard[组合数性质+dp]
  • 原文地址:https://www.cnblogs.com/wskb/p/10949936.html
Copyright © 2020-2023  润新知