(array& string)Java与C的区别

时间:2010-09-27 09:22:56

标签: java c

我知道C和我正在进入Java并且对它的数组和字符串方法感到困惑。它与C中的数组和字符串完全不同。请帮助我理解C和Java之间的区别(对于字符串和数组)。

7 个答案:

答案 0 :(得分:24)

答案 1 :(得分:17)

在C中,字符串通常只是一个(或指向)字符的数组,以NUL(\ 0)字符结尾。您可以像处理任何数组一样处理字符串。

但是,在Java中,字符串不是数组。 Java字符串是java.lang.String类的实例(对象)。它们代表字符数据,但内部实现不向程序员公开。您不能将它们视为数组,但是,如果需要,您可以将字符串数据提取为字节或字符数组(方法getBytesgetChars)。另请注意,Java字符始终为16位,而C中的字符通常(并非总是)为8位。

答案 2 :(得分:8)

阵列:

第一个明显的区别是Java不使用与C相同的声明语法。在C中,数组下标是声明符的一部分,而在Java中它是类型规范的一部分:

int[] arr;  // Java, arr is null until array object is instantiated
int arr[];  // C, incomplete declaration

请注意,在Java中,arr存在,但是为空值。在C中,arr在出现完整声明之前不存在。

int[][] 2Darr; // Java, arr is null until array object is instantiated
int 2Darr[][]; // Illegal declaration in C; size must be specified for at least
               // the outer dimension

Java中的数组对象必须使用new操作进行实例化,并且指定了数组大小:

int[] arr = new int [10];
int[][] 2Darr = new int[10][20];

如果数组不是基本类型,则必须单独实例化每个单独的数组元素:

String[] strs = new String[10];
for (int i = 0; i < strs.length; i++)
  strs[i] = new String("some value");

Java中的数组表达式没有类型“衰减”到C中的数组表达式之类的指针类型(这很方便,因为Java本身没有指针类型 ); Java中的数组类型是“第一类”对象,这意味着它们在任何上下文中都保留了它们的所有类型特征。将数组对象传递给方法时,该方法接收数组对象,而不是指针。

Java数组知道它们有多大(由.length属性给出)。

的字符串:

与C不同,Java提供了一种独特的String数据类型。不要将Java字符串视为以0结尾的char数组;他们是不同的东西。

Java String对象是不可变的;您无法修改String对象的内容。您可以从现有String对象的已修改内容创建新的String对象。还有像StringBuilder和StringBuffer这样的类,它们允许您直接操作字符数据并创建新的String对象。

希望有所帮助。

答案 3 :(得分:2)

C中的字符串只是一个字符数组。除了惯例之外,当找到NUL字符(\ 0)时,字符串结束。

所有字符串支持都依赖于C标准库中的函数,例如strlen(),strcpy()等。

要告诉C“字符串”的大小,您必须将指针传递给单独的函数。你可以说C中根本没有字符串,只是char数组的约定。

另一方面,Java作为语言本身的一部分内置了字符串。 Java String有方法,可以告诉你它的大小。 Java有原始类型,如C:float和int。

但它也有“Objects”和String是一种对象。

到目前为止,这与C和C ++之间的区别非常相似。

答案 4 :(得分:1)

在C字符串中确实是以'\ 0'结尾的字符数组。在Java中,字符串是一个类。最好将java字符串与C ++中的std :: string进行比较,而不是C字符数组。

声明: - 在C - char str [100];在Java中 - String str;

在Java中,在大多数情况下,您不需要担心字符串实现,因为提供了丰富的成员函数来使用它。在C中也有许多API,如strlen,strcpy,strcat,它们对于正常操作来说已经足够了。

当您必须执行涉及两个字符串的操作时,主要区别在于。例如 让我们说给其他人分配一个字符串。在jave,它是直截了当的。

String str1(“This is Stack Overflow。”);
String str2;

str2 = str1;

但在C语言中,您必须使用循环来分配每个字符。现在再一次,这并不意味着Java做得更快,因为内部java也做同样的事情。只是程序员不知道这一点。

在Java中,一些操作可以使用自然运算符来完成,例如比较。

str1 == str2。

但在C语言中你必须使用strcmp函数。

的strcmp(STR1,STR2);

在C语言中工作时,您必须且必须知道如何在内部操作字符串。在Java中你绝对不能。

现在在C中,在堆区域上创建字符串时,您还必须格外小心。

char * str1 = malloc(100);

您必须使用free(str1)释放此内存。在Java中,程序员不需要知道堆内存或堆栈内存,所以这样的事情不会出现。

答案 5 :(得分:0)

String是JAVA中的一个对象,与C

中的Character数组不同

答案 6 :(得分:0)

如果你真的需要知道差异,你需要知道p中的ptr和java中的ref之间的差异 当你在C:char str [10]中说; ==&GT;你在内存中分配一个序列10个块,每个块的大小是sizeof(char),并以null结尾,这样你就可以处理具有正常ptr操作的字符串。

java:当你说String str; ==&GT;你创建了一个对象java.lang.String,它继承了java.lang.String类中的一些方法,比如compare(),equals(),contains(),charAt()等等。

C:执行你用ptrs处理的普通字符串操作,或者你使用头文件中准备好的函数,里面的文件处理内存块不多也不少。
例如:比较2个字符串=&gt;的strcmp(STR1,STR2);

java:正如我所说,如果你想比较2个字符串,java中的每个东西都是一个对象:
String str1;
String str2;
str1.equals(STR2);

C:一个String必须是NULL-Terminated才能知道你何时应该停止,如果你尝试在字符串后读取块就不会发生坏事(它会编译并且不会崩溃)

Java:正如我所说String是一个对象所以你不需要处理内存如果你试图访问String之外的元素它会抛出indexOutOfBoundException,你的程序会崩溃,除非你处理这个异常。