一、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 plaincopy
  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 plaincopy
  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多线程基础知识来对应日后碰到的问题!

转载于:https://www.cnblogs.com/shan1393/p/8994378.html

面试题:String StringBufere StringBuilder 不用看相关推荐

  1. 探秘Java中String、StringBuilder以及StringBuffer

    相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它 ...

  2. 探秘Java中的String、StringBuilder以及StringBuffer

    转载:http://www.cnblogs.com/dolphin0520/p/3778589.html 一.你了解String类吗? 想要了解一个类,最好的办法就是看这个类的实现源代码,String ...

  3. 【转】探秘Java中的String、StringBuilder以及StringBuffer

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...

  4. 重温java中的String,StringBuffer,StringBuilder类

    不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...

  5. String、StringBuilder、StringBuffer 区别

    public static void testStringBuffer(){long start System currentTimeMillis();StringBuffer sbuf = new ...

  6. String为什么是不可变的?为什么要有字符串常量池?String和StringBuilder和StringBuffer

    String的相关知识点 1. 不可变字符串String类对象 2. String不可变的好处 3.字符串常量池 4. String.StringBuilder和StringBuffer 1. 不可变 ...

  7. 10.包装类,String,StringBuilder,StringBuffer

    目录 1.包装类 1.1 装箱和拆箱 1.2包装类方法 2.String 2.1 String的保存属性 2.2 String的创建方式 2.3 String关于"=="特性的比较 ...

  8. Java中的String,StringBuffer,StringBuilder有什么区别?

    相信有很多同学都是经常使用String的,或者也或多或少的听说过StringBuffer,StringBuilder,那么在经常遇见的面试题中(标题),到底这三个的区别是什么呢?让我们来一探究竟! S ...

  9. 一篇与众不同的 String、StringBuilder 和 StringBuffer 详解

    1 碎碎念  这是一道老生常谈的问题了,字符串是不仅是 Java 中非常重要的一个对象,它在其他语言中也存在.比如 C++.Visual Basic.C# 等.字符串使用 String 来表示,字符串 ...

最新文章

  1. mysql创建_mysql创建新用户
  2. 如何手工展开函数栈来定位问题
  3. python中utf8占几个字节_为什么utf8占用3个字节
  4. 2. 两数相加(中等)
  5. c语言程序员写贪吃蛇代码28,厉害了,程序员28行代码写贪吃蛇游戏,附源码!...
  6. 用计算机实现智能解题,浙江省信息技术学考复习模块2——计算机功能、智能处理、字处理...
  7. java静态导入_Java中越来越多地接受静态导入吗?
  8. HDU1573-模线性方程
  9. [Leetcode][第32题][JAVA][最长有效括号][动态规划][栈][正向逆向结合]
  10. iOS中常见的6种传值方式,UIPageViewController
  11. 案例集锦|科技赋能,华为云GaussDB助千行百业数字化转型
  12. 华为SDN+VxLAN学习小记
  13. mysql function_MySQL基础函数——数学函数详解
  14. c语言错误spawning,C语言一直出现Error spawning cl.exe的解决办法
  15. 【LeetCode】【字符串】题号:*12. 整数转罗马数字
  16. php+foreach+传值传值,php foreach 传值还是传引用
  17. rk3568 4g 模块调试-ec20(移远模块)
  18. 如何利用魔棒工具抠图_photoshop魔棒工具怎么用 ps魔棒工具抠图教程
  19. 热门Java开发工具IDEA入门指南——了解并学习IDE
  20. 怎样学习C语言——快速上手C语言系列之—什么是指针

热门文章

  1. 睡眠排序法-objective C版的代码
  2. Spring Boot Maven 打包可执行Jar文件!
  3. 性能测试:性能测试常见指标
  4. python与开源_Github上Top20 Python与机器学习开源项目推荐
  5. 通过jQuery获取Select选中的值或文本
  6. MYSQL 字符集问题
  7. log4j在web中的使用
  8. jenkins组权限_Jenkins 中基于角色的权限管理
  9. python什么是调用_Python中包(package)的调用方式
  10. linux搭建java开发环境_Linux搭建Java开发环境