java中char和String中的字节

来源:百度知道 编辑:UC知道 时间:2024/06/18 05:53:04
java中char类型的占用2个字节 ,而String呢? 比如char c='a';那么是不是说c占用了2个字节?可是对于字母来说,8位就够了,那么后面的一个字节还算吗? 到底是1个字节还是用了2个?
我在看关于InputStream的时候,读取一个字节,那么假如我存储的是字母,那么读了一个字节后,也就是低8位后,我再去读一个字节(高8位),那不是没有意义的吗? 搞糊涂了,请指点下!

大哥,string不是基本类型的,晕...
string类, 它的容量是动态增长的, 所以其类的内部实现肯定有关于动态内存的操作, 这和数组的定义是不同的, 数组的大小是在编译期间就确定的, 而string类的大小是在程序运行期间动态确定的。

#include <iostream>
using namespace std;

struct Test
{int* p;};

int main()
{
Test t;
cout << sizeof(t); // 32位机器上毫无疑问的4字节, 你我共识

t.p = new int[4096];
cout << sizeof(t); // 会变吗?

delete [] t.p;
}

再看string类的真面目, 打开string文件, 你可以看到这句:
typedef basic_string<char> string;
所以其只是basic_string对于char类型的一个typedef, 这样的话其内部的字符序列就肯定是用char* 类型指针来来操作的了, 毫无疑问sizeof(char*) == 4, 但是为什么sizeof(string) == 16呢, 这是因为string类中还有其他的数据成员, 比如记录字符长度的数据成员是一个32位的无符号整型, string::size()方法其实就是返回这一成员的值了. 但4 + 4 == 8 != 16, 所以不排除有其他的数据成员的存在, 但还有一个要考虑的问题就是内存的对齐问题:

#include <iostream>
using namespace std;

#define GetSize(TypeName, msg)\
cout << "class "#TypeName" "#msg" -> " \
<