1、Java String 类

  String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰的类是不允许被继承的,并且该类中的成员方法都默认为final方法。String对象一旦被创建就是固定不变的了,对String对象的任何操作都不会影响到原对象,相关的任何改变操作都会生成新的对象。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

字符串直接赋值的方式创建对象:直接赋值方式创建对象是在方法区的常量池,只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。

通过构造方法创建的字符串对象:通过构造方法创建字符串对象是在堆内存,会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,而且不能够自动入池,需要通过public  String intern();方法进行手工入池。

在开发的过程中不会采用构造方法进行字符串的实例化。

字符串常量池:

字符串的创建和其他对象的创建一样需要消耗高昂的时间和空间,但因为字符串我们经常使用,所以为了提高虚拟机的性能和减少内存开销,在实例化的时候进行了一些优化:使用字符串常量池。具体过程如下:每当我们通过直接赋值的方式创建字符串常量的时候,虚拟机会首先检查字符串常量池,如果字符串常量池有的话,就直接返回常量池中的引用,但是如果没有的话,就会实例化该字符串并且将它放到常量池(在方法区)中。

2、Java StringBuffer 和 StringBuilder 类

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

事实上,StringBuilder和StringBuffer类拥有的成员属性以及成员方法基本相同,StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

注意:

  • 对于直接相加的字符串效率很高,因为在编译期就确定了它的值,也就是说形如"I"+"love"+"java"; 的字符串直接相加,在编译期间就会被优化成了"Ilovejava";对于间接相加,形如s1+s2+s3; 效率要比直接相加低,因为在编译期不会对引用变量进行优化。
  • String、StringBuilder、StringBuffer三者的执行效率:StringBuilder > StringBuffer > String

3、面试题总结:

输出的结果为false,这里虽然将变量b用final修饰了,但是由于其赋值是通过方法调用返回的,那么他的值只能在运行期间确定,所以a和c指向的不是同一个对象。

6、String str = new String("abc")创建了多少个对象?

  这个问题需要分不同的情况进行说明:是这段代码执行过程中创建了几个对象还是涉及到几个对象?

这段代码在运行期间确实只创建了一个对象,即在堆上创建了"abc"对象。而为什么大家都在说是2个对象呢,这里面要澄清一个概念  该段代码执行过程和类的加载过程是有区别的。在类加载的过程中,确实在运行时常量池中创建了一个"abc"对象,而在代码执行过程中确实只创建了一个String对象。

因此,这个问题如果换成 String str = new String("abc")涉及到几个String对象?合理的解释是2个。

Java基础知识总结--String、StringBuffer、StringBuilder的更多相关文章

  1. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

  2. [改善Java代码]正确使用String,StringBuffer,StringBuilder

    CharSequence接口有三个实现类与字符串有关:String,StringBuffer,StringBuffer.虽然它们都与字符串有关,但是其处理机制是不同的. String类是不可改变的量, ...

  3. JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类

    字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...

  4. C#基础知识之String,Stringbuilder和Stringbuffer

    String可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了存储数值不可改变的字符串. StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义 ...

  5. 【Java基础】String StringBuffer StringBuilder

    String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...

  6. stringBuffer、StringBuilder、排序、Arrays、Jdk1.5新特性(java基础知识十三)

    1.StringBuffer类的概述 * A:StringBuffer类概述 * 通过JDK提供的API,查看StringBuffer类的说明 * 1.线程安全的可变字符序列. * 2.可将字符串缓冲 ...

  7. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  8. Java学习笔记--String StringBuffer StringBuilder

    String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...

  9. Java基础知识回顾之二 ----- 修饰符和String

    前言 在上一篇中,回顾了Java的基本数据类型 ,这篇就来回顾下Java中的一些修饰符以及String. 修饰符介绍 Java修饰符主要分为两类: 访问修饰符 非访问修饰符 其中访问修饰符主要包括 p ...

随机推荐

  1. Visual Studio 2017 IDE之xml过大报错

    XML处理时遇到这个错误 在powershell中输入 $vsWherePath = Join-Path ${env:ProgramFiles(x86)} "Microsoft Visual ...

  2. bat循环打印输出1到10

    关键词:for cmd中查看帮助: for /? 循环一个数字序列: FOR /L %variable IN (start,step,end) DO command [command-paramete ...

  3. 无法创建链接服务器 "ORCL" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的实例 (错误:7302)

    原文:https://www.cnblogs.com/tiger2soft/p/6954308.html 在sqlserver中创建oracle的链接服务器时,提示此错误. 按照网上的方案,先后使用了 ...

  4. 【译】写好JavaScript条件语句的5个技巧

    译文 当我们写JavaScript代码时,经常会用到到条件判断处理,这里有5个技巧能使你写出更好.更简洁的条件语句. 1.使用Array.includes处理多种条件 让我们来看一下的例子: // c ...

  5. C# 之 GUID格式化

    Guid的带参数的ToString()方法来实现格式化,如下: //// 摘要: //     根据所提供的格式说明符,返回此 System.Guid 实例值的字符串表示形式. //// 参数: // ...

  6. exshop第6天

    发现grails mongodb插件中的一个BUG并进行了提交,grails项目管理人员还进行了回复,主要是配置failOnError 后不起作用了,不过项目负责人还是确认了这个问题,估计会比较快的解 ...

  7. ArcObjects 中连接geodatabase

    参考资料: 1. http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/d/0001000003s8 ...

  8. Python_模块介绍

    模块:一组或者一个.py文件实现了某个功能的代码集合 模块分为三种: 自定义模块 内置标准模块(又称标准库):Python自带的模块 开源模块:自己写的模块,有可以供人使用的功能 开源模块的集散地:P ...

  9. Python_生成器generator

    生成器:调用时返回一个迭代器 如果一个函数中包含yield语法,那这个函数就会变成一个生成器 例1: def draw_money(draw): #这个函数称为生成器 while draw >0 ...

  10. Balanced Number 数位dp

    题意: 给出求ab之间有多少个平衡数   4139为平衡数   以3为轴   1*1+4*2==9*1 思路很好想但是一直wa  : 注意要减去前导零的情况 0 00 000 0000   不能反复计 ...