我正在阅读" 更好,更快,更轻的Java "(由Bruce Tate和Justin Gehtland撰写)并且熟悉敏捷类型团队的可读性要求,例如Robert Martin在其清晰的编码书中所讨论的内容.在我现在的团队中,我被告知明确不使用+运算符,因为它在运行时创建了额外的(和不必要的)字符串对象.
但是这篇文章,写于04年,讨论了对象分配是关于10个机器指令的.(基本上免费)
它还讨论了GC如何帮助降低此环境中的成本.
什么是使用之间的实际性能的权衡+,StringBuilder还是StringBuffer?(就我而言,它StringBuffer仅限于Java 1.4.2.)
StringBuffer对我来说导致丑陋,不太可读的代码,正如Tate的书中的几个例子所示.而且StringBuffer是线程同步的,这似乎有它自己的成本是大于中使用了"危险" +操作.
思想/意见?
String是Java中的一个特例.这是一个类,我可以在源代码中检查它,但它也有自己的中缀运算符+,它似乎是语法糖StringBuilder.
例如,
"Hello " + yourName;
Run Code Online (Sandbox Code Playgroud)
可能成为
new StringBuilder().append("Hello ").append(yourName).toString();
Run Code Online (Sandbox Code Playgroud)
Java中没有用户定义的运算符,所以在哪里+指定String?
是否可以使用相同的机制来制作其他运算符,例如向量?
当我看到这样的东西(伪1线):
str1 + "a" + str2
Run Code Online (Sandbox Code Playgroud)
是否比以下(伪1线)更糟(或更好/相等)?
str1 + 'a' + str2
Run Code Online (Sandbox Code Playgroud)
更新:更好的例子(由@QPaysTaxes提供)以减少关于我原始示例的混淆.
我尝试了什么:
过去10年编程Java的各种东西,但我从来没有真正看到底层的东西 - 例如我会假设第二个稍微"更快/更好",因为没有为其创建的String-Object Java的斜杠标志和/或垃圾收集器必须处理更少.我曾经为Java证书做好准备,可能本来可以在那个时候更好地争论,但是我的日常业务似乎也是关于Java的"理论"必须保持最新...我知道没有任何比我indexOf('c')应该使用的假设更好的解释而不是indexOf("C")我想知道是否相同的字符串连接.
我也搜索了一下,但由于我的标题可能暗示我不太好描述我正在寻找的没有例子.对此我很抱歉,这个差点的可能性只是产生了重复.
我将尝试: 基于这里接受的答案字符串连接:concat()vs"+"运算符我希望能够有一个开始看到底层的什么,有一天能够争论/回答这样的问题,深入了解.
Java没有运算符重载的概念.
Still +运算符表现为带数字的加法运算符,并将运算符与字符串连接起来.这类似于运算符重载行为.
那么,Java是否有运算符重载?
几分钟前我看到了这个问题,并决定查看java String类来检查+运算符是否有一些重载.
我找不到任何东西,但我知道我能做到这一点
String ab = "ab";
String cd = "cd";
String both = ab + cd; //both = "abcd"
Run Code Online (Sandbox Code Playgroud)
实施的地方在哪里?
import java.util.*;
import java.lang.*;
import java.io.*;
class Test {
public static void main (String[] args) {
String a="hello"+"world"; //line 1
String b="hello";
String c="world";
String d=b+c;
String e="helloworld";
System.out.println(e==a);
System.out.println(a==d);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
true
false
Run Code Online (Sandbox Code Playgroud)
从这个讨论中,String类如何覆盖+运算符?我知道'a'和'e'将引用相同的String文字对象.
有谁能告诉你
为什么a和d不是指同一个字符串文字对象?
第1行创建了多少个对象
在我的应用程序中一切正常,但我想提高性能并优化我的代码.
这两个中哪一个更好
1.initialisation
String str1=new String("Hello");
String str2="Hello";
Run Code Online (Sandbox Code Playgroud)
2.concatenation
System.out.println(s1 + s2);
System.out.println(new StringBuffer(S1).append(s2));
Run Code Online (Sandbox Code Playgroud) 任何人都可以告诉我Java中String的'+'运算符的确切实现.我知道这是concat运算符连接两个字符串,即使那时因为String是一个类,那么这个运算符的实现在哪里以及它是如何工作的?
所以在这个基本的Java程序中,
public class HelloWorld{
public void testFunc(){
System.out.println("Class = "+this);
}
@Override
public String toString(){
return "TEST";
}
public static void main(String[] args){
int i = 5;
HelloWorld hw = new HelloWorld();
System.out.println("Hello, World");
hw.testFunc();
System.out.println(i);
}
}
Run Code Online (Sandbox Code Playgroud)
该行System.out.println(i);自动将其转换int i为a String.我认为任何需要String类型参数的函数都会在java中自动执行此转换(与C中不同).但是,如果我在Android
Toast.makeText(getApplicationContext(), i, Toast.LENGTH_SHORT).show();
中尝试将其i声明为int扩展活动类中的一个,则应用程序会在启动时崩溃.那么这种转换在Java中是如何工作的呢?