1. String
  • String是不可变的

    • 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的。(public final class String)

      查看以下代码:

      String text = "a";
      text = "b";

      String不是不可变的么?为什么可以这样用?因为text是字符串"a"的引用,即引用是可以变化的,跟对象实例的属性变化没有关系。(这里创建的是两个String对象)

    • String设计成不可变的原因

      • 字符串常量池Java方法区中一个特殊的存储区域,当创建一个String对象时,假如这个字符串已经在常量池中了,就不会创建一个新的对象,而是引用已经存在的对象。++常量池指的是在编译期被确定,并保存在已编译的.class文件中的一些数据。它包括了关于类,方法,接口中的常量,也包括字符串常量++

        String text1 = "abc";
        String text2 = "abc";

        上面的代码只会在堆内存中创建一个实际的String对象。如果字符串对象允许改变的话,那么会导致各种逻辑错误,比如改变一个对象会影响到另一个独立对象。

        栈(stack):主要保存基本数据类型和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆

        堆(heap):用于存储对象

      • 安全性,因为字符串是不可变的,所以是线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串本身就是线程安全的。

  1. StringBuffer,StringBuilder

    • StringBuffer

      StringBuffer和String一样都是用来存储字符串的,只不过他们内部的实现方式不一样,导致他们所使用的范围不同,对于StringBuffer,它在处理字符串的时候,如果是进行修改操作,并不会产生一个新的字符串对象。

      StringBuffer的许多方法和String差不多,只不过修改时StringBuffer是修改自身的,而String类则是产生一个新的对象,这是他们最大的区别。

      同时,StringBuffer是不能通过=来进行初始化的,它必须通过构造方法来进行初始化。

    • StringBuilder

      StringBuilder和StringBuffer的不同之处在于StringBuilder是线程不安全的,StringBuffer是线程安全的。

    • String,StringBuffer,StringBuilder区别

  2. 常见面试题

    • 如何比较两个字符串?使用“==”还是equals()方法?

      • equals()是用来比较两个值的,==会比较两个引用
    • String s=new String("abc")创建了几个对象?

          public String(String original) {
      this.value = original.value;
      this.hash = original.hash;
      }

      上面是String的构造方法,我们在使用new调用了String的构造方法创建了一个对象,并将它的引用赋值给了str变量。

      同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是“abc”,由此我们又要引入另外一种创建String对象的方法的讨论 -- 引号内包含文本

    • String字符串与BufferString的传递问题

      • 基本数据类型的值传递,不改变其值;引用数据类型的值传递,改变其值

      • String类虽然是引用数据类型,但是他当作参数传递时和基本数据类型是一样的

          public static void changeString(String str) {
      // 因为str是属于局部变量,在调用该方法时实际参数s和形式参数str指向同一个字符串对象
      // 但是在方法内部将str又指向了一个新的字符串对象,而此时s还是指向原来的字符串对象
      // changeString方法执行完毕,局部变量str消失,方法内部产生的新的字符串对象称为垃圾
      // 但是s还是指向原有的字符串对象,并没有改变
      str += "test";
      }
    • String.intern()

      • 存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同unicode的字符串常量,如果有,返回其引用,没有的话就在常量池中添加一个unicode等于str的字符串并返回它的引用
    • Java中常见的面试题

【Java基础】String StringBuffer StringBuilder的更多相关文章

  1. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  2. Java基础 -- String,StringBuilder,StringBuffer三者的区别

    结论 1-String,StringBuilder,StringBuffer 之间的区别主要是在两个方面,即运行速度和线程安全这两方面: 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:St ...

  3. java中String,StringBuffer,StringBuilder之间的区别

    文章转载自:http://www.cnblogs.com/frankliiu-java/archive/2010/07/05/1771537.html String是固定长度的字符串,如果要发生变化必 ...

  4. java 比较String StringBuffer StringBuilder

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  5. Java学习|String,StringBuffer,StringBuilder?

    1 String   (1) String的创建机理 由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池.其运行机制是:创建一个字 ...

  6. Java基础 String/StringBuff/StringBuilder 常用操作方法复习/内存分析/三者的效率比较

    附:jdk1.8使用IDEA安装.创建.使用JUnit单元测试 笔记总结: /**String 复习 * 1.像C++这样的char arr[]="..." 的方式无法声明Java ...

  7. Java中String/StringBuffer/StringBuilder区别(转)

    1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String 2.String <(StringBuffer,StringBuild ...

  8. Java基础-String和StringBuilder类型(11)

    String类概述 字符串是由多个字符组成的一串数据字符串可以看成是字符数组 构造方法 public String(String original)public String(char[] value ...

  9. Java的String&StringBuffer&StringBuilder

    一:String类 1.String对象的初始化 由于String对象特别用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = "ab ...

  10. Java之String,StringBuffer,StringBuilder类

    在 java 语言中, 用来处理字符串的的类常用的有 3 个: String.StringBuffer.StringBuilder. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2 ...

随机推荐

  1. [Usaco2008 Dec]Secret Message 秘密信息

    2794: [Usaco2008 Dec]Secret Message 秘密信息 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 7  Solved: 3 ...

  2. iOS 错误及解决汇总

    1. iOS 错误 之 http请求 2. iOS 错误 之 Unexpected interface name 'HomeListCell': expected expression 3. iOS ...

  3. CocoaPods ReactiveCocoa 学习实践一 之 配置环境

    1.安装CocoaPods 1.00.参考 CocoaPods 文档 1.01.是否已安装 which pod 1.1.升级gem命令 sudo gem update --system 1.2.切换C ...

  4. Leetcode 175. Combine Two Tables

    Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...

  5. 段落p元素内的响应式文本布局就靠rem单位实现

    <!DOCTYPE html><html><head lang="en">    <meta charset="UTF-8&qu ...

  6. 2. 托管对象数据模型的基本知识(Core Data 应用程序实践指南)

    第一章的例子配置好了持久化存储区.持久化存储协调器.托管对象上下文.但是还没有对象图,本章要介绍托管对象模型的基础知识,并配置范例程序的对象图. 2.1. 托管对象模型是什么 托管对象模型是一种数据结 ...

  7. ubuntu vi编辑insert时上下左右建为ABCD

    ubuntu  在vi编辑insert时上下左右建不能移动光标而是输出ABCD,backspace也不能起删除作用, 开始我退出insert模式就能够移动和删除了,不过这样太麻烦很不适应, 只要一次执 ...

  8. swift 导航的使用

    导航还是有必要来搞一下的!!!!! 这只是一些基本的导航的使用.....感兴趣的猿可以自己去 废话不多   源码奉上   ⬇️ 首先  delegate里面 在 func application(ap ...

  9. MyBatis 一对一关联查询

    xml文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC & ...

  10. jstree获取整棵树的json数据

    $("#树ID").jstree(true).get_json();