精华内容
下载资源
问答
  • 、for//for循环中删除数据 -- 方法有漏洞private static void deleteAtFor() {ArrayList array = new ArrayList<>();array.add(4);array.add(5);array.add(5);array.add(6);for(int i=0;iif(array.get(i)....

    一、for

    //for循环中删除数据 -- 方法有漏洞

    private static void deleteAtFor() {

    ArrayList array = new ArrayList<>();

    array.add(4);

    array.add(5);

    array.add(5);

    array.add(6);

    for(int i=0;i

    if(array.get(i).equals(5)){

    array.remove(i);

    }

    }

    System.out.println(array);

    }

    得到删除后的集合数据是:[4,5,6]

    从结果可以看出,有一个等于5的数据没有呗被删除,

    这是为什么呢?

    当我们深究 for循环在集合中工作原理就可以理解,事实上,当删除一个元素时,后面元素的索引就会前进以为,如删除第一个索引为1的5的时候,此时下一个元素5的索引就变成了1,而此时for循环执行i++,对应索引的位置为2 而新的1索引上的值就不会在读取了,所以集合结果为[4,5,6],要解决这个问题很容易只需要在删除的同时把自增变量i减一,和改变后的索引对应上就好,即把 array.remove(i)改为 array.remove(i--)即可;

    如下:

    //for循环中删除数据 -- 正确方法

    private static void deleteAtFor() {

    ArrayList array = new ArrayList<>();

    array.add(4);

    array.add(5);

    array.add(5);

    array.add(6);

    for(int i=0;i

    if(array.get(i).equals(5)){

    array.remove(i--);

    }

    }

    System.out.println(array);

    }

    结果为[4,6],正确!

    二、forEach

    //foreach中删除数据

    private static void deleteAtForeach() {

    ArrayList array = new ArrayList<>();

    array.add(4);

    array.add(5);

    array.add(5);

    array.add(6);

    for (Integer a:array) {

    if (4==a){

    array.remove(a);

    }

    }

    }

    结果如下:

    601e2cf54139

    图片.png

    意思是迭代器并发修改异常,出现这个原因是 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

    首先java的foreach循环其实就是根据list对象创建一个Iterator迭代对象,用这个迭代对象来遍历list,相当于list对象中元素的遍历托管给了Iterator,你如果要对list进行增删操作,都必须经过Iterator,否则Iterator遍历时会乱,所以直接对list进行删除时,Iterator会抛出ConcurrentModificationException异常

    foreach迭代ArrayList时,真的不能删除元素吗,其实删除倒数第二个元素的,具体什么我们就不在这里说明了,大家可以看下这个https://blog.csdn.net/GarfieldEr007/article/details/80260822

    三、迭代器

    //Iterator迭代器中删除数据

    private static void deleteAtIterator() {

    ArrayList array = new ArrayList<>();

    array.add(4);

    array.add(5);

    array.add(5);

    array.add(6);

    Iteratoriterator = array.iterator();

    while (iterator.hasNext()){

    if (iterator.next().equals(5)){

    iterator.remove();

    }

    }

    System.out.println(array);

    }

    结果是:[4, 6] ;注意点:while里只能出现一次iterator.next(),不然结果会出错。

    四、用流的方式

    ArrayList array = new ArrayList<>();

    array.add(4);

    array.add(5);

    array.add(5);

    array.add(6);

    array.stream().forEach(integer -> {

    if(integer.equals(5)){

    array.remove(integer);

    }

    });

    System.out.println(array);

    结果:

    601e2cf54139

    图片.png

    stream流forEach循环也不能进行删除。具体原因不做深究,哈哈!

    五、结论:

    在只是遍历情况下,我们四种都可以用,在修改集合的情况下,不能用foreach和stream流forEach;

    番外:

    如果只是单纯的遍历的话,

    从效率角度来看:For Each的效率差,stream流forEach和迭代器的效率也没有很好。for循环最优,因为ArrayList通过数组来实现,数组通过索引来定位的时间复杂度是O(1),1次就能定位到,所以效率非常高;

    从代码编写量来看:stream是最简洁的,for循环是量最多的;

    但是,我最想推荐的遍历方式是:stream

    stream().forEach用的多线程方式,其调用线程池的时候必然会耗费更多的时间。但如果你在循环内要处理的事情很多,或者要循环调用远程接口/数据库的时候,无疑极大的提升了效率。

    回顾编程的发展历史,我们不难发现一个规律,那就是先是从最初的C/C++演变到Java/.net,这是编程界的一大进步,因为我们不再关注于指针操作,比如在java中JVM虚拟机已经帮我们完成了相应的操作,由于这一进步,这付出的代价是执行效率会降低,但是带来的好处就在于加快了编程开发的速度。

    当编程由Java/.net演变到JavaScript/PHP/Kotlin,这又是编程界的另一大进步,这意味着我们在编写程序时没有必要再关注于数据类型,而该数据类型是由相应的语言在运行时确定,这样,这又一次降低了程序的运行速度,但是相应的又提升了代码编写的效率,因而通过回顾历史我们不难得出如下结论:

    在编写代码时,一定要以最简洁为原则,毕竟运行程序的硬件成本会随着时间的推移在不断降低,而程序员的薪资则不会。

    展开全文
  • java lambda循环对于每经常需要在Java 8(或更高版本)中使用多维数组的人来说,这只是一个快速技巧。在这种情况下,您可能经常会以类似于以下代码的结尾:float[][] values = ...for (int i = 0; i < values....

    java lambda循环

    对于每个经常需要在Java 8(或更高版本)中使用多维数组的人来说,这只是一个快速技巧。

    在这种情况下,您可能经常会以类似于以下代码的结尾:

    float[][] values = ...

    for (int i = 0; i < values.length; i++) {

    for (int k = 0; k < values[i].length; k++) {

    float value = values[i][k];

    // do something with i, k and value

    }

    }

    如果幸运的话,可以用for-each循环替换循环。 但是,循环内的计算通常需要索引。

    在这种情况下,您可以提出一个简单的实用程序方法,如下所示:

    private void loop(float[][] values, BiConsumer consumer) {

    for (int i = 0; i < values.length; i++) {

    for (int k = 0; k < values[i].length; k++) {

    consumer.accept(i, k);

    }

    }

    }

    现在,我们可以像这样循环遍历数组索引:

    float[][] values = ...

    loop(values, (i, k) -> {

    float value = values[i][k];

    // do something with i, k and value

    });

    这样,您可以使循环代码脱离主要逻辑。

    当然,您应该更改所示的loop()方法,使其适合您的个人需求。

    翻译自: https://www.javacodegeeks.com/2016/04/simplifying-nested-loops-java-8-lambdas.html

    补充知识:JAVA8-lambda表达式-并行流,提升效率的利器?

    写在前面的话

    在前面我们已经看过了一些流的处理,那么Lambda除了在写法上的不同,还有其它什么作用呢?当然有,就是数据并行化处理!

    它在某些场景下可以提高程序的性能。我们先看一个前面的例子,查找所有的男同学

    // 流方式

    List newBoys = personList.stream().filter(p -> 1 == p.getSex()).collect(Collectors.toList());

    现在用并行流改写一下

    // 流方式:找出所有男同学

    List newBoys = personList.parallelStream().filter(p -> 1 == p.getSex()).collect(Collectors.toList());

    细心的同学已经发现区别了,stream与parallelStream,是的,要用并行流parallelStream,就是这么简单!

    什么是并行

    有必要尝试解释一下,什么是数据并行化

    Java支持多线程,可以同时开启多个任务。引入多线程的原因在于,线程可能会阻塞,CPU会主动切分时间片,只有分配到时间片的线程才会运行。而现代的处理器,几乎都是多核的,即多个CPU,如何才能更高效的利用硬件呢,多线程。

    并行和多线程是有区别的,比如运送一堆货物,如果只有一辆车(单线程),肯定慢,平时如果货少,那还能应付过来 ,如果比如某宝的"双十一",那就肯定快递像垃圾一样如山,怎么办呢?我们可以增加车辆(多线程),那么肯定能加快运送速度。但是有一个前提,必须是多条道(多核CPU)。而在有些只有单个出口的地方,还必须排队(并发,线程安全)

    而并行的针对同一个任务的。比如还是一辆车的货,10000件,全部放在A车上,要跑N个小时。现在取出一半放到B车上,理论上A,B2车同时跑,是不是会理快呢?嘿嘿嘿,这就是说的数据并行化,这里不会涉及并发。而这一切,Java8的并行流都在底层帮我们实现了

    一定会更快?

    纸上得来终觉浅,绝知此事要躬行!我们来看下,前面2个代码的分别执行时间

    @Test

    public void test() {

    // 数据并行化处理

    // 学生集合

    Person kobe = new Person("kobe", 40, 1);

    Person jordan = new Person("jordan", 50, 1);

    Person mess = new Person("mess", 20, 2);

    List personList = Arrays.asList(kobe, jordan, mess);

    long beginTime = System.currentTimeMillis();

    // 原来的方式

    List oldBoys = new ArrayList<>(personList.size());

    for (Person p : personList) {

    // 性别男

    if (p.getSex() == 1) {

    oldBoys.add(p);

    }

    }

    long endTime = System.currentTimeMillis();

    log.info("原来的方式 take time:" + (endTime - beginTime));

    beginTime = System.currentTimeMillis();

    // 流方式:找出所有男同学

    List newBoys = personList.stream()

    .filter(p -> 1 == p.getSex())

    .collect(Collectors.toList());

    endTime = System.currentTimeMillis();

    log.info("流方式 take time:" + (endTime - beginTime));

    beginTime = System.currentTimeMillis();

    // 流方式:找出所有男同学

    List parallelBoys = personList.parallelStream()

    .filter(p -> 1 == p.getSex())

    .collect(Collectors.toList());

    endTime = System.currentTimeMillis();

    log.info("并行流方式 take time:" + (endTime - beginTime));

    }

    586d441368f3c98c614aa8b917eae410.png

    咦,是不是很奇怪,原来的for循环方式最快?多执行几次,发现结果也是这样的,那真是这样吗,我们把数据量扩大试试

    05b07a3f1836e447d7b00128ac5cb4eb.png

    还是更慢,换个方法试试

    @Test

    public void test() {

    // 学生集合

    List personList = new ArrayList<>(1000000);

    for (int i = 0, j = 1000000; i < j; i++) {

    int sex = i % 2;

    Person p = new Person(String.valueOf(i), i, sex);

    personList.add(p);

    }

    long beginTime2 = System.currentTimeMillis();

    // 流方式:年龄之和

    int parallelAges = personList.parallelStream().mapToInt(p -> p.getAge()).sum();

    long endTime2 = System.currentTimeMillis();

    log.info("并行流方式 take time:" + (endTime2 - beginTime2));

    log.info("parallelAges:" + parallelAges);

    long beginTime = System.currentTimeMillis();

    // 原来的方式

    int totalAge = 0;

    for (Person p : personList) {

    // 年龄之和

    totalAge = totalAge + p.getAge();

    }

    long endTime = System.currentTimeMillis();

    log.info("原来的方式 take time:" + (endTime - beginTime));

    log.info("totalAge:" + totalAge);

    }

    看看结果,还是更慢。。。这倒很出我意外,崩溃了,

    0fe10aa75af4e6706bdba30866402362.png

    可能跟我机器有关吧。所以还是需要找地方验证,如果哪位同学能解答一下,欢迎指教

    这里引用一下《java8函数式编程》的结论

    f49f8201b7a02d4d86fc11b193275b86.png

    一些条件

    输入数据的大小。

    理论上输入的数据越大,操作越复杂,并行流的效果越好。因为拆分数据处理,最后合并结果都会带来额外的开销。我们可以通过修改前面的例子,personList的大小来观察

    bb0645d168395954bf51f93c77818031.png

    可以看到,数据越大,并行效果越好。当然,真实项目中的处理远比上面复杂,而超过1000w的数据,我本地机器就OOM了尴尬

    数据结构

    我们通常是操作集合。一般来说,越好分割的并行速度越快。比如ArrayList,数组等支持随机读取的,效果较好。

    HashSet,TreeSet,这类不容易公平的分解。而LinkedList,Stream.iterator等分解就比较困难的,效果是比较差的

    装箱

    处理包装类比基本类型花的时间多,肉眼可见

    核的数量

    当然,如果核的数量越多,获得潜在并行提升速度的赶快。比如4核一般比双核快,对吧

    以上这篇java lambda循环_使用Java 8 Lambda简化嵌套循环操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    展开全文
  • 1 /************2019-11-28 ******************/2 /**3 * 数据导出 2019-11-284 */5 publicString exportExcel(String planguid) {6 //System.out.println(guid);7 String kdname = "";8 ...

    1 /************2019-11-28 ******************/

    2 /**

    3 * 数据导出 2019-11-284 */

    5 publicString exportExcel(String planguid) {6 //System.out.println(guid);

    7 String kdname = "";8 String kdguid = "";9 if(flag) {10 kdname =kd.getKaodname();11 kdguid =kd.getRowguid();12 }13 returncreateExcel(kdname, planguid, kdguid);14 }15

    16 publicString createExcel(String preName, String planguid, String kdguid) {17 //第一步,创建一个webbook,对应一个Excel文件

    18 HSSFWorkbook wb = newHSSFWorkbook();19 //第二步,在webbook中添加一个sheet,对应Excel文件中的sheet

    20 HSSFSheet sheet = wb.createSheet("Sheet1");21 sheet.setDefaultColumnWidth(15);//默认列宽

    22 sheet.setColumnWidth(0, 8*256);23 sheet.setColumnWidth(2, 50*256);24 sheet.setColumnWidth(5, 10*256);25 sheet.setColumnWidth(6, 10*256);26 //第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short

    27 HSSFRow row = sheet.createRow(0);28

    29 //单元格样式

    30 HSSFCellStyle cellStyle = wb.createCellStyle(); //单元格样式31 //字体样式

    32 Font fontStyle =wb.createFont();33 fontStyle.setBold(false); //加粗

    34 fontStyle.setFontName("黑体"); //字体

    35 fontStyle.setFontHeightInPoints((short) 11); //大小

    36 fontStyle.setColor(Font.COLOR_NORMAL);//颜色37 //字体样式添加到单元格样式中

    38 cellStyle.setFont(fontStyle);39

    40 //单元格风格

    41 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中

    42 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中43 //单元格边框样式

    44 cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);45 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);46 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);47 cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);48 //单元格背景色49 //cellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());50 //cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

    51 Integer it = 0;52 putUserData(planguid, kdguid, row, cellStyle, sheet, it);53

    54 //获得系统部署路径

    55 String deployPath =ClassPathUtil.getDeployWarPath();56 //目标文件路径

    57 String targetPath = "template/" + preName + "考场信息表_" + EpointDateUtil.convertDate2String(new Date()) + ".xls";58 //输出Excel文件

    59 FileOutputStream output = null;60

    61 try{62 File target = new File(deployPath + "/" +targetPath);63 output = newFileOutputStream(target);64 wb.write(output);65 output.flush();66 }67 catch(Exception e) {68 e.printStackTrace();69 }70 finally{71 try{72 if (output != null) {73 output.close();74 }75 }76 catch(IOException e) {77 e.printStackTrace();78 }79 }80 returntargetPath;81 }82

    83 public voidputUserData(String planguid, String kdguid, HSSFRow row, HSSFCellStyle cellStyle, HSSFSheet sheet,84 Integer it) {85 int i = 0, m = 0, n = 0;86 //查找本次考试计划下所有参与的考点

    87 List listkd =service.findKDListByPlanguid(planguid);88 if(StringUtil.isNotBlank(kdguid)) {89 listkd =service.findKDListByPlanguid(planguid, kdguid);90 }91 int kdi = 0;92 for (i = 0; i < listkd.size(); i++) {93 if (i == 0) {94 row =sheet.createRow(it);95 kdi =it;96 }97 else{98 row = sheet.createRow(it + 1);99 kdi = it + 1;100 }101 //生成单元格

    102 HSSFCell cellkd = row.createCell(0);//0列

    103 HSSFCell cellkd1 = row.createCell(1);//0列

    104 HSSFCell cellkd2 = row.createCell(2);//0列

    105 HSSFCell cellkd3 = row.createCell(3);//0列

    106 HSSFCell cellkd4 = row.createCell(4);//0列

    107 HSSFCell cellkd5 = row.createCell(5);//0列

    108 HSSFCell cellkd6 = row.createCell(6);//0列109 //单元格内容

    110 cellkd.setCellValue(listkd.get(i).getKaodname());111 //设置单元格样式

    112 cellkd.setCellStyle(cellStyle);113 cellkd1.setCellStyle(cellStyle);114 cellkd2.setCellStyle(cellStyle);115 cellkd3.setCellStyle(cellStyle);116 cellkd4.setCellStyle(cellStyle);117 cellkd5.setCellStyle(cellStyle);118 cellkd6.setCellStyle(cellStyle);119

    120 //合并单元格

    121 CellRangeAddress kd = new CellRangeAddress(kdi, kdi, 0, 6); //起始行, 终止行, 起始列, 终止列

    122 sheet.addMergedRegion(kd);123

    124 List listkc =service.findKCListByPlanguid(planguid, listkd.get(i).getKaodguid());125 Integer kci = 0;126 for (m = 0; m < listkc.size(); m++) {127 if (i == 0 && m == 0) {128 kci =it;129 }130 else{131 kci = it + 1;132 }133 row = sheet.createRow(kci + 1);134 //生成单元格

    135 HSSFCell cellkc = row.createCell(0);//行0列

    136 HSSFCell cellkc1 = row.createCell(1);//行0列

    137 HSSFCell cellkc2 = row.createCell(2);//行0列

    138 HSSFCell cellkc3 = row.createCell(3);//行0列

    139 HSSFCell cellkc4 = row.createCell(4);//行0列

    140 HSSFCell cellkc5 = row.createCell(5);//行0列

    141 HSSFCell cellkc6 = row.createCell(6);//行0列

    142 row = sheet.createRow(kci + 2);143 HSSFCell celltime = row.createCell(0);//行0列

    144 HSSFCell celltime1 = row.createCell(1);//行0列

    145 HSSFCell celltime2 = row.createCell(2);//行0列

    146 HSSFCell celltime3 = row.createCell(3);//行0列

    147 HSSFCell celltime4 = row.createCell(4);//行0列

    148 HSSFCell celltime5 = row.createCell(5);//行0列

    149 HSSFCell celltime6 = row.createCell(6);//行0列150 //单元格内容

    151 cellkc.setCellValue("第" + listkc.get(m).getKaocnum() + "考场考试信息表");152 String ny = EpointDateUtil.convertDate2String(listkc.get(m).getKaosstart(), "MM月dd日");153 String h = EpointDateUtil.convertDate2String(listkc.get(m).getKaosstart(), "HH");154 Integer ht =Integer.parseInt(h);155 String t = "下午";156 if (ht <= 12) {157 t = "上午";158 }159 String t1 = EpointDateUtil.convertDate2String(listkc.get(m).getKaosstart(), "HH:mm");160 String t2 = EpointDateUtil.convertDate2String(listkc.get(m).getKaosend(), "HH:mm");161 celltime.setCellValue(ny + t + t1 + "~" +t2);162 //设置单元格样式

    163 cellkc.setCellStyle(cellStyle);164 cellkc1.setCellStyle(cellStyle);165 cellkc2.setCellStyle(cellStyle);166 cellkc3.setCellStyle(cellStyle);167 cellkc4.setCellStyle(cellStyle);168 cellkc5.setCellStyle(cellStyle);169 cellkc6.setCellStyle(cellStyle);170 celltime.setCellStyle(cellStyle);171 celltime1.setCellStyle(cellStyle);172 celltime2.setCellStyle(cellStyle);173 celltime3.setCellStyle(cellStyle);174 celltime4.setCellStyle(cellStyle);175 celltime5.setCellStyle(cellStyle);176 celltime6.setCellStyle(cellStyle);177 //合并单元格

    178 CellRangeAddress kc = new CellRangeAddress((kci + 1), (kci + 1), 0, 6); //起始行, 终止行, 起始列, 终止列

    179 CellRangeAddress time = new CellRangeAddress((kci + 2), (kci + 2), 0, 6); //起始行, 终止行, 起始列, 终止列

    180 sheet.addMergedRegion(kc);181 sheet.addMergedRegion(time);182

    183 row = sheet.createRow(kci + 3);184 //生成单元格

    185 HSSFCell tcell0 = row.createCell(0);//0列

    186 HSSFCell tcell1 = row.createCell(1);//1列

    187 HSSFCell tcell2 = row.createCell(2);//2列

    188 HSSFCell tcell3 = row.createCell(3);//3列

    189 HSSFCell tcell4 = row.createCell(4);//4列

    190 HSSFCell tcell5 = row.createCell(5);//5列

    191 HSSFCell tcell6 = row.createCell(6);//6列192 //单元格内容

    193 tcell0.setCellValue("序号");194 tcell1.setCellValue("专业");195 tcell2.setCellValue("科目");196 tcell3.setCellValue("姓名");197 tcell4.setCellValue("准考证号");198 tcell5.setCellValue("考场编号");199 tcell6.setCellValue("座位号");200 //设置单元格样式

    201 tcell0.setCellStyle(cellStyle);202 tcell1.setCellStyle(cellStyle);203 tcell2.setCellStyle(cellStyle);204 tcell3.setCellStyle(cellStyle);205 tcell4.setCellStyle(cellStyle);206 tcell5.setCellStyle(cellStyle);207 tcell6.setCellStyle(cellStyle);208

    209 List listbmd =bmdservice.findKD_KCUserlist(planguid, listkc.get(m).getCourseguid(),210 listkd.get(i).getKaodguid(), listkc.get(m).getKaocnum().toString());211 it = (kci + 4);212 for (n = 0; n < listbmd.size(); n++) {213 row =sheet.createRow(it);214 it = it + 1;215 //生成单元格

    216 HSSFCell cell0 = row.createCell(0);//0列

    217 HSSFCell cell1 = row.createCell(1);//1列

    218 HSSFCell cell2 = row.createCell(2);//2列

    219 HSSFCell cell3 = row.createCell(3);//3列

    220 HSSFCell cell4 = row.createCell(4);//4列

    221 HSSFCell cell5 = row.createCell(5);//5列

    222 HSSFCell cell6 = row.createCell(6);//6列223 //单元格内容

    224 cell0.setCellValue(n + 1);225 cell1.setCellValue(listbmd.get(n).getStr("gangwname"));226 cell2.setCellValue(listbmd.get(n).getStr("coursename"));227 cell3.setCellValue(listbmd.get(n).getStr("name"));228 cell4.setCellValue(listbmd.get(n).getStr("zhunkznum"));229 cell5.setCellValue(listbmd.get(n).getStr("kaocnum"));230 cell6.setCellValue(listbmd.get(n).getStr("zuownum"));231 //设置单元格样式

    232 cell0.setCellStyle(cellStyle);233 cell1.setCellStyle(cellStyle);234 cell2.setCellStyle(cellStyle);235 cell3.setCellStyle(cellStyle);236 cell4.setCellStyle(cellStyle);237 cell5.setCellStyle(cellStyle);238 cell6.setCellStyle(cellStyle);239 }240 }241 }242 }

    展开全文
  •   最近在写一个购物车时,需要通过增强for循环将我获得的商品product,赋值到购物cart中,然后将购物车cart放到购物车cartList中,可奇怪的是结果发现list中的每条数据均为最后条插入的数据,Debug下我发现了,...

    1、发生情景

      最近在写一个购物车时,需要通过增强for循环将我获得的商品product,赋值到购物cart中,然后将购物车cart放到购物车cartList中,可奇怪的是结果发现list中的每条数据均为最后一条插入的数据,Debug下我发现了,我的每条数据在插入的时候该数据插入都是正常的,但是已经插入的数据都会被替换成刚刚插入的数据,bug代码如下:

    		/*
    		 * List<Map<String, Object>>:取出来的是所有的Cart 和 Product 的键值对
    		 * 将List<Map<String, Object>>中的每一个cart和product的map键值对取出来
    		 * 分别赋值给product和cart对应的属性中,然后将product赋值给cart的product
    		 * */
    		Product product = new Product();
    		Cart cart = new Cart();
    		for (Map<String, Object> cartMap : cartMaps) {
    		    BeanUtils.populate(product, cartMap);
    		    BeanUtils.populate(cart, cartMap);
    		    cart.setProduct(product);
    		    cartList.add(cart);
    		}
    

    2、原因

      查阅资料发现,这是因为list在add添加元素时访问的是该对象的引用地址,list中存储的全是实例化后的对象的地址,而java中对象存储的也是地址,当同一个对象的值发生改变时,该地址的值会发生改变,这就导致了list中添加的元素都是同一个地址,当改地址存储的值发生改变,list中所有元素值都会改变,都为最后一次改变的值。

    3、解决方案

      既然知道了原因,那么就很容易解决了,我们可以将要存储的对象先在循环的外部先声明为null,不进行实例化,在循环的内部进行实例化,这样实例化的对象就变成一个个地址不相同的对象,也就不会产生值覆盖的现象,或者干脆直接在循环内部进行声明和实例化,解决后的代码如下:

    		for (Map<String, Object> cartMap : cartMaps) {
                Product product = new Product();
                Cart cart = new Cart();
                BeanUtils.populate(product, cartMap);
                BeanUtils.populate(cart, cartMap);
                cart.setProduct(product);
                cartList.add(cart);
            }
    

      这个BUG还真是第一次遇到,此前并没有在意,以上均为个人思想,严谨不足,废话有余,如果有什么说的不正确的地方还请各位大神不吝赐教,谢谢。

    展开全文
  • 我有四foreach循环,它们遍历集合,并根据条件执行一些操作。这是我现在写的代码:boolean breakFlag = false;String valueFromObj2 = null;String valueFromObj4 = null;for(Object1 object1: objects){for...
  • 本文非常适合初学Java的程序员,主要是来了解一下Java中的几种for循环用法,分析得十分详细,起来看看。J2SE 1.5提供了另种形式的for循环。借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等...
  • 这是我的java中的函数类,我想从这函数中查看数据class appointment extends AsyncTask{private String val3;public appointment(String medicalno) {this.val3 = medicalno;}@Overrideprotected String ...
  • Java循环结构及数组

    2021-02-12 09:11:57
    循环结构for循环for(条件初始化;条件判断;条件变化){重复执行的代码;}for循环的执行流程:1.条件初始化2.条件判断3.不满足条件结束循环,满足条件执行,执行循环体语句4.条件变化从第二次循环开始,条件初始化就不执行...
  • 今天看到这问题,我想的头都...就会得到数据序列[2,3,8,4,6]链表结构中的每节点是一个对象,每对象有两属性,一个属性是引用类型,用来引用下一个元素,另外一个属性是int类型,用来保存被存储的数据。h...
  • “ for each”循环的工作原理如下:1.It gets the iterator.2.Checks for hasNext().public boolean hasNext(){return cursor != size(); // cursor is zero initially.}3.如果为true,则使用n...
  • 随机读取的情况下,数组结构优于链表结构;从头遍历的情况下,普通for循环只适用于数组结构,而迭代器根据实现不同,数组结构和链表结构都选取了效率高的方式遍历,增强型for循环类比迭代器。
  • 我正在开发一个Spring Boot / Spring Batch项目,我需要配置两个数据源.一个是用于跟踪事务的内存中hsqldb数据库.另一个是常规MySQL数据库,将由我的ItemWriters更新.问题是,一旦我尝试配置第二个数据源,Spring就会...
  • JAVA 数据结构链表操作循环链表发布于 2020-5-28|复制链接摘记: JAVA 链表操作:循环链表主要分析示例:、单链表循环链表二、双链表循环链表、单链表循环链表```javapackage LinkListTest;import j ..JAVA 链表...
  • } } 没法加图片了,运行结果是 1234-------- 5670-------- 因为数组定义长度为4,所以第32313133353236313431303231363533e59b9ee7ad9431333335333163二数组最后一个不够默认补0,实现了4个一组存在一个集合里,...
  • 思考方案 : 单纯的我们这里不涉及其他任何操作,我们只是想生成一个10W条记录而已,中间无其他步骤,得到的效果如下图所示,而我们又不会mysql脚本啊之类的,那我们不如用java来实现,用jdbc的批次操作来完成 ,...
  • 我想创建一个数据框,其中df1值的平均值和df2值的平均值作为新数据框中的列 . 我可以得到要打印的值for (i in samples) {print(c(with(df1, mean(d18_VSMOW[Sample == i]))))}但我无法将结果导入数据框4df4=Sample ...
  • java 中,循环删除list中的多元素实现2016-08-16import java.util.ArrayList;.../*** 删除一个list中的其中几元素的操作**/public class RemoveTest {/***得到要用来进行演示的数据* @return*/public static L...
  • Java循环控制

    2021-02-27 10:34:35
    循环语句用于多次执行一个语句或组语句,以下是大多数编程语言中循环语句的一般形式 -Java编程语言提供以下类型的循环来处理循环要求,可通过单击以下每链接来学习。编号循环描述1在给定条件为真时重复语句或...
  • HappyDay1234567890很...方法有如下有两种:、先说一个最笨的方法。挨个把元素取出来,然后再挨个放到新的数组里面,代码如下:Content a= list.get(0);//获取第数据Content b= list.get(1);//获取第二行数据...
  • 我已经研究了C#已经有段时间了,但我自己并没有真正做过很多练习,我现在刚开始使用java,因为我想做Android应用程序和测试我新获得的知识我想做一个基本的控制台计算器,这是我到目前为止所得到的:package ...
  • 比如定义一个数组int a[]={1, 2, 3, 4},下面我们罗列一下遍历这数组的方法1 for(;;)这也是最常用的方法,不多做解释。代码如下int a[] = {1, 2, 3, 4};for(int i=0; iSystem.out.println(a[i]);}2 for(:)先代码...
  • Java无限循环/调用

    2021-02-12 17:00:35
    今天早上我碰到了这问题(我已经找到了解决方法),但是我很好奇为什么我的代码没有按我想要的那样工作public class classA//(1)public void function(GL10 gl){function(gl,useGLUtilsBool, useMipMapBool);...
  • package game;public class Paizus {public int ID;public String name;public Paizus(int ID, String name) {this.ID=ID;this.name=name;...import java.util.ArrayList;import java.util.HashMap;impo...
  • I have a foreach loop and I want to see if there is a next element in the loop so I can compare the current element with the next. How can I do this? I've read about the current and next functions but...
  • :出现问题的代码//生成手机号码数int phonedata=${__Random(1,500,)};StringBuffer phonedatalist = new StringBuffer();for (int i=0;i////生成手机号码后8位phonedata1=${__time(/1000000,)};String phone...
  • 、概述:1、原理:与普通队列的区别在于循环队列添加数据时,如果其有效数据end == maxSize - 1(最大空间)的话,end指针又移动到-1的位置删除数据时,如果head== maxSize时 head指针移动到0的位置2、示例图:二、...
  • 执行原则if if if 结构 会一直去执行()里的判断语句if else if else if 结构 只要条()的结果是true,不会执行接下来的判断一个 if 跟 一个else 一个if 可跟多else if 如果if 或者 else if 里的条件都不满足,便...
  • 1、奇偶数题目内容:你的程序要读入系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。输入格式:系列正整数,整数的范围是(0,100000)。如果输入-1则表示...
  • 一个集合的值为:{name=张三丰1, id=1}{name=张三丰2, id=2}{name=张三丰3, id=3}{name=张三丰4, id=4}{name=张三丰5, id=5}{name=张三丰6, id=6}{name=张三丰7, id=7}{name=张三丰8, id=8}第二集合的值为:{...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 374,931
精华内容 149,972
关键字:

java怎么获得上一个循环的数据

java 订阅