最近做checkbox默认勾选的时候,涉及到两个list直接比较彼此对象的Id属性是否相同的问题。
Bean类:
public class Bean { private String name; private String id; private String ch; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCh() { return ch; } public void setCh(String ch) { this.ch = ch; } }
造出两个list:
Bean b1 = new Bean(); b1.setId("1"); b1.setName("n1"); Bean b2 = new Bean(); b2.setId("2"); b2.setName("n2"); Bean b3 = new Bean(); b3.setId("3"); b3.setName("n3"); Bean b4 = new Bean(); b4.setId("4"); b4.setName("n4"); Bean b5 = new Bean(); b5.setId("2"); b5.setName("n2"); Bean b6 = new Bean(); b6.setId("1"); b6.setName("n1"); List<Bean> la = new ArrayList<Bean>(); la.add(b1); la.add(b2); la.add(b3); la.add(b4); List<Bean> lb = new ArrayList<Bean>(); lb.add(b5); lb.add(b6);
写一个测试的main方法:
for(int i=0;i<la.size();i++){ if(lb.contains(la.get(i).getId())){ la.get(i).setCh("ch"); } else{ la.get(i).setCh(" "); } System.out.println("eeee"+la.get(i).getId()+"-----"+la.get(i).getCh()); }
输出结果是:
eeee1-----
eeee2-----
eeee3-----
eeee4-----
eeee2-----
eeee3-----
eeee4-----
这结果完全不是自己想要的,查了一下,list.contains(o),系统会对list中的每个元素e调用o.equals(e),方法,假如list中有n个元素,那么会调用n次o.equals(e),只要有一次o.equals(e)返回了true,那么list.contains(o)返回true,否则返回false,控制台打印了一下直接返回的false,顿时明白了什么。
不多说,再重新修改下
for(int i=0;i<la.size();i++){ for(int k=0;k<lb.size();k++){ if(lb.get(k).getId().equals(la.get(i).getId())){ la.get(i).setCh("ch"); } else{ la.get(i).setCh(" "); } } System.out.println("eeee"+la.get(i).getId()+"-----"+la.get(i).getCh()); }
输出结果:
eeee1-----ch
eeee2-----
eeee3-----
eeee4-----
eeee1-----ch
eeee2-----
eeee3-----
eeee4-----
这结果还是不对啊,无奈想到了debug断点调试,发现问题了,再次修改一下了。
for(int i=0;i<la.size();i++){ for(int k=0;k<lb.size();k++){ if(lb.get(k).getId().equals(la.get(i).getId())){ la.get(i).setCh("ch"); break; } else{ la.get(i).setCh(" "); } } System.out.println("eeee"+la.get(i).getId()+"-----"+la.get(i).getCh()); }
输出结果
eeee1-----ch
eeee2-----ch
eeee3-----
eeee4-----
总结出一点,有时候我脑子挺容易短路的。
相关推荐
理解这两个过程可以帮助我们避免资源泄漏和确保对象状态的正确性。 4. **继承与多态**:继承允许一个类(派生类)从另一个类(基类)继承属性和行为,实现了代码复用和类的层次结构。多态是通过虚函数实现的,允许...
// 直线的两个端点 // 构造器、属性访问器和交点计算方法... } public class Circle extends Shape { private Point center; private double radius; // 构造器、属性访问器和交点计算方法... } public ...
28. 两个对象值相同但hash code不同是可能的,因为哈希码的生成可能基于对象的不同属性,即使值相同,属性的顺序可能不同。 29. 对象作为参数传递时,Java总是进行值传递。对于引用类型,传递的是对象引用的副本,...
3. **联合继承(Joined Table Inheritance)**:子类和父类各自有自己的表,但子类表会包含一个引用父类主键的列,以保持关联。`<joined-subclass>`元素用于定义子类,并通过`<key column>`指定引用父类的列。 **...
例如,`String`类的`equals()`方法比较的是两个字符串的内容是否相同。 7. **字符串常量池**: Java中的字符串常量存储在字符串常量池中,当创建字符串时,如果字符串内容相同,它们会指向同一内存地址。例如,`...
- 年轻代又细分为Eden区和两个Survivor区(S0和S1)。大部分对象都在年轻代中分配和回收。 3. **垃圾回收算法**: - Java使用多种垃圾回收算法,包括标记-清除算法、复制算法、标记-整理算法等。 - 这些算法根据...
在Java编程语言中,泛型(Generics)和反射(Reflection)是两个非常重要的特性,它们各自提供了不同的功能,但也可以结合使用以实现更复杂的编程需求。本文将深入解析这两个概念,以及它们如何在实际应用中结合。 ...
例如,`Rectangle`类需要两个属性表示长和宽,`Circle`类需要一个属性表示半径,而`RightTriangle`类则需要两个直角边的长度。 在"选择框架"部分,我们需要设计一个功能,允许用户输入不同类型的框架和其尺寸,直到...
多态是面向对象编程的三大特性之一,另外两个是封装和继承。多态性意味着同一消息可以被不同类型的对象响应,提供了代码的复用性和灵活性。在Java中,多态主要体现在两个方面:编译时多态和运行时多态。编译时多态...
- equals()方法用于比较对象的内容,如果两个对象的内容相同,equals()通常会返回true。 12. **sleep()与wait()方法的区别** - sleep()让当前线程暂停指定时间,然后继续执行,不会释放对象锁。 - wait()使线程...
当比较两个对象是否相同时,`Set`通常会根据它们的`equals()`方法的结果来判断。如果两个对象通过`equals()`方法被认为是相同的,则它们被认为是同一个元素。 #### Error 和 Exception - **Error**: 表示应用程序...
2. 虚基类:为了解决多继承可能导致的“菱形问题”,即当一个类同时继承了两个有共同父类的子类时,可能出现的重复父类实例,我们使用虚基类来确保只有一个父类实例。在师生信息管理中,所有继承自“人员”的类均将...
- **示例**:例如,在一个“动物”类的基础上创建“狗”和“猫”类,这两个类都将继承“动物”的基本属性和方法,同时还可以添加各自特有的属性和行为。 **3. 封装** - **定义**:封装是指将对象的状态(数据成员...
29. **两个对象值相同但 hash code 不同** 是可能的,例如两个不同的对象可能满足 `equals()` 条件,但它们的哈希码不一定相同。 30. **值传递和引用传递**:Java 总是按值传递,对于基本类型是直接传递值,对于...
Entity类是其他三个类的父类,它包含了两个属性:name(String)、permissions(Set); User类继承Entity类,包含三个属性:password(String)、email(String)、memberships(Set); Group类继承Entity类,包含四个属性: ...
第二十九,两个对象值相同(x.equals(y) == true),但hash code可以不同,因为不同的对象可能有相同的值,但哈希码不一定相同。 第三十,对象作为参数传递时,Java总是按值传递。但对象的引用是按值传递的,这意味...
使用类再生的两个方式:组合(new)和继承(extends),这个已经在 thinking in java中提到过. 设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用...
12. **`==`与`equals`**:`==`比较的是两个对象的地址值是否相同,而`equals`比较的是两个对象的内容是否相同。 13. **`break`与`continue`**:`break`用于退出整个循环,`continue`用于跳过当前循环的剩余部分,...
`Map`集合提供了一种高效的方式来关联两个对象,使得可以通过一个键(key)快速找到其对应的值(value)。HashMap、TreeMap等是常用的Map实现,它们各自有不同的特性和使用场景。 在系统中定义对象,如`Employee`类...