您的位置:首页 > 编程语言 > Java开发

java容器 -- list的总结

2016-09-18 08:40 267 查看
在我们的编程过程中,会遇到很多和容器类打交道的情况。这里就一些简单的常用的list相关的信息总结如下。


基本使用

1.正常使用

代码如下:

public class ListTest {

public static void main(String[] args) {

List<String> l = new ArrayList<String>();
l.add("hello");
l.add("you");
l.add("hello");
l.add("hello");
dropLastTest(l);
dropLastTest(l);
seeAllWithIterator(l);
seeAllWithFor(l);
}

//删除第一个hello.
public static void dropFirstTest(List<String> l){
System.out.println("drop first hello:");
l.remove("hello");
System.out.println(l);
}

//删除最后一个hello.
public static void dropLastTest(List<String> l){
System.out.println("drop last hello:");
l.remove(l.lastIndexOf("hello"));
System.out.println(l);
}

//删除中间某个hello.通过计数的方式,在程序中实现。(删除第二个hello)【不写】

//通过迭代器(Iterator)遍历列表
public static void seeAllWithIterator(List<String> l){
System.out.println("iterator :");
Iterator<String> it = l.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}

//通过for循环来实现遍历
public static void seeAllWithFor(List<String> l){
System.out.println("see all with for cycle :");
for(int i =0;i < l.size();i++){
System.out.println(l.get(i));
}
}
}


输出结果如下:

drop last hello:

[hello, you, hello]

drop last hello:

[hello, you]

iterator :

hello

you

see all with for cycle :

hello

you

2.删除list中所有值为x的元素

这里主要是删除所有的“hello”。

方式1:(Iterator方式)

//clear all the "hello"
public static void removeAllRelated1(List<String> l){
Iterator<String> it = l.iterator();
while(it.hasNext()){
if(it.next().equals("hello")){
it.remove();
}
}
System.out.println(l);
}


方式2:(removeAll的使用)

public static void removeAllRelated2(List<String> l){
Iterator<String> it = l.iterator();
List<String> tobeDeleted = new ArrayList<String>();
while(it.hasNext()){
String tmp = it.next();
if(tmp.equals("hello")){
tobeDeleted.add(tmp);
}
}

l.removeAll(tobeDeleted);
System.out.println(l);
}


上面两种方式,结果都是:

[you]


3.一些需要注意的问题

(1)当利用for循环遍历时,如果进行插入删除操作,可能会使一些元素被多次访问,或者是 不被访问。

比如说,下面的代码:

假设下面方法的参数l中只有两个元素:“hello”,”you”.

//关于for循环存在的缺陷。
public static void testForError(List<String> l){
//尝试在for 循环中跳过you.
//模拟在遍历过程中插入的场景。
System.out.println("some error with for cycle :");
//l.size()每次都会重新算一遍。
//l中一旦把某个元素删除了,后面的就会补上去。
for(int i =0;i < l.size();i++){
if(i == 0){
l.remove(i);
l.add("added");
}
System.out.println(l.get(i));
}
}


结果如下:

当删除0位置上的元素的时候,后面的you补了上去。(此时,l.size() 为1)

当插入元素”added”的时候,放到了原来you 的位置,也就是位置1.(此时 ,l.size( )为2)

虽然l.size()变了,但是 i 的内容是不会随 l 的大小而变化的。

you

added

结论

不建议在遍历的时候,通过list的方式删除数据,容易造成混乱。

4.Iterator的使用

迭代器,也可以成为游标。

包含的基本方法:

hasNext();

next();

remove();

PS

- 可以看出Iterator是专门针对某种形式的遍历而设计的,所以其有着简洁的原则。

- 【职责单一】这样体现了职责单一的特点。(只允许遍历,以及删除当前元素)

- 【只能前进,不能后退

-【无冗余】 Iterator在遍历过程中,不具有置到初始位置的功能。

(2)使用迭代器遍历时也会出现一些错误。

见:http://blog.csdn.net/thesnowboy_2/article/details/52567101

5.list相关转化

list转化为数组

使用List 的 public T[] toArray(T[] a) 方法。

ArrayList<String> list=new ArrayList<String>();
String[] strings = new String[list.size()];
list.toArray(strings);


数组转化为list.

使用Arrays的 aslist方法。

String[] s = {"1","b","hello"};
List list = java.util.Arrays.asList(s);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java容器