`

String对象的两种创建方法比较

    博客分类:
  • Java
阅读更多
    相信不少同学都会看到"String s=new String("abc")共创建了多少个对象"之类的面试题,在此小议一下这个小问题,如有不对,望各位指正。

一、String的两种初始方法
1.String str1=new String("abc");
2.String str2="abc";

    这两个方法都可以得到String的对象。

二、两种初始化String方法的区别
    执行语句String str1=new String("abc")时,不管"String常量池"中是否存在字符串"abc",直接在堆内存中新建一个字符串"abc",然后将其赋给str1,并且在"String常量池"中创建"abc",故第一种方法共创建了2个对象(一个在堆内存上,一个在"String常量池"上)和一个引用变量。

   执行语句String str2="abc"时,首先查看"String常量池"中是否存在字符串"abc",如果存在则直接将"abc"赋给str2,如果不存在则先在"String常量池"中新建一个字符串"abc",然后再将其赋给str2。

    所以两种初始化的方法的区别是第一种方法不仅会在堆内存上建立相应的对象,还会在一块特殊的内存区域建立相应的对象,而第二种方法只在特殊的内存区域("String常量池")建String对象。

三、Java为什么这样设计?
    需要知道的是,String对象是不可变的,一旦创建就不能再作任何修改,否则JVM只会帮你创建一个新的且符合你的要求的String对象(不要被假象所迷惑) ,以下做一个小验证:
String a="abc";
a.concat("efg");
System.out.println("a="+a);  

     结果是:a=abc
     的确,在执行a.concat("efg")时会返回一个新的String对象,原对象并不会改变。
     这样的后果是造成大量的冗余。如上面执行完第二句后,a的依旧引用的是"abc",而新建的一个String对象"abcefg"并没有一个引用变量指向它,这片区域就成垃圾内存了……
     SUN把String设计成不可修改,引入"String常量池"是为了高效地使用内存。



分享到:
评论

相关推荐

    Javascript里的两种使用正则的方法

    正则表达式对象 两种创建方法 var my_regex=/[a-z]+/g; var my_regex=new (“[a-z]+”,”g”); 方法 exec(string),对string进行正则处理,并返回匹配结果. test(string),测试string是否含有匹配结果 ...

    JavaScript 三种创建对象的方法

    JavaScript中对象的创建有以下几种方式: (1)使用内置对象 (2)使用JSON符号 (3)自定义对象构造 一、使用内置对象 JavaScript可用的内置对象可分为两种: 1,JavaScript语言原生对象(语言级对象),如String、...

    对String的深入理解

    字符串文字"abc"是一个String对象; 文字池[pool of literal strings]和堆[heap]中的字符串对象。 一、引用变量与对象:除了一些早期的Java书籍和现在的垃圾书籍,人们都可以从中比较清楚地学习到两者的区别。A aa...

    JavaScript中string对象

    一.String:存储一个字符串,并且提供处理字符串需要的属性和方法。 1.创建String对象:显示和隐式 <... <... //申明String对象的两种方式:显式和隐式申明 //1.隐式 var myString="abc"; do

    java面试题目.docx

    答:String创建对象有两种情况: 第一种:如果String常量池中已经创建了“xyz”,则不会继续创建,此时只创建了一个对象new String(“xyz”) 第二种:如果String常量池中没有创建“xyz”,则会创建两个对象,一个...

    jsp九大内置对象

    1、Request对象  该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息...(虽然两种方式都能达到同样的目的)  9、Exception对象  在处理异常的网页中可以直接访问exception隐式对象。

    jsp内置对象的用法

    6 String toString() 把此Object对象转换成String类的对象 7 void notify() 唤醒一个等待的线程 8 void notifyAll() 唤醒所有等待的线程 9 void wait(int timeout) 使一个线程处于等待直到timeout结束或被...

    Java中String类和IO流——学习小结

    1.String类 知识点: 1.String认识 2.比较方式 3.判断方法 4.转换方法 5.其他一些方法 1.1String类认识 String类在java.lang包中...比较方式有两种 == 比较两个变量的地址 equals 比较两个变量包含的内容 String s

    【05-面向对象(下)】

    •Object类提供的equals方法判断两个对象相等的标准与==完全相同。因此开发者通常需要重写equals方法。 类成员 •在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用...

    Vue 创建组件的两种方法小结(必看)

    创建组件的两种方法小结 1.全局注册 2.局部注册 var child=Vue.extend({}) var parent=Vue.extend({}) Vue.extend() 全局方法 生成构造器,创建子类 使用基础 Vue 构造器,创建一个“子类”。 这样写非常繁琐。...

    JAVA面向对象详细资料

    23.2 常用方法:String toString() 34 24 继承整理 34 25 面向对象三大特性:多态(核心) 34 25.1 多态的前提? 35 25.2 什么是多态? 35 25.3 父类的引用指向子类实例时,父类引用可以调用哪些方法? 35 26 引用...

    C#实现根据实体类自动创建数据库表

    .Net新手通常容易把属性(Property)跟特性(Attribute)搞混,其实这是两种不同的东西 属性指的类中封装的数据字段;而特性是对类、字段、方法和属性等元素标注的声明性信息 如下代码(Id、Name为User的属性,[Db...

    Java的六大问题你都懂了吗

     后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,...

    javascript完全学习手册2 源码

    7.3.1 创建RegExp对象实例的两种方式 7.3.2 RegExp对象的属性 7.3.3 RegExp对象的方法 7.4 String对象中与正则表达式有关的方法 第8章 高级DoM技术 8.1 CSS样式 8.1.1 CSS语法 8.1.2 CSS属性 8.2 样式...

    C++实验报告.doc

    我公司为仪器生产企业,目前生产摄像机和行车记录仪两种产品,分别销售给用户。 摄像机包含摄像、图像质量设定、编码算法等属性。 将摄像机增加相应芯片(具有操作菜单、自动拍摄、车速传感器、源代码等功能)后,...

    java面向对象程序设计.pptx

    教学目标 理解数据抽象和数据隐藏 创建类 能够创建和使用对象 能够控制对实例变量和方法的访问 方法的重载 构造函数的使用 理解this引用的用法 理解Java的垃圾收集机制 static方法和域的使用 类的组合 包的创建和...

    超级有影响力霸气的Java面试题大全文档

     Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常...

    C#写的基本文件操作类,创建删除读写

    操作时两种模式,1.构造函数FileWriter()是先新建对象再用其他函数打开文件 2.FileWriter(string file_name)是对给定文件名进行操作,OpenForRead(),OpenForWrite()等函数打开,后面的操作就都一样了。 就是基本的...

    java排序代码

    TreeSet支持两种排序方式: 自然排序:TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列。 定制排序:在创建TreeSet集合对象时,并提供一个Comparator接口...

    javascript完全学习手册1 源码

    两种方式 168 7.3.2 RegExp对象的属性 170 7.3.3 RegExp对象的方法 173 7.4 String对象中与正则表达式 有关的方法 177 第8章 高级DOM技术 182 8.1 CSS样式 182 8.1.1 CSS语法 182 8.1.2 CSS属性 187 8.2 样式控制 ...

Global site tag (gtag.js) - Google Analytics