关于ArrayList和Iterator的一点误用的理解

本文探讨了使用ArrayList迭代器时出现死循环的原因,并提供了解决方案。文章指出,在循环中直接调用iterator()会导致每次循环都创建新的迭代器,从而无法正确遍历集合。

具体代码

ArrayList list=new ArrayList();
list.add("abc");
list.add("abcd");
list.add("123");
list.add("1234");

while(list.iterator().hasNext())
{
  System.out.println(list.iterator().next();
}
这段代码会陷入一个死循环永远输出"abc".......,为什么?
我是这样一来猜测的,iterator()方法会返回一个Iterator对象,但是在ArrayList中并不会保存这个Iterator对象;所以
该iterator()方法执行完以后再来执行该方法ArrayList会产生一个新的Iterator对象;新对象跟前一对象没有任何关系,只是内容一致
有了猜测就需要去验证,去ARRAYLIST的父类AbstractList一看,果然如此
public Iterator<E> iterator() {
    return new Itr();
    }
对上面的情形我们就需要修改成如下形式

Iterator iterator=list.iterator();

while(iterator.hasNext())
{
  System.out.println(iterator.next();
}
这样通过一个变量指向ARRAYLIST创建的Iterator对象,然后在循环过程中对该Iterator对象进行操作从而达到我们的设计需要;

public class VisiblePackageNameManager { private static final String TAG = "VisiblePackageNameManager"; private static final String SYSTEM_EXECUTOR_NAME = "executor"; private static AtomicBoolean isConnectedRefreshed = new AtomicBoolean(false); private static String[] packageWhitelistForSystemVisible; private ConcurrentHashMap<String, List<VisiblePackageOrder>> executorNamePkgOrderMap; private VisiblePackageNameManager() { this.executorNamePkgOrderMap = new ConcurrentHashMap(); } public static VisiblePackageNameManager getInstance() { return VisiblePackageNameManager.SingleTon.INSTANCE; } public void setWhiteList(String[] activityWhitelist, String[] packageWhitelist) { packageWhitelistForSystemVisible = packageWhitelist; } public void setConnectedRefreshed(boolean isConnectedRefresh) { isConnectedRefreshed.set(isConnectedRefresh); } public boolean isConnectedRefresh() { return isConnectedRefreshed.get(); } public void refreshAccessibilityPackageNameList() { this.resetList(); int orderId = 1; String packageName; for(Iterator var2 = AccessibilityVisibleManager.getInstance().getAccessibilityWindowsInfo().iterator(); var2.hasNext(); this.addSystemVisibleExecutor(packageName, orderId++)) { AccessibilityVisibleWindowInfo info = (AccessibilityVisibleWindowInfo)var2.next(); packageName = info.getPackageName(); VisibleExecutor visibleExecutor = VisibleExecutorManager.getInstance().getSupportExecutor(packageName); String name = visibleExecutor.getName(); KitLog.debug("VisiblePackageNameManager", "name is " + name + "; packageName is " + packageName, new Object[0]); List<VisiblePackageOrder> packageOrders = (List)this.executorNamePkgOrderMap.get(name); if (packageOrders == null) { packageOrders = new ArrayList(); } if (!this.isContains((List)packageOrders, packageName)) { VisiblePackageOrder packageOrder = new VisiblePackageOrder(orderId++, packageName); ((List)packageOrders).add(packageOrder); this.executorNamePkgOrderMap.put(name, packageOrders); } } KitLog.debug("VisiblePackageNameManager", "executorNamePkgOrderMap:" + GsonUtils.toJson(this.executorNamePkgOrderMap), new Object[0]); } private boolean isContains(List<VisiblePackageOrder> packageOrders, String packageName) { Iterator var3 = packageOrders.iterator(); VisiblePackageOrder packageOrder; do { if (!var3.hasNext()) { return false; } packageOrder = (VisiblePackageOrder)var3.next(); } while(!TextUtils.equals(packageOrder.getPackageName(), packageName)); return true; } private void addSystemVisibleExecutor(String packageName, int orderId) { if (isInPackageWhiteList(packageName)) { List<VisiblePackageOrder> packageOrders = (List)this.executorNamePkgOrderMap.get("executor"); VisiblePackageOrder packageOrder; if (packageOrders == null) { List<VisiblePackageOrder> packageOrders = new ArrayList(); packageOrder = new VisiblePackageOrder(orderId, packageName); packageOrders.add(packageOrder); this.executorNamePkgOrderMap.put("executor", packageOrders); } else if (!this.isContains(packageOrders, packageName)) { int var3 = orderId + 1; packageOrder = new VisiblePackageOrder(orderId, packageName); packageOrders.add(packageOrder); this.executorNamePkgOrderMap.put("executor", packageOrders); } } } private static boolean isInPackageWhiteList(String packageName) { return packageWhitelistForSystemVisible != null ? Arrays.asList(packageWhitelistForSystemVisible).contains(packageName) : false; } public void resetList() { this.executorNamePkgOrderMap.clear(); } public ArrayList<String> getVisiblePackageNameListByName(String name) { ArrayList<String> packages = new ArrayList(); List<VisiblePackageOrder> packageOrderLists = (List)this.executorNamePkgOrderMap.get(name); if (packageOrderLists == null) { return packages; } else { Iterator var4 = packageOrderLists.iterator(); while(var4.hasNext()) { VisiblePackageOrder packageOrder = (VisiblePackageOrder)var4.next(); if (packageOrder != null) { packages.add(packageOrder.getPackageName()); } } return packages; } } public List<VisiblePackageOrder> getVisiblePackageOrderByName(String name) { return (List)this.executorNamePkgOrderMap.get(name); } public ConcurrentHashMap<String, List<VisiblePackageOrder>> getExecutorNamePkgOrderMap() { return this.executorNamePkgOrderMap; } private static class SingleTon { public static final VisiblePackageNameManager INSTANCE = new VisiblePackageNameManager(); private SingleTon() { } } } 结合 VisibleManager 类 AccessibilityVisibleService分析,有什么风险
最新发布
08-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值