현재 버전

java arraylist

java arrayList의 clear와 new 로 할당했을 때 차이점


안녕하세요, 작업하다가 clear를 사용했었는데 값이 안나오던 친구가 new로 재할당 해주니까 제대로 나와서

차이점이 뭔지 알아보려고했는데, 도저히 모르겠어서 질문드립니다.

먼저 코드는 간단하게 다음과 같습니다.

@Override
public List < CloudShoppingHisVO > selectViewGoodsList(ParamMap viewGoodsMap) throws Exception {
    List < CloudShoppingHisVO > ShoppingHisList = mypageDAO.selectViewGoodsList(viewGoodsMap);
    //리스트 select해주는 쿼리 (retrun 되는 친구임)
    ParamMap param = new ParamMap();
    ParamMap imageMap = new ParamMap();
    List < VodImageVO > titleImageList = new ArrayList < VodImageVO > ();
    List < VodImageVO > posterImageList = new ArrayList < VodImageVO > ();

    //resturn 될 리스트의 속성인 titleImageList객체 생성

    for (CloudShoppingHisVO shoppingHisVO: ShoppingHisList) {
        ... (코드생략)

        List < VodImageVO > imageList = displayDAO.selectVodImageList(param);

        titleImageList.clear();
        posterImageList.clear();

        //넣기 전 클리어 해주기, (for문 돌면서 이전에 있던 값 없애고 넣어주기위함)

        for (VodImageVO image: imageList) {
            String type = image.getType();

            if ("10".equals(type)) {
                titleImageList.add(image);
            } else if ("20".equals(type)) {
                posterImageList.add(image);
            }

        }
        //위에서 add 해준 titleImageList를 foreach문 도는 VO에 세팅해준다.
        shoppingHisVO.setTitleImageList(titleImageList);
        shoppingHisVO.setPosterImageList(posterImageList);

    }

    return ShoppingHisList;
}

일단 clear를 사용한코드는 이렇구요. 디버깅 해보면 값이 잘 들어가는것도 확인이 됩니다.

그런데 마지막 return에 BP를 걸고 보면..


이렇게 비어있습니다... 그래서, clear 함수 대신 new로 재생성 해주니까 잘 되더라구요..?

근데 왜 이렇게 되는건지 모르겠습니다.

shoppingHisVO 라는 객체에 직접 할당해주고, VO에 titleImageList객체가 다 들어갔는데?

foreach문을 도는 shoppinHisList를 확인해보면 해당 내용이 사라져있고..

근데 그게 clear대신 new를 쓰면 또 정상적으로 들어간다..

new를 쓰면 clear보다 성능상으로 안좋지않나요? 그래서 clear를 쓴건데..

왜이러는걸까요 ㅠㅠ 너무궁금합니다


수정 이력

2021-05-28 10:35:29 에 아래 내용에서 변경 됨 #2

안녕하세요, 작업하다가 clear를 사용했었는데 값이 안나오던 친구가 new로 재할당 해주니까 제대로 나와서

차이점이 뭔지 알아보려고했는데, 도저히 모르겠어서 질문드립니다.

먼저 코드는 간단하게 다음과 같습니다.

@Override
public List < CloudShoppingHisVO > selectViewGoodsList(ParamMap viewGoodsMap) throws Exception {
    List < CloudShoppingHisVO > ShoppingHisList = mypageDAO.selectViewGoodsList(viewGoodsMap);
    //리스트 select해주는 쿼리 (retrun 되는 친구임)
    ParamMap param = new ParamMap();
    ParamMap imageMap = new ParamMap();
    List < VodImageVO > titleImageList = new ArrayList < VodImageVO > ();
    List < VodImageVO > posterImageList = new ArrayList < VodImageVO > ();

    //resturn 될 리스트의 속성인 titleImageList객체 생성

    for (CloudShoppingHisVO shoppingHisVO: ShoppingHisList) {
        ... (코드생략)

        List < VodImageVO > imageList = displayDAO.selectVodImageList(param);

        titleImageList.clear();
        posterImageList.clear();

        //넣기 전 클리어 해주기, (for문 돌면서 이전에 있던 값 없애고 넣어주기위함)

        for (VodImageVO image: imageList) {
            String type = image.getType();

            if ("10".equals(type)) {
                titleImageList.add(image);
            } else if ("20".equals(type)) {
                posterImageList.add(image);
            }

        }
        //위에서 add 해준 titleImageList를 foreach문 도는 VO에 세팅해준다.
        shoppingHisVO.setTitleImageList(titleImageList);
        shoppingHisVO.setPosterImageList(posterImageList);

    }

    return ShoppingHisList;
}

일단 clear를 사용한코드는 이렇구요. 디버깅 해보면 값이 잘 들어가는것도 확인이 됩니다.

그런데 마지막 return에 BP를 걸고 보면..


이렇게 비어있습니다... 그래서, clear 함수 대신 new로 재생성 해주니까 잘 되더라구요..?

근데 왜 이렇게 되는건지 모르겠습니다.

shoppingHisVO 라는 객체에 직접 할당해주고, VO에 titleImageList객체가 다 들어갔는데?

ShoppingHisList foreach 문을 돌 때는 사라진다..?

근데 그게 clear대신 new를 쓰면 또 정상적으로 들어간다..

new를 쓰면 clear보다 성능상으로 안좋지않나요? 그래서 clear를 쓴건데..

왜이러는걸까요 ㅠㅠ 너무궁금합니다

2021-05-28 10:34:47 에 아래 내용에서 변경 됨 #1

안녕하세요, 작업하다가 clear를 사용했었는데 값이 안나오던 친구가 new로 재할당 해주니까 제대로 나와서

차이점이 뭔지 알아보려고했는데, 도저히 모르겠어서 질문드립니다.

먼저 코드는 간단하게 다음과 같습니다.

@Override
public List < CloudShoppingHisVO > selectViewGoodsList(ParamMap viewGoodsMap) throws Exception {
    List < CloudShoppingHisVO > ShoppingHisList = mypageDAO.selectViewGoodsList(viewGoodsMap);
    //리스트 select해주는 쿼리 (retrun 되는 친구임)
    ParamMap param = new ParamMap();
    ParamMap imageMap = new ParamMap();
    List < VodImageVO > titleImageList = new ArrayList < VodImageVO > ();
    List < VodImageVO > posterImageList = new ArrayList < VodImageVO > ();

    //resturn 될 리스트의 속성인 titleImageList객체 생성

    for (CloudShoppingHisVO shoppingHisVO: ShoppingHisList) {
        ... (코드생략)

        List < VodImageVO > imageList = displayDAO.selectVodImageList(param);

        titleImageList.clear();
        posterImageList.clear();

        //넣기 전 클리어 해주기, (for문 돌면서 이전에 있던 값 없애고 넣어주기위함)

        for (VodImageVO image: imageList) {
            String type = image.getType();

            if ("10".equals(type)) {
                titleImageList.add(image);
            } else if ("20".equals(type)) {
                posterImageList.add(image);
            }

        }
        //위에서 add 해준 titleImageList를 foreach문 도는 VO에 세팅해준다.
        shoppingHisVO.setTitleImageList(titleImageList);
        shoppingHisVO.setPosterImageList(posterImageList);

    }

    return ShoppingHisList;
}

일단 clear를 사용한코드는 이렇구요. 디버깅 해보면 값이 잘 들어가는것도 확인이 됩니다.

그런데 마지막 return에 BP를 걸고 보면..


이렇게 비어있습니다... 그래서, clear 함수 대신 new로 재생성 해주니까 잘 되더라구요..?

근데 왜 이렇게 되는건지 모르겠습니다.

shoppingHisVO 라는 객체에 직접 할당해주고, VO에 titleImageList객체가 다 들어갔는데?

ShoppingHisList foreach 문을 돌 때는 사라진다..?

근데 그게 clear대신 new를 쓰면 또 정상적으로 들어간다..

new를 쓰면 clear보다 성능상으로 안좋지않나요? 그래서 clear를 쓴건데..

왜이러는걸까요 ㅠㅠ 너무궁금합니다