List和Iterator的区别

List和Iterator的区别

让我们先运行一下代码

实例:public void fillAll(){

       Session session=HibernateUtil.getSession();

       Query query=session.createQuery("from Customers");

       List<Customers> list=query.list();

       for(Customers l:list){

           System.out.println(l.getEmail());

       }

      

执行结果:Hibernate: selectcustomers0_.id as id0_, customers0_.realName as realName0_, customers0_.pass aspass0_, customers0_.sex as sex0_, customers0_.petName as petName0_,customers0_.email as email0_, customers0_.rdate as rdate0_ from Customers customers0_

null

asd

null

      

    }

    @Test

    public void fillA(){

       Session session=HibernateUtil.getSession();

       Query query=session.createQuery("from Customers");

       Iterator<Customers> it=query.iterate();

       while(it.hasNext()){

           Customers c=(Customers) it.next();

           System.out.println(c.getEmail());

          

       }

      

    }

执行结果:Hibernate: select customers0_.id as col_0_0_ from Customers customers0_

Hibernate: selectcustomers0_.id as id0_0_, customers0_.realName as realName0_0_,customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petNameas petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from Customers customers0_ where customers0_.id=?

null

Hibernate: selectcustomers0_.id as id0_0_, customers0_.realName as realName0_0_,customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petNameas petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from Customers customers0_ where customers0_.id=?

asd

Hibernate: selectcustomers0_.id as id0_0_, customers0_.realName as realName0_0_,customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petNameas petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from Customers customers0_ where customers0_.id=?

Null

很明显的看出:Iterator输入的sql语句多:N+1条语句

 

总结:

Query的两个方法,list()和 iterate() , 两个方法都是把结果集列出来, 他们有3点不一样,

1:返回的类型不一样,list()返回List,iterate()返回Iterator,

2: 获取数据的方式不一样,list()会直接查数据库,iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。

 

3:iterate会查询2级缓存, list只会查询一级缓存。

4: list()中返回的List中每个对象都是原本的对象,iterate()中返回的对象是代理对象.(debug可以发现)

 

 

 

list()方法在执行时,直接运行查询结果所需要的查询语句。

iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。

因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).

结果集的处理方法不同:

list()方法会一次取出所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。

iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。

 

 

### 关于 `list_iterator` 的概念用法 在 Python 中,列表(`list`)是一种可迭代对象(Iterable),这意味着可以通过内置函数 `iter()` 创建一个与之关联的迭代器(Iterator)。对于列表来说,这种迭代器被称为 `list_iterator` 对象。 #### 如何创建 `list_iterator` 通过调用 `iter()` 函数并传入一个列表作为参数,可以生成一个 `list_iterator` 对象。此对象实现了迭代协议,允许逐个访问列表中的元素[^1]。 ```python my_list = [1, 2, 3, 4] iterator = iter(my_list) print(type(iterator)) # 输出:<class 'list_iterator'> ``` #### 使用 `next()` 方法遍历 `list_iterator` 一旦有了 `list_iterator` 对象,就可以使用内置函数 `next()` 来逐一获取下一个元素。当没有更多元素可供提取时,会抛出 `StopIteration` 异常。 ```python try: while True: element = next(iterator) print(element) except StopIteration: pass ``` 上述代码展示了如何手动控制迭代过程,并处理结束条件下的异常情况。 #### 列表推导式与 `list_iterator` 尽管可以直接操作 `list_iterator`,但在实际开发中更常见的是利用循环结构自动完成这一工作。例如,在 `for` 循环内部隐含地使用了迭代器机制来简化语法[^2]: ```python for item in my_list: print(item) ``` 这里实际上等价于先构建了一个 `list_iterator` 并反复调用了它的 `__next__()` 方法直到耗尽所有项目为止。 #### 高级应用:结合事件循环理解异步编程 如果深入探讨,则需提及到像协程这样的高级主题以及支持它们的基础架构——即事件循环(Event Loop)[^4]。虽然这超出了单纯讨论 `list_iterator` 范畴之外的内容,但是值得注意的是即使是简单的同步迭代模式也能够被映射至更加复杂的非阻塞场景下加以运用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值