`
步青龙
  • 浏览: 297789 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
72ba33fb-eefe-3de1-bd65-82a6e579265d
Java面试
浏览量:0
社区版块
存档分类
最新评论

String的学问

阅读更多

String "a" + "b"+ "c";

到底生成了几个对象?这个问题在网上问了无数次了。

我也看的头昏眼花的,直接测试了一下。

 

 写道
public class Test {
public static void main(String[] args) {
String mango = "mango";
String s = "abc" + mango + "def";
System.out.println(s);
}
}
 

 

Test.java直接放在D盘下

 

cmd 命令行下的结果:

 

D:\>javac Test.java

 

D:\>java Test

abcmangodef

 

D:\>javap -c Test

Compiled from "Test.java"

public class Test extends java.lang.Object{

public Test();

  Code:

   0:   aload_0

   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V

   4:   return

 

public static void main(java.lang.String[]);

  Code:

   0:   ldc     #2; //String mango

   2:   astore_1

   3:   new     #3; //class java/lang/StringBuilder

   6:   dup

   7:   invokespecial   #4; //Method java/lang/StringBuilder."<init>":()V

   10:  ldc     #5; //String abc

   12:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

   15:  aload_1

   16:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

   19:  ldc     #7; //String def

   21:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

   24:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/la

ng/String;

   27:  astore_2

   28:  getstatic       #9; //Field java/lang/System.out:Ljava/io/PrintStream;

   31:  aload_2

   32:  invokevirtual   #10; //Method java/io/PrintStream.println:(Ljava/lang/St

ring;)V

   35:  return

 

}

 

 

D:\>

 

 

从这里可以看出编译器创建了一个StringBuilder对象,用以构造最终的String,并为每个字符串调用一次StringBuilder类的append()

 

到底编译器为String优化到了什么程度呢?写道

public class Test {
public String test(String[] fields){
String res = "";
for(int i = 0; i< fields.length;i++)
res+=fields[i];
return res;
}
}
 

 

 

C:\Documents and Settings\Administrator>D:

 

D:\>javac Test.java

 

D:\>javap -c Test

Compiled from "Test.java"

public class Test extends java.lang.Object{

public Test();

  Code:

   0:   aload_0

   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V

   4:   return

 

public java.lang.String test(java.lang.String[]);

  Code:

   0:   ldc     #2; //String

   2:   astore_2

   3:   iconst_0

   4:   istore_3

   5:   iload_3

   6:   aload_1

   7:   arraylength

   8:   if_icmpge       38

   11:  new     #3; //class java/lang/StringBuilder

   14:  dup

   15:  invokespecial   #4; //Method java/lang/StringBuilder."<init>":()V

   18:  aload_2

   19:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

   22:  aload_1

   23:  iload_3

   24:  aaload

   25:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/

String;)Ljava/lang/StringBuilder;

   28:  invokevirtual   #6; //Method java/lang/StringBuilder.toString:()Ljava/la

ng/String;

   31:  astore_2

   32:  iinc    3, 1

   35:  goto    5

   38:  aload_2

   39:  areturn

 

}

 

 

D:\>

无论如何String pool 里面放的就是最终的字符串?

2 文章分页

 

  • 大小: 17.8 KB
分享到:
评论

相关推荐

    JavaScript基础学问点归纳(推举)_.docx

    - JavaScript提供了三种基本的类型转换:Boolean(value),Number(value)和String(value),用于将值转换为相应的类型。 13. **Object对象**: - 所有JavaScript对象都继承自Object对象。Object对象的属性如`...

    oracle行转列oracle行转列

    sum(decode(subject_name, '学问', nvl(mark, 0), 0)) 学问, sum(decode(subject_name, '学问', nvl(mark, 0), 0)), sum(decode(subject_name, '学问', nvl(mark, 0), 0)) from test group by student_id, name...

    JAVA看不了string源码-java-skills::hot_springs:在此存储库中,您可以获得许多Java技能

    我一直认为「程序员不应该只局限于某种语言的使用者,而是应该成为语言的参与者」,点点滴滴,皆是学问,看到了、记住了,便是收获、便是进步。  在本系列博文中,作者将和大家一起分享 Java 中那些值得我们了解的...

    jsp 将从表单中获得的数组的值-含中文 进行转码后在JSP中正确显示

    out.print(sto01 + "俨学问" + xname + "学问为" + xcode_class + "学问状态为 "); } ``` 4. **处理中文乱码** - **编码转换**:由于表单提交的数据默认采用的是ISO-8859-1编码,而中文在该编码下无法正确...

    J2ME学习笔记 J2ME学习笔记 J2ME学习笔记

    #### 初始化学问的重要性 初始化是编程中的一个重要概念,尤其对于Java这种强类型语言来说,正确的初始化可以避免很多潜在的运行时错误。例如,未初始化的局部变量如果被使用,编译器会报错;而未正确初始化的对象...

    Java面试题及答案pdf

    一、Java 基础学问 1.Java 有那些基本数据类型,String是不是基本数据类型,他们有何区分。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb...

    C# 构造函数如何调用虚方法

    然而虚方法的使用却存在着很大学问,如果滥用的话势必对程序产生很大的负面影响。比如下面这个例子: public class Puzzle { public Puzzle() { Name = Virtual member call in constructor; Solve(); } ...

    C++专业考试常见问题解析与编程实践指南

    内容概要:本文档收录了典型的 ...附加说明:本参考资料既可用来系统性地检验自己的知识点完整性与否同时也能够帮助读者深入体会算法思维逻辑与具体语法表达间的联系从而促进他们综合运用所学问解答复杂工程实例问题。

    java程序员的跳槽方法.pdf

    跳槽不仅是一种策略,更是一种学问。以下是小编整理的java程序员跳槽方法,以供大家参考。 首先,需要强调一点,跳槽并没有坏处,但是频繁的跳槽就不好。在工作的前4年,必须跳槽,而且鼓励跳槽(建议经历2---3家...

    java程序员的跳槽方法.docx

    java 程序员的跳槽方法是一门学问,也是一种策略。人往高处走,这固然没有错。 但是,说来轻巧的一句话,它却包含了为什么走、什么是高、怎么走、 什么时候走,以及走了以后怎么办。 首先,跳槽对 IT 人来说绝对...

    提高C++程序运行效率的10个简单方法

    但是程序性能的优化也是一门复杂的学问,需要很多的知识,然而并不是每个程序员都具备这样的知识,而且论述如何优化程序提高程序运行效率的书籍也很少。但是这并不等于我们可以忽略程序的运行效率,下面就介绍一下...

    Mybatis中传递多个参数的4种方法总结

    面对各种复杂的业务场景,传递参数也是一种学问。本文将总结Mybatis中传递多个参数的4种方法,并且介绍了关于使用Mapper接口时参数传递方式。 方法1:顺序传参法 顺序传参法是Mybatis中传递多个参数的一种方法。该...

Global site tag (gtag.js) - Google Analytics