字符串,字符串构建器,字符数组和Arraylist之间的区别

时间:2014-04-08 08:52:21

标签: java arrays string arraylist

字符串是不可变的。 Stringbuilders不是,所以你可以在最后添加字符。字符串是字符数组,如果我没有错,比为什么我们单独使用字符数组和字符串分开,我们真的需要使用字符数组吗?

其次,有字符数组,然后有Arraylists。数组列表包含完整的对象?实际上我有点困惑。

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>();

应该在哪里使用?

4 个答案:

答案 0 :(得分:7)

这解释了最好:在string和stringBuilder之间 价:Correct way to use StringBuilder

请注意,目标(通常)是减少内存流失而不是使用的总内存,以使垃圾收集器的生活更轻松。

Will that take memory equal to using String like below?

不,它会导致更多的内存流失,而不仅仅是你引用的直接连接。 (直到/除非JVM优化器发现代码中的显式StringBuilder是不必要的并且优化它,如果可以的话。)

如果该代码的作者想要使用StringBuilder(有参数,但也有反对意见;请参阅本答案末尾的注释),最好是正确地做(这里我假设没有&#39; ; t实际上引用了id2和table):

StringBuilder sb = new StringBuilder(some_appropriate_size);
sb.append("select id1, ");
sb.append(id2);
sb.append(" from ");
sb.append(table);
return sb.toString();

请注意,我已经在StringBuilder构造函数中列出了some_appropriate_size,因此它开始时具有足够的容量来容纳我们要追加的完整内容。如果你没有指定一个,则使用的默认大小是16个字符,这通常太小而导致StringBuilder必须进行重新分配以使自己更大(IIRC,在Sun / Oracle JDK中,它自身加倍[或者更多,如果它知道它需要更多来满足特定追加]每次它用完房间时。)

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

返回&#34;前缀&#34; + variable1 +&#34;中&#34; + variable2 +&#34;端&#34 ;;

大致翻译为:

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;

......这很难看。

但是,重要的是要记住,除了极少数情况之外,除了特定的性能问题之外,除了可读性(增强可维护性)以外,所有这些都是首选。

答案 1 :(得分:2)

通常字符串用于基于正常字符串的要求,并且当字符串足够时。

只要您想操作和播放字符串,就会使用

字符串生成器

当你想要轻松迭代每个角色时,会使用

字符数组

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

答案 2 :(得分:1)

String是包含底层char数组的不可变对象。

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

两个数组和Arraylist都可以包含对象,主要区别在于Arraylist可以增长,数组不能。第二个区别是Arraylist真的是一个List ......

答案 3 :(得分:1)

String 使用 a char[]String不是char[],与ArrayList<String>不是String[]的方式相同。

ArrayList类型是动态数据结构。这意味着它可以根据需要增长。 Array静态,这意味着它的维度在其生命周期内不会发生变化。