• 面试题:String StringBufere StringBuilder 不用看


    一、String 使用 private final char value[]来实现字符串存储

    所以String对象创建之后就不能再修改此对象中存储的字符串内容,所以说String本质是字符数组char[],且其类型是不可变的!

    相对应String,StringBuffer与String功能大致相同,但实现方法不同,StringBuffer是可变的,而且是线程安全的。

    二、Java中String的创建方法(四种)

    1、直接使用" "双引号创建; (String s1 = "first";)

    2、使用new String()创建;(String s2 = new String();)

    3、使用new String("string")创建;(String s3 = new String("string");)

    4、采用重载的字符串连接符创建;  (String s4 = "first" + "second";)

     

    三、在深入了解String创建机制之前,要先了解一个重要概念:常量池(Constant Pool)

    在Java编译好的字节码文件.class文件中,有个区域被称为Constant Pool,是一个由数组组成的表,用来存储程序中的各种常量,包括Class、String、Integer等各种Java基本数据类型;

    String Pool是Constant Pool中存储String常量的区域;

     

    四、直接使用" "双引号的创建机制

    用" "双引号创建的方法是一种非常特别的创建方法;例如下面这段代码:

     

    [java] view plain copy
     
    1. String s1 = "first";  
    2. Stirng s2 = "first";  
    3. System.out.println(s1 == s2);  

    1、编译期:"first"是编译期常量,编译期就能确认它的值,在编译好的.class字节码文件中,"first"就已经存在String Pool中了;

     

    2、运行期:JVM仅仅会查找维护常量池,拿着"first"在String Pool中查找是否存在内容相同的字符串(用equals()方法确认),如果存在,返回String Pool中相应内存单元的引用,赋值给s1(s1即是String Pool中存放"first"内存单元的地址);如果不存在,则创建一个"first"放在String Pool中,返回引用,赋值给s1;s2同理;

    这个过程实际是调用intern()方法实现的;

    此过程中,JVM绝不会在堆区(heap)创建String对象;

    所以,上述代码,s1与s2指向String Pool中同一块内存区域,是同一个对象,故返回true。

     

    五、用new string("string")的创建机制

    相当于创建两次String对象,一次在String Pool中,一次在堆区(heap)中;

     

    [java] view plain copy
     
    1. String s1 = new String("first");  
    2. String s2 = "first";  
    3. System.out.println("s1 == s2");  

    在Java中,使用new关键字创建一个新对象,不管在String Pool中是否有值相同的对象,总会创建一个新的String对象存储在堆区(heap)中,然后返回堆栈区(heap)中相应内存单元的引用,赋值给s1;而s2还是指向String Pool中相应内存单元;

     

    故s1与s2肯定不是同一个对象,只是存储字符串值相同,故返回false。

     

    六、Java内存模型

    堆 存放 对象和数组, 是GC主要操作的区域 由于堆是动态分配内存.  堆存取效率低于栈.

    虚拟机栈 存放基本数据类型 和对象的引用.线程.  栈中数据可以共享.

    方法区 存放常量、静态变量 ,编译后的代码

    本地方法栈 虚拟机使用的本地服务

    JVM具有一个堆(heap),堆是运行时数据区,为所有类实例与数组动态分配内存(堆的优势),数据的生命周期不必告诉编译器,而内存的释放由GC(垃圾处理机制)自动回收,但由于动态分配内存堆的存取效率较低(堆的缺点)

    相比于堆,栈存取速度很快(栈的优势),仅次于寄存器,一般用来存放基本类型变量数据如(int、short、long、byte、float、double、boolean、char)与对象的引用,栈中数据可以共享;但栈中数据大小与生命周期必须是确定的,缺乏灵活性(栈的缺点)

     

    (转载整理自并发编程网,略有修改整理,多涉猎多分享,共同学习,愿大家都成为Offer收割机!)

    多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题!

     

  • 相关阅读:
    关于Lua中的面向对象实现
    当我读《体验引擎:游戏设计全景探秘》时我在想什么
    【Unity】拖动图片生成对应Image
    【Unity】阅读LuaFramework_UGUI的一种方法
    【Unity】关于VS条件编译符号
    Lua元表应用举例:配置表格转为Lua配置表
    对文件夹下的git项目进行批量更新、打包
    二分查找
    python-变量及字符串赋值|今日所学-2017-12-26
    lamda- filter,map, collect
  • 原文地址:https://www.cnblogs.com/shan1393/p/8994378.html
Copyright © 2020-2023  润新知