标签分类
技术文章
当前位置:主页 > 计算机编程 > java > Java中List集合的遍历实例

Java中List集合的遍历的知识点总结

  • 发布时间:
  • 作者:码农之家原创
  • 点击:139

Java中List集合的遍历实例

这篇文章主要知识点是关于Java,List集合,遍历,Java中List集合的遍历实例,详解Java多线程处理List数据 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Java函数式编程
Java函数式编程中文扫描版
  • 类型:Java编程大小:205.8 MB格式:PDF出版:电子工业出版社作者:Pierre-Yves
立即下载

 一、对List的遍历有三种方式  

 List<String>  list  =  new  ArrayList<String>();  
  list.add("testone");  
  list.add(“testtwo”);  
  ...  

第一种:

for(Iterator<String>  it  =  list.iterator();  it.hasNext();  )  {  
    ....  
  } 

这种方式在循环执行过程中会进行数据锁定,    性能稍差,    同时,如果你想在寻欢过程中去掉某个元素,只能调用it.remove方法,    不能使用list.remove方法,    否则一定出现并发访问的错误.   

第二种:  

 for(String  data  :  list)  {  
    .....  
  } 

内部调用第一种,    换汤不换药,  因此比Iterator 慢,这种循环方式还有其他限制, 不建议使用它。

第三种:  

 for(int  i=0;  i<list.size();  i++)  {  
    A  a  =  list.get(i);  
    ...  
  }  

内部不锁定,    效率最高,    但是当写多线程时要考虑并发操作的问题。

二、测试实例

package com.inspur.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 *@author WHD
 *2015-3-5
 */
@SuppressWarnings("unused")
public class MapTest {
    private static List<String> list= new ArrayList<String>();
    public static void main(String[]args){
        MapTest  mapTest = new  MapTest();
        mapTest.initList(list);
        mapTest.foreach(list);
        mapTest.forlist(list);
        mapTest.iteratorList(list);
    }
    
    //list 集合中添加10万条数据
    public List initList(List<String> list){
        int i=0;
        int num=6000000;
        for(i=0;i<num;i++){
            list.add("list"+i);
        }
        return list;
    }
    //list 集合遍历 foreach
    
    public void  foreach(List<String> list){
        long start= System.currentTimeMillis();
        for(String data:list){
            String value=data;
        }
        
        long end=System.currentTimeMillis();
        long count=end-start;
        System.out.println("foreach 循环时间"+count);
    }
    // list集合遍历  for
    public void forlist(List<String> list){
        long start=System.currentTimeMillis();
        int i=0;
        for( i=0;i<list.size();i++){
            String value=list.get(i);
        }
        long end=System.currentTimeMillis();
        long count=end-start;
        System.out.println("for list.size() 遍历时间"+count);
    }
    
    // Iterator 遍历循环
    public void iteratorList(List<String> list){
        long start= System.currentTimeMillis();
        for(Iterator<String>  it=list.iterator();it.hasNext();){
            String value=it.next();
        }
        long end=System.currentTimeMillis();
        long count=end-start;
        System.out.println("iterator 遍历时间"+count);
    }

}


三、测试结果:

(1)、第一次

foreach  遍历时间:55
for list.size()遍历时间:47
iterator 遍历时间:51

(2)、第二次

foreach  遍历时间:54
for list.size()遍历时间:44
iterator 遍历时间:50

(3)、第三次

foreach  遍历时间:48
for list.size()遍历时间:43
iterator 遍历时间:44

从测试的结果我们可以明显的看到效率了!

以上所述是小编给大家介绍的Java中List集合遍历详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

详解Java多线程处理List数据

实例1:

解决问题:如何让n个线程顺序遍历含有n个元素的List集合

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;

public class Test_4 {
/**
* 多线程处理list
*
* @param data 数据list
* @param threadNum 线程数
*/
public synchronized void handleList(List<String> data, int threadNum) {
int length = data.size();
int tl = length % threadNum == 0 ? length / threadNum : (length
/ threadNum + 1);

for (int i = 0; i < threadNum; i++) {
int end = (i + 1) * tl;
HandleThread thread = new HandleThread("线程[" + (i + 1) + "] ", data, i * tl, end > length ? length : end);
thread.start();
}
}

class HandleThread extends Thread {
private String threadName;
private List<String> data;
private int start;
private int end;

public HandleThread(String threadName, List<String> data, int start, int end) {
this.threadName = threadName;
this.data = data;
this.start = start;
this.end = end;
}

public void run() {
List<String> subList = data.subList(start, end)/*.add("^&*")*/;
System.out.println(threadName+"处理了"+subList.size()+"条!");
}

}

public static void main(String[] args) {
Test_4 test = new Test_4();
// 准备数据
List<String> data = new ArrayList<String>();
for (int i = 0; i < 6666; i++) {
data.add("item" + i);
}
test.handleList(data, 5);
System.out.println(ArrayUtils.toString(data));
}
}

实例2:

List多线程并发读取读取现有的list对象

//测试读取List的线程类,大概34秒
package com.thread.list;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class Main {
  
  public static void main(String[] args) {
    
    List<String> list = new ArrayList<String>();
    Map<Long,Integer> map = new HashMap<Long,Integer>();

    for(int i = 0;i<1000;i++){
      list.add(""+i);
    }
    
    int pcount = Runtime.getRuntime().availableProcessors();    
    long start = System.currentTimeMillis();    
    
    for(int i=0;i<pcount;i++){
      
      Thread t = new MyThread1(list,map);
      map.put(t.getId(),Integer.valueOf(i));
      t.start();
      try {
        t.join();
      } catch (InterruptedException e) {       
        e.printStackTrace();
      }      
      // System.out.println(list.get(i));
    }    
    System.out.println("----"+(System.currentTimeMillis() - start));
  }  
}

//线程类
package com.thread.list;
 
import java.util.List;
import java.util.Map;
 
public class MyThread1 extends Thread {
 
  private List<String> list;
  private Map<Long,Integer> map;
  
  public MyThread1(List<String> list,Map<Long,Integer> map){
    this.list = list;
    this.map = map;
  }
  
  @Override
  public void run() {
    
    int pcount = Runtime.getRuntime().availableProcessors();
    int i = map.get(Thread.currentThread().getId());
    
    for(;i<list.size();i+=pcount){
      System.out.println(list.get(i));
    }       
  }  
}

实例3:

多线程分段处理List集合

场景:大数据List集合,需要对List集合中的数据同标准库中数据进行对比,生成新增,更新,取消数据
解决方案:

  1. List集合分段,
  2. 动态创建线程池newFixedThreadPool
  3. 将对比操作在多线程中实现
public static void main(String[] args) throws Exception {

    // 开始时间
    long start = System.currentTimeMillis();
    List<String> list = new ArrayList<String>();

    for (int i = 1; i <= 3000; i++) {
      list.add(i + "");
    }
    // 每500条数据开启一条线程
    int threadSize = 500;
    // 总数据条数
    int dataSize = list.size();
    // 线程数
    int threadNum = dataSize / threadSize + 1;
    // 定义标记,过滤threadNum为整数
    boolean special = dataSize % threadSize == 0;

    // 创建一个线程池
    ExecutorService exec = Executors.newFixedThreadPool(threadNum);
    // 定义一个任务集合
    List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();
    Callable<Integer> task = null;
    List<String> cutList = null;

    // 确定每条线程的数据
    for (int i = 0; i < threadNum; i++) {
      if (i == threadNum - 1) {
        if (special) {
          break;
        }
        cutList = list.subList(threadSize * i, dataSize);
      } else {
        cutList = list.subList(threadSize * i, threadSize * (i + 1));
      }
      // System.out.println("第" + (i + 1) + "组:" + cutList.toString());
      final List<String> listStr = cutList;
      task = new Callable<Integer>() {

        @Override
        public Integer call() throws Exception {
          System.out.println(Thread.currentThread().getName() + "线程:" + listStr);
          return 1;
        }
      };
      // 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
      tasks.add(task);
    }

    List<Future<Integer>> results = exec.invokeAll(tasks);

    for (Future<Integer> future : results) {
      System.out.println(future.get());
    }

    // 关闭线程池
    exec.shutdown();
    System.out.println("线程任务执行结束");
    System.err.println("执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");
  }

以上所述是小编给大家介绍的Java多线程处理List数据详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到解决axios.interceptors.respon、 儿童python编程入门书籍推、 vue项目中使用md5加密以及、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:java中ThreadPoolExecutor知识点总结

下一篇:Java IO流之字符缓冲流的实例详解

展开 +

收起 -

学习笔记
网友NO.137573

Java集合系列之ArrayList源码分析

本篇分析ArrayList的源码,在分析之前先跟大家谈一谈数组。数组可能是我们最早接触到的数据结构之一,它是在内存中划分出一块连续的地址空间用来进行元素的存储,由于它直接操作内存,所以数组的性能要比集合类更好一些,这是使用数组的一大优势。但是我们知道数组存在致命的缺陷,就是在初始化时必须指定数组大小,并且在后续操作中不能再更改数组的大小。在实际情况中我们遇到更多的是一开始并不知道要存放多少元素,而是希望容器能够自动的扩展它自身的容量以便能够存放更多的元素。ArrayList就能够很好的满足这样的需求,它能够自动扩展大小以适应存储元素的不断增加。它的底层是基于数组实现的,因此它具有数组的一些特点,例如查找修改快而插入删除慢。本篇我们将深入源码看看它是怎样对数组进行封装的。首先看看它的成员变量和三个主要的构造器。 //默认初始化容量private static final int DEFAULT_CAPACITY = 10;//空对象数组private static final Object[] EMPTY_ELEMENTDATA = {};//对象数组private transient Object[] elementData;//集合元素个数private int size;//传入初始容量的构造方法public ArrayList(int initialCapacity) { super(); if (initialCapacity 0) { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } //新建指定容量的Object类型数组 ……

网友NO.767749

Java针对ArrayList自定义排序的2种实现方法

本文实例讲述了Java针对ArrayList自定义排序的2种实现方法。分享给大家供大家参考,具体如下: Java中实现对list的自定义排序主要通过两种方式 1)让需要进行排序的对象的类实现Comparable接口,重写compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用Collections.sort()来排序对象数组 public class Student implements Comparable{ private int id; private int age; private int height; private String name; public Student(int id, String name, int age, int height) { this.id = id; this.name = name; this.age = age; this.height = height; } public int getId() { return id; } public int getAge() { return age; } public int getHeight() { return height; } public String getName() { return name; } public void setId(int id) { this.id = id; } public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } public void setHeight(int height) { this.height = height; } @Override public int compareTo(Object o) { Student s = (Student) o; if (this.age s.age) { return 1; } else if (this.age s.age) { return -1; } else { if (this.height = s.height) { return 1; } else { return -1; } } }} 测试类: import java.util.*;public class Test { public static void printData(ListStudent list) { for (Student student : list) { System.out.println("学号:" + student.getId() + " 姓名:" + student.getName() + " 年龄" + student.getAge() + " 身高:" + student.getHeight()); } } public stat……

网友NO.186132

Java基于JDK 1.8的LinkedList源码实例

前言 上周末我们一起分析了ArrayList的源码并进行了一些总结,因为最近在看Collection这一块的东西,下面的图也是大致的总结了Collection里面重要的接口和类,如果没有意外的话后面基本上每一个都会和大家一起学习学习,所以今天也就和大家一起来看看LinkedList吧! 2,记得首次接触LinkedList还是在大学Java的时候,当时说起LinkedList的特性和应用场景:LinkedList基于双向链表适用于增删频繁且查询不频繁的场景,线程不安全的且适用于单线程(这点和ArrayList很像)。然后还记得一个很深刻的是可以用LinkedList来实现栈和队列,那让我们一起看一看源码到底是怎么来实现这些特点的 2.1 构造函数 public class LinkedListE extends AbstractSequentialListE implements ListE, DequeE, Cloneable, java.io.Serializable{ transient int size = 0; transient NodeE first; transient NodeE last; public LinkedList() { } public LinkedList(Collection? extends E c) { this(); addAll(c); } public boolean addAll(Collection? extends E c) { return addAll(size, c); } public boolean addAll(int index, Collection? extends E c) { checkPositionIndex(index); Object[] a = c.toArray(); int numNew = a.length; if (numNew == 0) return false; NodeE pred, succ; if (index == size) { succ = null; pred = last; } else { succ = node(index); pred = succ.prev; } for (Object o : a) { @SuppressWarnings(unchecked) E e = (E) o; NodeE newNode = new Node……

网友NO.301736

在Java 8中将List转换为Map对象方法

假设有一个员工对象: bpublic/b bclass/b Employee { fonti// member variables/i/fontfont bprivate/b bint/b empId; bprivate/b String empName; bprivate/b bint/b empAge; bprivate/b String empDesignation;/font 将这个员工对象放入LIst集合,如何转为Map? 首先要明确Map的key是什么? 1. 比如式样员工对象的empId作为key,值是员工姓名: fonti// convert ListEmployee to MapempId, empName using Java 8 Streams/i/fontfont MapInteger, String mapOfEmployees = employees.stream().collect( Collectors.toMap(e - e.getEmpId(),e - e.getEmpName()));/font 2.Map的Key是empId,整个对象为Map的值: fonti// convert ListEmployee to MapempId, empName using Java 8 Streams/i/fontfontMapInteger, Employee mapOfEmployees = employees.stream().collect( Collectors.toMap( e - e.getEmpId(), e - e));/font 3. 如果List中有重复的empId,映射到Map时,Key时不能重复的,如何解决? 默认情况时会抛重复异常,为了克服IllegalStateException重复键异常,我们可以简单地添加一个 BinaryOperator方法到toMap()中,这也称为合并功能,比如如果重复,可以取第一个元素: MapInteger, String mapOfEmployees = employees.stream().collect( Collectors.toMap( e - e.getEmpId(), e - e.getEmpName(), (e1, e2) - e1 )); fonti// Merge Function/i/fontfont/font 4. 将List转换为Map - 使用TreeMap对键进行自然排序,或者指定的Map实现呢? MapInteger, String mapOfEmployees = employees.stream().collect( Colle……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明