关联逻辑关系数据的存储方式

      Map作为一种容器,最大的价值就是它可以存储key-value对,这样就能方便我们快速查找对应的值(这就是关联逻辑关系数据)。但是,如果我们不仅仅是想要保存对象间的这种逻辑联系,还想要通过它们的这种对应关系,做更多的操作,比如说,我们每个学生,都有对应的学号,当初保存的时候并没有对学号进行排序,而且它们也确实是没有任何规律可言,我们想要的是学号能够按照自然顺序排序的学生名单,那么,我们一开始应该怎样保存呢?现在我这里有两种解决方案,其中就是封装学生这个对象,这个对象里面封装了学生名和学号这两个数据,然后将它存储在一个对象List中,就能利用List的相应方法进行操作。另一种就是我们的Map存储,虽然它的确是方便我们查询,但是如果想要根据key来进行排序,先要取出key,这样的动作,老实说,很麻烦,先上一个普通的版本:

Set keys = map.keySet();
if (keys != null) {
   Iterator iterator = keys.iterator();
   while (iterator.hasNext()) {
      Object key = iterator.next();
      Object value = map.get(key);
   }
 
}

我们可以看到,这里使用了一个方法,就是keySet(),这个方法能映射出key的set视图,而且我们对这个set进行的任何操作都会直接影响到原来的key,所以使用时必须注意。它支持元素的移除,通过Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作,从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。 因为对这个映射的操作都会影响到原有的key,所以,我们如果确实需要进行删除,我们更多时候是将其变成一个数组,像是这样:String[] keySet = map.keySet().toArray(new String[0]); 这样我们的移除操作就不会影响到原来的key了。这种处理方式是我们必须时刻谨记的,任何对容器直接的操作都是具有危险的,我们要寻找间接层来进行操作。

     我们注意到,上面这种方法只是将key映射出来而已,所以我们还是需要使用到get()方法。但是,如果是entrySet()就不需要,因为它映射出来的就是包含key-value的Collection视图。

 
Set entries = map.entrySet();
if (entries != null) {
   Iterator iterator = entries.iterator();
   while (iterator.hasNext()) {
       Map.Entry entry = (Entry) iterator.next();
       Object key = entry.getKey();
       Object value = entry.getValue();
    }
}

它的使用依然是需要通过Iterator,但是这次我们必须将它强制转型为Map.Entry,这个其实就是相当于一个封装了key-value的对象,并且这个对象可以使用getKey(),getValue()取出对应的key和value,而且我们的操作更多了,因为它是一个对象,方法更多。从效率上看,后面一种速度更快,而且使用起来更加方便,所以,后者是个首选。但是,就算是这种更加方便的方法,其实也是利用第一种方法,就是封装对象的方法,所以如果单单只是存储这种关系并且进行少量的操作,我们可以选择封装对象这个方法,但是如果我们需要经常根据key值来查询大量的数据,就得使用map了。

 
       
原文地址:https://www.cnblogs.com/wenjiang/p/2733000.html