一尘不染

字符串和字符数组之间的区别

java

这些声明之间有何不同?

String s="MY PROFESSION";
char c[]="MY PROFESSION";

每种情况下的内存分配如何?


阅读 172

收藏
2020-12-03

共1个答案

一尘不染

要更正编译错误,请使用以下char[]语句之一替换

String s = "MY PROFESSION";
char c1[] = "MY PROFESSION".toCharArray();
char c2[] = { 'M', 'Y', ' ', 'P', 'R', 'O', 'F', 'E', 'S', 'S', 'I', 'O', 'N' };
StringBuilder sb = new StringBuilder("MY PROFESSION");
StringBuffer sbu = new StringBuffer("MY PROFESSION");

下一节将以上陈述相互比较

字符串常量

String s="MY PROFESSION";
  • “ MY PROFESSION”是一个常量,并存储在String池中
  • s是不可变的,即String完整的内容无法修改。
  • 字符串的大小/长度是固定的(无法附加)

字符数组

 char c1[]="MY PROFESSION".toCharArray();
 char c2[]={'M', 'Y', ' ', 'P', 'R', 'O', 'F', 'E', 'S', 'S', 'I', 'O', 'N'};
  • c1保存String的基础数组的副本(通过System.arraycopy)并存储在堆空间中
  • c2 通过加载单个字符常量在堆栈框架中动态构建
  • c1c2是可变的,即的内容Array可以修改。c2[0]='B'
  • 数组的大小/长度是固定的(无法追加)

StringBuilder / StringBuffer

StringBuilder sb = new StringBuilder("MY PROFESSION");
StringBuffer sbu = new StringBuffer("MY PROFESSION");
  • 这两个sbsbu是可变的。sb.replace(0, 1, 'B');
  • 双方sbsbu存储在堆
  • 大小/长度可以修改。 sb.append( '!');
  • StringBuffer的方法是同步的,而StringBuilder的方法不是
2020-12-03