但这是否意味着他们是一样的?
不要向我提供相同的意见或虚假的概念.告诉我他们什么时候不一样.
用坚硬的科学来支持你的主张!
字节代码就足够了.我对JIT特定的优化并不那么感兴趣.
我对世界目前的状况特别感兴趣,即最近的里程碑中的Scala 2.11.
解决方法
你应该训练你的手指输入s.length和arr.length.
这并不难,因为字符串和数组都有长度.
从Java进入Scala的人经常会决定是否在java.lang.String上使用这些方法或者使用方便的扩充.由于在我们需要从休息室到replenish it with donuts之前我们有一个有限的“决策预算”,因此作为一项政策问题,最好先做出一些这些决定.
万一没有什么比午餐或甜甜圈更好的讨论了:
22: invokevirtual #41 // Method scala/Predef$.augmentString:(Ljava/lang/String;)Ljava/lang/String; 25: invokespecial #44 // Method scala/collection/immutable/StringOps."<init>":(Ljava/lang/String;)V 28: invokevirtual #47 // Method scala/collection/immutable/StringOps.size:()I 18: invokevirtual #39 // Method scala/Predef$.intArrayOps:([I)Lscala/collection/mutable/ArrayOps; 21: invokeinterface #44,1 // InterfaceMethod scala/collection/mutable/ArrayOps.size:()I
等等,等待,你可以失去augmentString.
它是GenSeqLike引入长度并指定它“产生与大小相同的结果”. SeqLike以这种方式实现它.
事实上,String通过扩充到SeqLike获取一个size方法,特别是StringLike.这需要包装.实际上,要预测哪些调用需要换行或调度到扩展方法并不容易.
例如,长度的定义方式是不需要包装.那是因为StringOps是一个值类.实际上,它编译为String.length.
但是,StringOps上的apply方法(定义为对charat的调用以模拟数组应用)虽然以相同的方式定义,但调用扩展方法.
(当然,在JIT编译之后,一些操作码和分配可能没什么意义.)
scala> val s = "hello" s: String = hello scala> val n = s.length ; val i = s.size ; val c = s(4) ; s.slice(0,4) n: Int = 5 i: Int = 5 c: Char = o res0: String = hell scala> :javap -prv - public $line4.$read$$iw$$iw$(); flags: ACC_PUBLIC Code: stack=5,locals=7,args_size=1 0: aload_0 1: invokespecial #32 // Method java/lang/Object."<init>":()V 4: aload_0 5: putstatic #34 // Field MODULE$:L$line4/$read$$iw$$iw$; 8: aload_0 9: getstatic #39 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$; 12: invokevirtual #42 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String;
长度:
15: invokevirtual #47 // Method java/lang/String.length:()I 18: putfield #22 // Field n:I 21: aload_0
新的StringOps或StringOops:
22: new #49 // class scala/collection/immutable/StringOps 25: dup 26: getstatic #54 // Field scala/Predef$.MODULE$:Lscala/Predef$; 29: getstatic #39 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$; 32: invokevirtual #42 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String; 35: astore_2 36: astore_1 37: aload_2
StringOps.size:
38: invokespecial #57 // Method scala/collection/immutable/StringOps."<init>":(Ljava/lang/String;)V 41: invokevirtual #60 // Method scala/collection/immutable/StringOps.size:()I 44: putfield #25 // Field i:I 47: aload_0 48: getstatic #65 // Field scala/collection/immutable/StringOps$.MODULE$:Lscala/collection/immutable/StringOps$; 51: getstatic #54 // Field scala/Predef$.MODULE$:Lscala/Predef$; 54: getstatic #39 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$; 57: invokevirtual #42 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String; 60: astore 4 62: astore_3 63: aload 4 65: iconst_4
申请延期方法:
66: invokevirtual #69 // Method scala/collection/immutable/StringOps$.apply$extension:(Ljava/lang/String;I)C 69: putfield #28 // Field c:C 72: aload_0 73: getstatic #65 // Field scala/collection/immutable/StringOps$.MODULE$:Lscala/collection/immutable/StringOps$; 76: getstatic #54 // Field scala/Predef$.MODULE$:Lscala/Predef$; 79: getstatic #39 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$; 82: invokevirtual #42 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String; 85: astore 6 87: astore 5 89: aload 6 91: iconst_0 92: iconst_4
和切片:
93: invokevirtual #73 // Method scala/collection/immutable/StringOps$.slice$extension:(Ljava/lang/String;II)Ljava/lang/String; 96: putfield #31 // Field res0:Ljava/lang/String; 99: return
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。