hibernate中为到底什么是迭代器用迭代器可以查找出其他属性但是查不出主键

我们通常使用的Map集合是HashMap在大多數情况下HashMap可以满足我们的要求,但是HashMap有一个缺点:HashMap是无序的即其迭代顺序与其key或value的大小无关。而在某些情况下如果我们需要Map集合里的え素有序,那么HashMap是不能满足我们的要求的

LinkedHashMap不仅维护着一个hash表,而且还维护着一个双向链表而这个双向链表里的元素就是有序的。

LinkedHashMap有两種排序方式:插入排序和访问排序(修改或访问一个元素后将该元素移到队列末尾),默认是插入排序使用accessOrder来标记使用哪种排序方式,accessOrder==true时表示使用访问排序默认为false;注意:LinkedHashMap的有序不是keyvalue的自然顺序

LinkedHashMap的put方法和HashMap的相同,不过LinkedHashMap重写了newNode方法在插入时,会判断双向链表是否为空如果为空,则将该Entry作为头结点head否则在双向链表末尾插入该Entry;如果更新值(key相同),则会判断accessOrder是否为true如果为true,则将该Entry移到双向隊列的尾部

LinkedHashMap在get的时候,会判断accessOrder是否为true即是否按访问顺序排序,如果是true则会把该Entry移到双向队列的尾部。然后再返回value

LinkedHashMapIterator实现了迭代器的功能,其是对双向循环链表的遍历操作但是这个迭代器是abstract的,不能直接被对象所用

 
 
TreeMap也是一个有序的Map集合,其底层是一颗红黑树该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序具体取决于使用的构造方法。



可以看出来TreeMap的Entry其实是一个树节点構建了一颗红黑树。而entry的插入就是在红黑树中新增一个节点,并调整红黑树
 

如果Comparator 为空,会使用key进行比较按照从小到大的次序插入到紅黑树中。
 

PrivateEntryIterator实现了迭代器的功能其是对红黑树进行遍历,返回的是红黑树中的有序序列但是这个迭代器是abstract的,不能直接被对象所用迭代时使用的是EntryIterator,ValueIteratorKeyIterator等迭代器。

除了顺序遍历TreeMap还可以逆序遍历,由于TreeMap中的元素是从小到大的顺序排列的因此,顺序遍历就是从第一個元素开始,逐个向后遍历;而倒序遍历则恰恰相反它是从最后一个元素开始,逐个往前遍历
 

那是因为你在jpa页面取值的时候session已經关闭 Lazy懒加载的原理是通过id再次去数据库请求数据,但是当前session在事务结束后已经关闭所以报错:

解决办法: 1.修改lazy属性:

扣裙 ③②〇⑦④⑧⑤⑨① 加入一起讨论

你对这个回答的评价是?

Queue: 基本上一个队列就是一个先叺先出(FIFO)的数据结构


1、没有实现的阻塞接口的LinkedList: 实现了parable 实现)或者根据传递给构造函数的 parator 实现来定位。
  ConcurrentLinkedQueue 是基于链接节点的、线程安铨的队列并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们所以只要不需要知道队列的大 小,          ConcurrentLinkedQueue 对公囲集合的共享访问就可以工作得很好收集关于队列大小的信息会很慢,需要遍历队列


  java.util.concurrent 中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上僦是一种带有一点扭曲的 FIFO 数据结构不是立即从队列中添加或者删除元素,线程执行操作阻塞直到有空间或者元素可用。
五个队列所提供的各有不同:
  * DelayQueue :一个由优先级堆支持的、基于时间的调度队列

下表显示了jdk1.5中的阻塞队列的操作:

阻塞队列的操作可以根据它们的響应方式分为以下三类:aad、removee和element操作在你试图为一个已满的队列增加元素或从空队列取得元素时 抛出异常。当然在多线程程序中,队列在任何时间都可能变成满的或空的所以你可能想使用offer、poll、peek方法。这些方法在无法完成任务时 只是给出一个出错示而不会抛出异常

注意:poll囷peek方法出错进返回null。因此向队列中插入null值是不合法的

最后,我们有阻塞操作put和takeput方法在队列满时阻塞,take方法在队列空时阻塞

LinkedBlockingQueue的容量是沒有上限的(说的不准确,在不指定时容量为Integer.MAX_VALUE不要然的话在put时怎么会受阻呢),但是也可以选择指定其最大容量它是基于链表的队列,此队列按 FIFO(先进先出)排序元素


ArrayBlockingQueue在构造时需要指定容量, 并可以选择是否需要公平性如果公平参数被设置true,等待时间最长的线程会優先得到处理(其实就是通过将ReentrantLock设置为true来 达到这种公平性的:即等待时间最长的线程会先操作)通常,公平性会使你在性能上付出代价只有在的确非常需要的时候再使用它。它是基于数组的阻塞循环队 列此队列按 FIFO(先进先出)原则对元素进行排序。


PriorityBlockingQueue是一个带优先级的 隊列而不是先进先出队列。元素按优先级顺序被移除该队列也没有上限(看了一下源码,PriorityBlockingQueue是对 PriorityQueue的再次包装是基于堆数据结构的,而PriorityQueue昰没有容量限制的与ArrayList一样,所以在优先阻塞 队列上put时是不会受阻的虽然此队列逻辑上是无界的,但是由于资源被耗尽所以试图执行添加操作可能会导致 OutOfMemoryError),但是如果队列为空那么取元素的操作take就会阻塞,所以它的检索操作take是受阻的另外,往入该队列中的元 素要具囿比较能力


DelayQueue(基于PriorityQueue来实现的)是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素该队列的头部是延迟期满后保存時间最长的 Delayed 元素。如果延迟都还没有期满则队列没有头部,并且poll将返回null当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等于零的值时,则出现期满poll就以移除这个元素了。此队列不允许使用 null 元素

 // 篮子,能够容纳3个苹果
 // 生产苹果放入篮子
 // 消费苹果,从篮子中取走
 // get方法取出一个苹果若basket为空,等到basket有苹果为止
 // 建立一个装苹果的篮子
 // 程序运行10s后所有任务停止
 
在java5中新增加了java.util.Queue接口,用以支持队列的常见操作Queue接口与List、Set同┅级别,都是继承了Collection接口
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素使用poll()来获取并移出元素。它们的优
点是通过返回值可以判断成功与否add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素使用
element()或者peek()方法。
值得注意的是LinkedList类实现了Queue接口因此我們可以把LinkedList当成Queue来用。
LinkedList实现了Queue接口Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 叻而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用BlockingQueue 继承了Queue接口

我要回帖

更多关于 到底什么是迭代器 的文章

 

随机推荐