在Java中添加到ArrayList
我是Java开发新手,我尝试了以下程序:在Java中添加到ArrayList,java,Java,我是Java开发新手,我尝试了以下程序: List<String> myList = new ArrayList<String>(); for(int i = 0;i<ProductNumber;i++) { myList.add( mProducts[i].Name); } mProducts[1].Name = "Hello"; 有人能告诉我发生了什么事吗 这是我编写的代码: public clas
List<String> myList = new ArrayList<String>();
for(int i = 0;i<ProductNumber;i++)
{
myList.add( mProducts[i].Name);
}
mProducts[1].Name = "Hello";
有人能告诉我发生了什么事吗
这是我编写的代码:
public class xmlParsing
{
private final static String XML_FILE_NAME = "Configuration.xml";
private final static String PRODUCT_NODE = "product";
private final static String TASK_NODE = "task";
private final static String NAME_ITEM = "name";
private final static String DURATION_ITEM = "duration";
private final static String RATE_ITEM = "rate";
private static int ProductNumber = 0;
private static int TaskNumber = 0;
private static Product mProducts[] = new Product[Product.MAX_PRODUCT_NUMBER];
public xmlParsing()
{
}
public void parseXML ()
{
Product[] Products = new Product[Product.MAX_PRODUCT_NUMBER];
try
{
File xmlFile = new File(XML_FILE_NAME);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();
NodeList productsNode = doc.getElementsByTagName(PRODUCT_NODE);
ProductNumber = productsNode.getLength();
Product mproduct = new Product();
Task mtask = new Task();
for (int i = 0; i < productsNode.getLength(); i++)
{
Node productNode = productsNode.item(i);
if (productNode.getNodeType() == Node.ELEMENT_NODE)
{
Element element1 = (Element) productNode;
mproduct.Name = getValue(NAME_ITEM, element1);
NodeList tasksNode = element1.getElementsByTagName(TASK_NODE);
TaskNumber = tasksNode.getLength();
Task[] Tasks = new Task[Task.MAX_TASKS_NUMBER];
for (int j = 0; j < tasksNode.getLength(); j++)
{
Node taskNode = tasksNode.item(j);
if (taskNode.getNodeType() == Node.ELEMENT_NODE)
{
Element element2 = (Element) taskNode;
mtask.Name = getValue(NAME_ITEM, element2);
mtask.Duration = Double.parseDouble(getValue(DURATION_ITEM, element2));
mtask.Rate = Double.parseDouble(getValue(RATE_ITEM, element2));
Tasks[j] = new Task(mtask);
}
}
mproduct.Tasks = Tasks;
Products[i] = new Product(mproduct);
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
mProducts = Products;
}
private static String getValue(String tag, Element element)
{
NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes();
Node node = (Node) nodes.item(0);
return node.getNodeValue();
}
public static List<String> getProdcutNames()
{
String ps[] = new String[ProductNumber];
List<String> myList = new ArrayList<String>();
for(int i = 0;i<ProductNumber;i++)
{
ps[i] = mProducts[i].Name;
myList.add(new String(mProducts[i].Name));
}
mProducts[2].Name = "Hello";
return myList;
}
public int getProductNumber()
{
return ProductNumber;
}
public int getTasktNumber()
{
return TaskNumber;
}
}
public class Task {
public static final int MAX_TASKS_NUMBER = 100;
public String Name;
public double Duration;
public double Rate;
public Task(){
Name = "";
Duration = 0;
Rate = 0;
}
public Task(Task t){
Name = t.Name;
Duration = t.Duration;
Rate = t.Rate;
}
}
public class Product {
public static final int MAX_PRODUCT_NUMBER = 200;
public String Name;
public Task[] Tasks;
public Product(){
Name = "";
Tasks = null;
}
public Product(Product p){
Name = p.Name;
Tasks = p.Tasks;
}
}
public class Production {
public static void main(String[] args) {
xmlParsing parser = new xmlParsing();
parser.parseXML();
for(int i=0;i<parser.getProductNumber();i++)
System.out.println(parser.getProdcutNames().get(i));
}
}
公共类xml解析
{
私有最终静态字符串XML\u FILE\u NAME=“Configuration.XML”;
私有最终静态字符串PRODUCT\u NODE=“PRODUCT”;
私有最终静态字符串TASK_NODE=“TASK”;
私有最终静态字符串名称\u ITEM=“NAME”;
私有最终静态字符串持续时间\u ITEM=“持续时间”;
私有最终静态字符串速率\u ITEM=“RATE”;
私有静态int ProductNumber=0;
私有静态int TaskNumber=0;
私有静态产品MPProducts[]=新产品[Product.MAX_Product_NUMBER];
公共XML解析()
{
}
公共空解析XML()
{
Product[]Products=新产品[Product.MAX_Product_NUMBER];
尝试
{
文件xmlFile=新文件(XML文件名);
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
Document doc=dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();
NodeList productsNode=doc.getElementsByTagName(产品节点);
ProductNumber=productsNode.getLength();
产品MPProduct=新产品();
任务mtask=新任务();
对于(int i=0;i 对于(int i=0;i看起来mProducts
和myList
是指同一个对象,但在您给出的代码中,这是不可能发生的。您是否简化了代码,删除了类似mProducts=myList
的内容?像这样更改您的代码,应该可以达到目的
List<String> myList = new ArrayList<String>();
for(int i = 0;i<ProductNumber;i++)
{
myList.add( new String(mProducts[i].Name));
}
mProducts[1].Name = "Hello";
List myList=new ArrayList();
对于(int i=0;i感谢您发布完整的代码。问题是您在main()
中多次调用getProdcutNames()
(顺便说一句,您在那里的名称有输入错误)
-每次在main
中循环调用getProdcutNames()
:
for(int i=0;i<parser.getProductNumber();i++)
System.out.println(parser.getProdcutNames().get(i));
无法复制您的行为。发布代码示例可能会有所帮助。我猜myProducts包含名称值为“a”、“Hello”和“C”的条目。您是否要打印MPProducts?使用实际代码,问题将永远不会重现,因为String
实例是不可变的。您的代码中一定有错误,或者执行其他操作,例如隐藏变量,从而导致此问题。或者mList.Name
和MPProducts.Name
引用相同的问题object@A.E.Drew:但是Java字符串是不可变的。@RichieHindle除非我弄错了,否则我在数组和列表中看到对对象实例中的字段的赋值?String
引用不是不可变的…@owlstead引用不是不可变的,但是更改引用不会影响实际对象。@owlstead:myList
是字符串数组,而不是对象实例数组。@user1955287无论您如何尝试这些小更改,问题都出在未发布的代码中。@user1955287-不确定“未发布的代码”是什么意思。如果您仔细查看myList.add(新字符串(MPProducts[I].Name)),我做了一个小更改。在代码中,您正在传递对列表的引用,这意味着myList和MPProducts[i]中的对象。Name将指向同一个对象,这就是我将其更改为新字符串(MPProducts[i].Name)的原因
List<String> myList = new ArrayList<String>();
for(int i = 0;i<ProductNumber;i++)
{
myList.add( new String(mProducts[i].Name));
}
mProducts[1].Name = "Hello";
for(int i=0;i<parser.getProductNumber();i++)
System.out.println(parser.getProdcutNames().get(i));
List<String> names = parser.getProdcutNames();
for(int i = 0; i < names.size() ;i++)
System.out.println(names.get(i));