在使用List的sublist发现的问题

List<Integer> tmp1=list.subList(0, list.size()-1);
Collections.sort(tmp1);

当使用如上所示的截取集合发现对tmp1排序,随之list也会发生变化。

通过查阅源码的注释可知,sublist方法返回的是 list的视图,不管是sublist还是list做修改,都会相互影响到对方。

Returns a view of the portion of this list between the specified fromIndex, inclusive, and toIndex, exclusive. (If fromIndex and toIndex are equal, the 
returned list is empty.) The returned list is backed by this list, so non-structural changes in the returned list are reflected in this list, and vice-versa. 
The returned list supports all of the optional list operations supported by this list.

This method eliminates the need for explicit range operations (of the sort that commonly exist for arrays). Any operation that expects a list can be used as a 
range operation by passing a subList view instead of a whole list. For example, the following idiom removes a range of elements from a list: 
      list.subList(from, to).clear();
 
Similar idioms may be constructed for indexOf and lastIndexOf, and all of the algorithms in the Collections class can be applied to a subList.
The semantics of the list returned by this method become undefined if the backing list (i.e., this list) is structurally modified in any way other than via 
the returned list. (Structural modifications are those that change the size of this list, or otherwise perturb it in such a fashion that iterations in 
progress may yield incorrect results.)

因此,当我们想截取list, 并且不希望子list影响到原list可做如下声明。 

List<Integer> tmp1=new ArrayList<Integer>(list.subList(0, list.size()-1));

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值