JAVA中创建了多个对象,为什么只重复出现一个对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中创建了多个对象,为什么只重复出现一个对象相关的知识,希望对你有一定的参考价值。

参考技术A

1、一般来说,最好能重用对象而不是在每次需要的时候就创建一个相同功能的新对象。重用方式既快速,又流行。如果对象是不可变的,它就始终可以被重用。
2、除了重用不可变的对象之外,也可以重用那些已知不会修改的可变对象。
首先我们在new
一个对象的时候,对象的id是唯一确定的;将对象add入list中时,放入list中的其实是对象的引用
;而每次循环只是简单的set
对象的属性,set新的属性值,而add进list中的对象还是同一个对象id,也就是同一个对象;
 所以每次add之后,list发现对象引用和之前元素一样,就覆盖掉了之前add的对象。所以循环之后list中的对象是重复的对象。
 想要避免这个问题只要每次add时保证对象引用都是不同的即可,即每循环一次重新new一个对象。
另外如果List集合在循环内new对象,只会添加最后一个元素。
new的对象应该放在for循环内,每循环一次重新new一个新对象

尝试在将文本文件分成部分的对象类中创建函数(Java)

我试图将文本文件分成150个部分,所以我在对象类本身中创建了一个函数。这是完整的对象类:

public TehilimEpisode(int EpisodeID, String[] ab)
{
    this.EpisodeID=EpisodeID;
    this.Perek=ab;
}
public static void setperek(TehilimEpisode[] pirkoni) throws IOException
{
    BufferedReader inputReader = new BufferedReader(new FileReader("C:\\*.txt"));
    String nextLine; String[] ab;
        while ((nextLine = inputReader.readLine()) != null)
        {   
        for(int i=1; i<=150;i++)
        {
            ab = nextLine.split("$");
            pirkoni[i] = new TehilimEpisode(i, ab);
        }
    }
    for(int i=1; i<=150; i++)
        pirkoni.toString();
}
@Override
public String toString() {
    return String.format(EpisodeID + " & " + Arrays.toString(Perek));
}
@Override
protected Object clone() throws CloneNotSupportedException {
    // TODO Auto-generated method stub
    return super.clone();
}
@Override
public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    return super.equals(obj);
}
@Override
protected void finalize() throws Throwable {
    // TODO Auto-generated method stub
    super.finalize();
}
@Override
public int hashCode() {
    // TODO Auto-generated method stub
    return super.hashCode();
}
}

函数名称是setperek。当我尝试从主类运行该函数时,它正在编写此错误:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Unknown Source)
    at TehilimEpisode.setperek(TehilimEpisode.java:25)
    at main.main(main.java:48)
答案

你必须用单个字符串读取整个txt然后用“$”拆分。这是我使用分隔符\z的例子,它用单个字符串读取整个文件,然后用“$”分割字符串。在下面的例子中我们在单行中阅读整本书,然后在剧集结尾处添加到你的书中时将其分成“$”。

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class FileReadingWithScanner {

  public static void main(String[] args) throws IOException {
    File file = new File("D:\book.txt");
    String book = "";
    Scanner sc = new Scanner(file);
    /* Using this delimiter you will be able to read whole file in single line. */
    sc.useDelimiter("\Z");
    book = sc.next();
    String[] episodeArr = book.split("$");
    //Do whatever you want.
  }
}

更新

String.split()将regex作为参数,$是Java正则表达式API中的元字符。因此,你需要逃避它:使用这个book.split("\$");

另一答案

问题是由这里引起的:ab = scanner.nextLine().split("$"); pirkoni[i] = new TehilimEpisode(i, ab);。想象一下,没有下一行。它将尝试使用ab = null创建TehilimEpisode对象。要解决这个问题,你应该检查是否有下一行:for(int i=1; i<=150 && scanner.hasNextLine() ;i++)。选择作为答案,如果它工作! :d

另一答案

将你的for循环更改为下面,这里我将scanner.nextLine()方法更改为nextLine String。

while ((nextLine = inputReader.readLine()) != null)
    {   
    for(int i=1; i<=150;i++)
    {
        ab = nextLine.split("$");
        pirkoni[i] = new TehilimEpisode(i, ab);
    }

}

您的代码中不需要扫描类,您已经有BufferedReader来读取文件。两者都是多余的。

toString()方法覆盖

在您的课程中添加类似下面的方法。

 @Override
    public String toString() {
        return String.format(EpisodeID + " & " +  Arrays.toString(Perek));
    }

以上是关于JAVA中创建了多个对象,为什么只重复出现一个对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中创建对象数组

如何将具有重复属性的元组组合成一个元组?

在c++中创建了类,但在创建新对象时,编译显示:不存在默认构造函数

Java中创建多个Scanner对象时报错NoSuchElementException

java里null集合和空集合占内存吗

在这个初始化过程中创建了多少临时对象?