`
步青龙
  • 浏览: 295614 次
  • 性别: 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(); } ...

    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