清空java queue操作的一个注意点

情景:清空queue。
在网上搜索了很久,没发现有方法一次性情况queue的。
于是,我采取了for循环清空

		//创建一个queue
		Queue<String> queue = new LinkedList<String>();
        //添加元素
        queue.offer("a");
        queue.offer("b");
        queue.offer("c");
        queue.offer("d");
        queue.offer("e");
        System.out.println(queue.toString());
        System.out.println(queue.size());
        for(int i=0;i<queue.size();i++){
           queue.poll();//移除元素
        }
        System.out.println(queue.toString());
        System.out.println(queue.size());

输出的结果如下:
在这里插入图片描述
发现问题了,最后两个元素无法剔除。

最后找到原因,是因为poll方法,去除queue的元素后,并删除该元素。
所以,poll之后,queue的size变化了,导致,最后两个元素总是清楚不掉。

于是修改代码如下:

		//创建一个queue
        Queue<String> queue = new LinkedList<String>();
        //添加元素
        queue.offer("a");
        queue.offer("b");
        queue.offer("c");
        queue.offer("d");
        queue.offer("e");
        System.out.println(queue.toString());
        System.out.println(queue.size());
        int size=queue.size();
        for(int i=0;i<size;i++){
           queue.poll();//移除元素
        }
        System.out.println(queue.toString());
        System.out.println(queue.size());

结果如下:
在这里插入图片描述

### Java 中的对象重用 在 Java 编程中,为了提高性能并减少垃圾回收的压力,可以通过多种方式实现对象的重用而非每次都创建新的实例。 #### 使用对象池模式 一种常见的方法是采用对象池技术。通过维护一组预先分配好的对象,在需要时从中获取对象并在再需要时将其返回到池中。这种方式特别适用于频繁创建和销毁代价较高的对象场景下。 ```java public class ObjectPool<T> { private final Queue<T> pool; public ObjectPool(int capacity, Supplier<T> supplier) { this.pool = new ArrayDeque<>(capacity); for (int i = 0; i < capacity; ++i) { T obj = supplier.get(); reset(obj); // Reset state before adding it into the queue. pool.add(obj); } } synchronized public T acquire() { return pool.poll(); // Remove head element from queue. } synchronized public void release(T item) { reset(item); // Ensure proper resetting of internal states. pool.offer(item); // Add back to end of queue. } protected void reset(T item) { /* Implementation-dependent */ } } ``` 对于特定类型的对象比如数据库连接、线程或者其他重量级资源管理类来说,这种方法非常有效[^1]。 #### 利用可变参数替代可变对象 当处理字符串拼接操作时,可以考虑使用 `StringBuilder` 或者 `StringBuffer` 类来代替直接相加多个 String 对象的方式,因为每次执行 "+" 运算符都会生成一个新的 String 实例。 ```java // Inefficient way using string concatenation with + String result = ""; for (int i = 0; i < count; ++i) { result += "part"; // Creates a lot of intermediate strings unnecessarily. } // Efficient approach utilizing StringBuilder's append method StringBuilder sb = new StringBuilder(); for (int i = 0; i < count; ++i) { sb.append("part"); // Reuses existing buffer without allocating more memory each time. } result = sb.toString(); ``` 此外还可以利用一些框架所提供的工具函数来进行优化,例如 MyBatis 的配置加载过程就体现了这一: ```java String resource = "org/mybatis/builder/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(inputStream); // The above code snippet reuses already loaded resources rather than reloading them every single time. ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值