Java数据类型:字符串和数组

Java数据类型:字符串和数组,java,arrays,string,Java,Arrays,String,我一直在阅读Sun Microsystem的Java教程,在阅读以下内容时遇到了一些问题: 第二,readPassword返回一个字符数组,而不是字符串,因此可以 覆盖,一旦不再需要,就将其从内存中删除。“ 我的问题是: 1) 至于其他数据类型,例如值数据类型(int、float、boolean等)和引用类型(用户定义的对象等),Java中的数组和字符串有什么不同 2) 你能详细解释一下上面关于字符数组和字符串的陈述吗 附言: 对Q1的澄清:关于Q1,我想问的更多的是,在Java中,数组和字符

我一直在阅读Sun Microsystem的Java教程,在阅读以下内容时遇到了一些问题:

第二,readPassword返回一个字符数组,而不是字符串,因此可以 覆盖,一旦不再需要,就将其从内存中删除。“ 我的问题是:

1) 至于其他数据类型,例如值数据类型(int、float、boolean等)和引用类型(用户定义的对象等),Java中的数组和字符串有什么不同

2) 你能详细解释一下上面关于字符数组和字符串的陈述吗

附言:


对Q1的澄清:关于Q1,我想问的更多的是,在Java中,数组和字符串作为数据类型是什么。。。对于它们类似对象的属性,当有人声称字符串和数组在严格意义上不是对象时,我很容易感到困惑…

a
String
在内部将其内容存储为
字符的数组。您不能直接操作此数组(无反射),因为
字符串
是不可变的


密码位于
char[]
中的原因是您可以立即在内存中覆盖它。如果它在
字符串中
,您将不得不等待下一次垃圾回收,并且您永远不知道这将需要多长时间;攻击者可能在此之前将其从内存中读取。

正如其他人所说,字符串是不可变的,所以您无法自己清除它。即使在垃圾收集之后,内存也可能完好无损。所有的安全协议都将敏感数据定义为字节数组,所以你可以这样做

  char[] password = "secret";

  // After using it
  for (int i; i < password.length; i++) 
     password[i] = 0;
  password = null;
char[]password=“secret”;
//使用后
for(int i;i
在实践层面上,
String
char[]
之间的主要区别在于前者的实例是不可变的,后者的实例是可变的。当然,stringapi提供了大量有用的方法字符串操作方法

让我们来谈谈语言的相似性和差异性

首先,Java中的字符串和数组实例都是对象。根据Java语言规范:

4.3.1对象对象对象是类实例或数组

参考值(通常只是 引用)是指向这些的指针 对象和一个特殊的空引用, 指的是没有对象

。。。其中字符串的类是
java.lang.string

数组和其他对象类型之间的语言区别在于数组的类型不是普通的Java类。例如:

  • 数组类型是用与普通类不同的语法声明的
  • 数组实例是使用与普通类实例不同的语法创建的
  • 数组类型不能在Java源代码级别命名
  • 不能声明数组类型的子类型/子类
但是所有数组类型都是
java.lang.Object
的(直接)子类型,这意味着您可以(例如)将数组分配给
Object
类型的变量,并调用对象API中的方法。(你可以用这些方法做一些有趣的事情来演示数组的“对象性”…但我离题了)

那么字符串呢?如上所述,“string”是一个普通对象,它是类
java.lang.string
的实例。从语言学的角度来看,这门课没有什么不寻常的地方。它被声明为“final”,因此您不能声明子类型,但这并不罕见

与其他类相比,
String
有点特别,因为Java语言提供了一些语言结构来支持字符串:

  • 有一种特殊的
    String
    literal语法用于获取可在编译时确定其内容的字符串
  • “+”运算符重载以支持
    String
    串联
  • 从Java7开始,
    switch
    语句支持打开
    String
  • Java语言规范定义/假设Java.lang.String类具有某些属性和方法;e、 g.字符串是可变的,有一个
    concat
    方法,字符串文本是“内部的”
顺便说一下,说所有字符串实例都保存在字符串池中的答案是不正确的。字符串只有在被暂存时才会被放入池中,这只会自动发生在字符串文本和可以在编译时计算其值的字符串中。(您可以通过调用
string.intern()
方法强制对字符串实例进行内部调用,但这有点昂贵,而且通常不是一个好主意。)

  char[] password = "secret";

  // After using it
  for (int i; i < password.length; i++) 
     password[i] = 0;
  password = null;