List的removeAll方法异常?

原创 2012年03月26日 09:37:25

现在正在实现的一个模块,是用Hibernate做的,一个用户对应多个频道,用的是一对多的关联,配置方件如下:
User表:

Java code
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
 <class lazy="false" name="com.autonavi.monitor.model.User" table="user">
  <id name="userId" type="integer" unsaved-value="0">
   <column name="userId"/>
   <generator class="native"/>
  </id>
  <property  name="name" type="string">
   <column name="name" />
  </property>
  <property  name="userName" type="string">
   <column name="userName" not-null="true"/>
  </property>
  <property name="password" type="string">
   <column name="password" not-null="true"/>
  </property>
  <property name="actor" type="int">
   <column name="actor"/>
  </property>
  <property name="authority" type="string">
   <column name="authority"/>
  </property>
  <property  name="email" type="string">
   <column name="email"/>
  </property>
  <property name="phone" type="string">
   <column name="phone"/>
  </property>
 <property name="phone1" type="string">
   <column name="phone1"/>
  </property>
  <property name="phone2" type="string">
   <column name="phone2"/>
  </property>
  
  <set name="channels" cascade="all" lazy="false">
      <key column="userId" />
      <one-to-many class="com.autonavi.monitor.model.Channel"/>
  </set>
  
 </class>
</hibernate-mapping>




频道表:

Java code
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
 <class lazy="false" name="com.autonavi.monitor.model.Channel" table="channel">
  <id name="channelId" type="integer" unsaved-value="0">
   <column name="channelId"/>
   <generator class="native"/>
  </id>
  <property  name="channel" type="string">
   <column name="channel" />
  </property>
  <property  name="channelName" type="string">
   <column name="channel_name"/>
  </property>
  <property  name="delayTime" type="integer">
   <column name="delay_time" not-null="true"/>
  </property>
 </class>
</hibernate-mapping>


在Action里面做相应的查询,由于取消了懒加载,在查出的User里面会取到对应的频道列表

Java code
List<Channel> userChannelList = new ArrayList<Channel>();
            Channel channel = null;
            Set<Channel> channelSet = modifyUser.getChannels();
            Iterator<Channel> iterator = channelSet.iterator();
            while(iterator.hasNext()) {
                channel = (Channel)iterator.next();
                userChannelList.add(channel);
            }



用Hibernate的HQL功能取到所有的频道:

Java code
@SuppressWarnings("unchecked")
    public List<Channel> getChannelList() {
        String sql = "";
        sql = "from Channel";
        List<Channel> list = this.getHibernateTemplate().find(sql);
        return list;
    }



现在我要得到剩下的频道,所以想着是用得到的所有的频道List调用removeAll方法去掉当前用户占用的频道List

Java code
channelList.removeAll(userChannelList);



本来挺简单的,可执行后发现并没有达到预期的效果,不能从所有的频道中把当前用户占用的频道remove掉,找了很久才发现所有频道List中包含的当前用户占用的频道的hashcode和当前用户占用的频道List中的频道的hashcode值不一样,其他值都相同,猜测可能是因为这所以不能执行remove操作,我想知道为什么会出现这种情况?该怎么实现我上面所说的需求?

 

解决方案:

hashcode算法加入了数组的初始长度,也就是说初始长度不同的数组(ArrayList)中相同对象的hashcode有可能不同

channelList只能remove自己的对象,你那个list是别的对象,它怎么删别人?
你只有通过嵌套for,根据判断channelList.get(i).channelId==userChannelList.get(j).channelId
如果相同,则channelList.remove(i),这样一个一个删除。

 

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

如何使用Java List等集合类的removeAll方法

看到这个标题,估计很多人会纳闷:连集合类的removeAll方法都用不好还当什么程序员。   好吧,我承认我确实没用好这个方法,鄙视我吧。O(∩_∩)O哈!   先贴问题---...

Java 集合之List 集合的删除方法顺序分析以及remove和removeAll区别

接下来看 remove()方法 public class TestList { public static void main(String args[]) { // 结果: Hello ...

List的removeAll()方法与equals()方法之坑

最新在项目中遇到一个坑,大概如下:public class MainTest { public static void main(String[] args) { //创建一个L...

获取两个List中重复或不同的元素---removeAll()和addAll()的使用

昨天项目中遇到了一个将查询结果增量发出的,即每次比上次增的获取。 这个问题同事去网上找了好多高人写的代码,我看了好久,感觉被绕了,最后想着还是用最简单的方式来做,可能好一些。 package co...

解决Duilib list控件,removeall() 时存在内存泄露的问题

遇到的问题:最近在测试新客户端时,发现刷新duilib list控件时,内存嗖嗖的往上涨,几千条数据来回刷新,内存占用就涨到了200兆左右。起初还以为是自己构造的list没有及时释放造成的,后面改了之...

JAVA 集合框架优化之list.removeAll大数据量优化

今天在公司做项目需要求两个集合的补集,考虑到collection类有removeAll方法,决定采用这种方式;结果程序一直卡在那儿不动了; 数据量是两个集合的数据差不多都有60万,直接导致程序处于假死...

JavaScript Array模拟C#list RemoveAll实现删除符合条件的元素

作为一个跨平台多语言编程爱好者的我来说,当我用了一次C#list 的linq的RemoveAll后,再敲JavaScript 的数组想也用这个方法才发现这语言压根是弱爆了,不得已准备自己实现一下JS的...

List的add方法报空指针异常

/**      * 查询好友列表      */     @Override     @ResponseBody     public J...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)