Java 字符串、字符串生成器、字符数组和Arraylist之间的区别

Java 字符串、字符串生成器、字符数组和Arraylist之间的区别,java,arrays,string,arraylist,Java,Arrays,String,Arraylist,字符串是不可变的。StringBuilder不是,因此可以在末尾追加字符。如果我没有错的话,字符串就是字符数组,那么为什么我们要分别使用字符数组和字符串,我们真的需要使用字符数组吗 其次是字符数组,然后是数组列表。数组列表保存完整的对象?其实我有点困惑 String cat = "c" + "a" + "t"; cat = cat + cat; StringBuilder sb = new StringBuilder(); sb.append(city); sb.append(", "); s

字符串是不可变的。StringBuilder不是,因此可以在末尾追加字符。如果我没有错的话,字符串就是字符数组,那么为什么我们要分别使用字符数组和字符串,我们真的需要使用字符数组吗

其次是字符数组,然后是数组列表。数组列表保存完整的对象?其实我有点困惑

String cat = "c" + "a" + "t";
cat = cat + cat;

StringBuilder sb = new StringBuilder();
sb.append(city);
sb.append(", ");
sb.append(state);
sb.toString();

Char apple[5]={'a','p','p','l','e'};

Arraylist<MyCar>obj = new Arraylist<MyCar>();
字符串cat=“c”+“a”+“t”; 猫=猫+猫; StringBuilder sb=新的StringBuilder(); 某人(城市); 某人加上(“,”); 某人附加(州); 某人扭动弹簧(); Char-apple[5]={'a','p','p','l','e'}; ArrayListBj=新的Arraylist();
当?

字符串是包含底层字符数组的不可变对象时,应使用哪个字符串

在第2行中,您放弃在第1行中创建的字符串,并创建一个新字符串。
字符串生成器避免为每个单独的子字符串创建新的字符串对象

数组和Arraylist都可以包含对象,主要区别在于Arraylist可以增长,而数组不能。第二个区别是Arraylist实际上是一个列表…

a
String
使用
char[]
String
不是
char[]
,就像
ArrayList
不是
String[]
一样


ArrayList
类型是一种动态数据结构。这意味着它可以根据需要增长<代码>数组是静态的,这意味着它的维度在其生命周期内不会改变。

通常字符串用于基于字符串的正常需求,并且当字符串可以满足它时

字符串生成器在您想要操纵和播放字符串时使用

字符数组用于当您想轻松地迭代每个字符时


ArrayList是一个集合。使用它来保存特定类型的对象。

这解释了最好的方法:在string和stringBuilder之间 参考:

请注意,其目的(通常)是减少内存流失,而不是减少使用的内存总量,从而使垃圾收集器的工作更轻松

Will that take memory equal to using String like below?
不,这会造成更多的内存流失,而不仅仅是你引用的直接concat。(直到/除非JVM优化器发现代码中的显式StringBuilder是不必要的,并尽可能对其进行优化。)

如果该代码的作者想要使用StringBuilder(有支持的,也有反对的;请参阅本答案末尾的注释),最好正确地使用它(这里我假设id2和table周围实际上没有引号):

请注意,我在StringBuilder构造函数中列出了一些适当的大小,这样它就有足够的容量来容纳我们将要附加的全部内容。如果不指定,则使用的默认大小为16个字符,这通常太小,导致StringBuilder必须重新分配以使其更大(IIRC,在Sun/Oracle JDK中,每次用完空间时,它会将自身加倍[或更多,如果它知道需要更多来满足特定的附加])

您可能听说过,如果使用Sun/Oracle编译器编译,字符串连接将在幕后使用StringBuilder。这是真的,它将使用一个StringBuilder作为整个表达式。但它将使用默认构造函数,这意味着在大多数情况下,它必须进行重新分配。不过,它更容易阅读。请注意,对于一系列串联,情况并非如此。例如,它使用一个StringBuilder:

返回“prefix”+variable1+“middle”+variable2+“end”

它大致可以翻译为:

StringBuilder tmp = new StringBuilder(); // Using default 16 character size
tmp.append("prefix ");
tmp.append(variable1);
tmp.append(" middle ");
tmp.append(variable2);
tmp.append(" end");
return tmp.toString();
所以这没关系,虽然默认构造函数和随后的重新分配并不理想,但可能性是它已经足够好了,而且连接更具可读性

但这只适用于一个表达式。为此使用了多个StringBuilder:

String s;
s = "prefix ";
s += variable1;
s += " middle ";
s += variable2;
s += " end";
return s;
最终会变成这样:

String s;
StringBuilder tmp;
s = "prefix ";
tmp = new StringBuilder();
tmp.append(s);
tmp.append(variable1);
s = tmp.toString();
tmp = new StringBuilder();
tmp.append(s);
tmp.append(" middle ");
s = tmp.toString();
tmp = new StringBuilder();
tmp.append(s);
tmp.append(variable2);
s = tmp.toString();
tmp = new StringBuilder();
tmp.append(s);
tmp.append(" end");
s = tmp.toString();
return s;
…这太难看了


不过,重要的是要记住,除了极少数情况外,在所有情况下,这都无关紧要,除非出现特定的性能问题,否则最好使用可读性(提高可维护性)。

字符串在java中不是字符数组,Sting是对象。当您在内部向字符串追加字符时,JVM使用StringBuffer.string是对象吗?类型为?@user3510103类型为
String
的对象。我们在java中有String类,您可以将String创建为String s=newstring(“abcd”);字符数组是连续的内存位置,而Arraylist使用链表数据结构!这意味着arraylist和arrays之间的唯一区别是arraylist是dianamic,后者是staticstatic,有不同的含义,所以我不会这样称呼数组。我喜欢你的答案。我怎样才能投票呢?该网站不允许我访问。上面说我需要15个名声我喜欢你的回答。我怎样才能投票呢?该网站不允许我访问。上面说我需要15个名声我喜欢你的回答。我怎样才能投票呢?该网站不允许我访问。上面说我需要15分钟reputation@user3510103这意味着当你获得15个声望时(现在是12个),你将能够提高投票率。这是一个简单的安全机制,防止机器人投票。在这里,你可以找到关于如何获得(或失去)声誉的简单解释。非常感谢你。哇,这是最好的答案,我如何才能投票给这个答案?我需要15个代表:(.最好的一个,它解释了一切。非常感谢你,阿美。我很高兴如果它有帮助,你可以稍后投票:)上帝的母亲,你真的全力以赴@ami+1Plus one。很好地解释了@AmiPatel
String s;
StringBuilder tmp;
s = "prefix ";
tmp = new StringBuilder();
tmp.append(s);
tmp.append(variable1);
s = tmp.toString();
tmp = new StringBuilder();
tmp.append(s);
tmp.append(" middle ");
s = tmp.toString();
tmp = new StringBuilder();
tmp.append(s);
tmp.append(variable2);
s = tmp.toString();
tmp = new StringBuilder();
tmp.append(s);
tmp.append(" end");
s = tmp.toString();
return s;