使用默认值初始化数组中的对象 - java

Posted

技术标签:

【中文标题】使用默认值初始化数组中的对象 - java【英文标题】:Initializing an object in an array with a default value - java 【发布时间】:2016-07-18 16:01:18 【问题描述】:

有没有办法为要初始化的数组中的对象定义默认值?

与声明原始类型数组时初始化原始类型的方式相同:

int[] myIntArray = new int[5]; // we now have an array of 5 zeroes
char[] myCharArray = new char[2]; // an array in which all members are "\u0000"

等等

我想声明一个我定义的类型的对象数组,并让它们以类似的方式自动初始化。 我想这意味着我想为数组中的每个索引运行new myObject()(使用默认构造函数)。

我无法在网上找到任何相关的东西,我得到的最接近的是在初始化数组之后使用Arrays.fill(myArray, new MyObject())(实际上只是创建一个对象并用指向它的指针填充数组),或者只是使用循环遍历数组并初始化每个单元格。

谢谢!

编辑:我意识到这不仅与数组有关,而且与一般声明对象并让它们默认为值/自动初始化有关。

【问题讨论】:

这种行为在JLS中有很好的定义。 没有内置的解决方案,这与 Java 在分配数组时会为您清零的方式不同。一个相当不错的解决方案是:Stream.generate(() -> new MyObject()).limit(5).toArray(MyObject[]::new) 你能详细说明这到底是做什么的吗?谢谢! @Cardano 你应该把这个作为答案。 @Cardano 使用 Java 8 的功能真是太棒了。 【参考方案1】:

这样做是为了在声明数组时可以对其进行初始化:

int[] myIntArray =  0, 0, 0,0,0;
char[] myCharArray =  'x', 'p' ;

你当然可以这样做:

int[] myIntArray = new int[5]; 

并且在 for 循环中将所有索引设置为初始值...但是如果数组更大,这可能需要一段时间...

编辑:

对于自定义对象也是一样的,只是在init中使用匿名构造函数

示例:

public class SOFPointClass 

private int x;
private int y;

    public SOFPointClass(int x, int y) 
    this.x = x;
    this.y = y;


    // test
    public static void main(String[] args) 
        SOFPointClass[] pointsArray =  new SOFPointClass(0,0) ,  new SOFPointClass(1,1);
    

【讨论】:

我认为这不是他想要的。他在谈论对象。 我确实在谈论对象。我给出了 int 和 char 数组作为原始类型发生情况的示例,这就是我想要对对象执行的操作。 (而且我是一个女人。只是说:)) 哦,我现在明白了,请用 SOFPointClass 看看答案中的更新 @HadasJacobi 对不起'他'。 :)【参考方案2】:

Java 8 方式:

MyObject[] arr = Stream.generate(() -> new MyObject())
    .limit(5)
    .toArray(MyObject[]::new);

这将创建由供应商() -> new MyObject() 生成的无限对象Stream,将流限制为所需的总长度,并将其收集到一个数组中。

如果您想在对象或其他东西上设置一些属性,您可以有更多参与的供应商:

() -> 
  MyObject result = new MyObject();
  result.setName("foo");
  return result;

【讨论】:

【参考方案3】:

据我所知,仅使用普通 java 无法完成您想做的事情(也就是说,可能有一个我不知道的外部库)。

我会接受打击并在数组上循环。像这样的东西应该可以工作:

myObject[] array = new myObject[5];

for (int i = 0; i < array.length; i++) 
    array[i] = new myObject();

您也可以使用 lambdas 来缩短它,例如他的回答中提到的 Cardano。

【讨论】:

【参考方案4】:

在 Java 中,数组使用类型的默认值进行初始化。例如,int 默认值为 0。对象数组的单元格的默认值为 null,因为数组单元格仅包含对包含对象本身的内存槽的引用。默认引用指向null。为了用另一个默认值填充它,你必须像你提到的那样调用 Arrays.fill()。

Object[] arr=new Object[2];
Arrays.fill(arr, new Object());

【讨论】:

谢谢,但正如我所提到的,据我的测试显示,这会用指向同一个新对象的指针填充数组,这没有用(至少在这种情况下......) 好的,我得到了你需要的东西......所以无论是循环还是在 Java 8 中使用上面解释的流方式【参考方案5】:

我没有看到 Java 提供的方法来做到这一点。

我的建议是定义一个函数来做到这一点。

Object[] initialize(Class aClass, int number) throws IllegalAccessException, InstantiationException 
    Object[] result = new Object[number];
    for (int i = 0; i < number; ++i) 
        result[i] = aClass.newInstance();
    

那就叫Object[] arr = initialize(YourClass.class, 10)

【讨论】:

以上是关于使用默认值初始化数组中的对象 - java的主要内容,如果未能解决你的问题,请参考以下文章

java中如何初始化对象数组,并增加元素

java类中构造函数中:数组怎样初始化

java解析java中的数组

java中怎么数组初始化?

Java基础知识点(数组的地址值及元素访问和动态初始化数组默认初始值的变化规律)

java 类型类怎么初始化赋值