size는 원소의개수 length는 길이
ArrayList에서 for문을통해 배열의 추가는 문제가없는것처럼 보였지만 remove를통한 배열의 삭제에서는 오류가일어났다
그이유는 반복문이돌때 일반포문일경우((일반포문은 가능함 why??
-내생각에 for문은 전부다끝났을때 적용이되고 항상된for문은 매순간순간 적용돼서 remove로 list가변경되면 문제가생기는것같다 하지만 틀릴확률이 굉장히높고
구글링중에서는
- 무슨 차이일까? 확장 for문 블럭 안에서의 i는 인덱스를 나타내는 것이 아닌 int형 값인 "스캔할 때 주목하고 있는 요소"를 나타내는 것이다.
- 정리하면 확장 for문의 장점은 배열의 요소수의 길이를 알아야 하는 번거로움을 줄여준다. 따라서 배열의 모든 요소를 스캔하는 과정에서 인덱스 자체의 값이 필요하지 않으면 확장 for문을 사용하는 것이 좋다.
이런말이 있긴하다 요소수는 매개체 같다 뭔가 차이가있는건 알겠지만 설명이 불가한상태라 아직 이해도 하지못했다.
출처: https://hyeon424.tistory.com/entry/Java-일반-for문과-확장-for문향상된-for문의-비교 [hyeon424]
출처: https://hyeon424.tistory.com/entry/Java-일반-for문과-확장-for문향상된-for문의-비교 [hyeon424]
출처: https://hyeon424.tistory.com/entry/Java-일반-for문과-확장-for문향상된-for문의-비교 [hyeon424]
)) 아직모르겠지만 향상된 포문일경우 조건자체에 list라는 배열이 들어오기때문에
중간 list의 삭제가일어나면 해당 인덱스가 사라지고 이후의 인덱스들이 전부 한칸씩 당겨질것이다.
이럴경우 인덱스바운드오브? 같은 예외가아니라 수정이 일어나는 이유로인해 반복문에대한 오류자체가 생성된다.
list<> a = new CopyOnWriteArray 를이용해서 만들면 해당 문제를 알아서해결해주는 리스트가 생성된다
단 수정이 빈번해질경우 효율이 많이 떨어진다! 속도가느려진다
인터페이스 list클래스가 CopyOnWriteArray 에 implement되있는것같다 그래서위처럼 생성한듯
공통적으로 많이쓰이는 해결방법이 있긴한데 이해못해서 적지않았고
나같은경우는 해당값이 삭제할값이면 null로 변경하고 포문이 다돌았을때 list.remove(null)로 다 없앴다 좋은방법은 아닌것같지만 어떤경우에는 포문에서 해결하는것보다 좋을것같다.