加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – String,String Builders,Character Arrays和Arraylist之

发布时间:2020-12-15 04:42:56 所属栏目:Java 来源:网络整理
导读:字符串是不可变的. Stringbuilders不是,所以你可以在最后添加字符.字符串是字符数组,如果我没有错,比为什么我们单独使用字符数组和字符串分开,我们真的需要使用字符数组吗? 其次,有字符数组,然后有Arraylists.数组列表包含完整的对象?实际上我有点困惑. St
字符串是不可变的. 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','l','e'};

Arraylist<MyCar>obj = new Arraylist<MyCar>();

哪个应该用在哪里?

解决方法

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

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

Will that take memory equal to using String like below?

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

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

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:

return“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;

……这很丑陋.

但重要的是要记住,在极少数情况下,除了特定性能问题之外,在所有情况下都无关紧要,并且具有可读性(增强可维护性)是首选.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读