java集合示例 小心過載的陷阱
阿新 • • 發佈:2018-12-22
package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.*; @SpringBootApplication public class RiskpriceApplication { public static void main(String[] args) { Set<Integer> set=new TreeSet<>(); List<Integer> list=new ArrayList<Integer>(); for(int i=-3;i<3;i++){ set.add(i); list.add(i); } System.out.println("remove 前:");//[-3, -2, -1, 0, 1, 2] System.out.println(set+" "+list);for(int i=0;i<3;i++){ set.remove(i);//boolean remove(Object o); list.remove(i);//E remove(int index) } System.out.println("remove 後:"); System.out.println(set+" "+list); //最終結果 set如預期因為呼叫的boolean remove(0bject 0)這個過載 移除了正數 剩下 -3,-2,-1 //最終結果 list不如預期產生了混論 剩下 -2,0,2 原因見#list解釋#//#list解釋# list呼叫的是E remove(int index)這個過載 剛開始list有 :-3,-2,-1,0,1,2這些元素 //這裡我們標出了編號,每次remove後編號都會重新計算(很重要哦,這句話) -3(0),-2(1),-1(2),0(3),1(4),2(5) //list remove(0) 移除編號為0的元素後剩下 -2(0),-1(1),0(2),1(3),2(4) //list.remove(1) 移除編號為1的元素後剩下 -2(0),0(1),1(2),2(3) //list.remove(2) 移除編號為2的元素後剩下 -2(0),0(1),2(3) //#list解釋# //如上我們分析出了list不如預期的原因,那麼如何解決呢,讓list.remove的時候呼叫boolean remove(Object o)這個過載呢,簡單改為list.remove((Integer) i)就好了 } }