android中 List
来源:互联网 发布:dj音乐制作软件 编辑:程序博客网 时间:2024/06/11 20:46
一、List(集合的一种)
|--List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引,
|-- ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步
|-- LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快)
|-- Vector:底层是数组数据结构 线程同步(数组长度是可变的百分之百延长)(无论查询还是增删都很慢,被ArrayList替代了)
List:特有的方法,凡是可以操作角标的方法都是该体系特有的方法
增
boolean add(int index, E element)
boolean addAll(index,Collection)
public static void List_add(){
ArrayList a1 = new ArrayList();
a1.add("java");
a1.add("php");//List集合中的元素可以重复
a1.add(".net");
System.out.println("原集合:"+a1);
a1.add(1, "Flash");
a1.add(0, "ps");
System.out.println(a1);
ArrayList a2 = new ArrayList();
a2.add("javascript");
a2.add("3dMax");
a2.add("IBM");
a1.addAll(0, a2);
System.out.println(a1);
}
删除指定位置的元素
boolean remove(int index)
public static void List_remove(){
ArrayList a1 = new ArrayList();
a1.add("javascript");
a1.add("php");
a1.add("flash");
System.out.println("原集合:"+a1);
a1.remove(0);
System.out.println(a1);
}
修改指定角标的元素 set(int index, E element) 返回的是修改的那个元素
public static void List_set() {
ArrayList a1 = new ArrayList();
a1.add("javascript");
a1.add("php");
a1.add(".net");
System.out.println("原集合:"+a1);
a1.set(1, "falsh");
System.out.println(a1);
}
查
get(int index) 返回列表中指定位置的元素
subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分元素。
public static void List_get() {
ArrayList a1 = new ArrayList();
a1.add("java");
a1.add("php");
a1.add("flash");
System.out.println(a1.get(0));//获取指定角标的元素,有了该方法就可以遍历该集合中的所有元素
System.out.println(a1.subList(1, 3));//获取集合中某一部分的元素,包含头不包含尾
}
二、List 和ArrayList
(一)、两者的区别
List是一个接口,而ArrayList是一个类。
(二)、两者的联系
ArrayList继承并实现了List。
所以List不能被构造,但可以向上面那样为List创建一个引用,而ArrayList就可以被构造。
(三)、两者的实例说明
List list; //正确 list=null;
List list=new List(); // 是错误的用法
List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。
而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
三、迭代器
Java要求各种集合都提供一个iteratot()方法,该方法返回一个Iterator用于遍历集合中的元素。至于返回的Iterator是哪一种实现类我们并不关心,这就是典型的“迭代器模式”。
迭代器一般和泛型数组ArrayList,泛型链表LinkList配合使用,达到顺序遍历的效果。
先来看看下面两段代码:解释写在代码注释里了
例2
- private ArrayList<String> getChecked()
- {
- /**
- * ArrayList<PhotoItem>用来存放图片信息
- */
- private ArrayList<PhotoItem> mPhotolist = null;
- /**
- * new一个ArrayList<String>,用来存放文件的地址path
- */
- ArrayList<String> list = new ArrayList<String>();
- /**
- * 给mPhotolist加上迭代器,对它进行顺序遍历操作,这里是关键!it只是一个迭代器对象
- */
- Iterator<PhotoItem> it = mPhotolist.iterator();
- while (it.hasNext())
- {
- /**
- * 把遍历得到的PhotoItem类型对象赋值给PhotoItem类型对象temp
- */
- PhotoItem temp = it.next();
- if (temp.isChecked)
- {
- String path = getRealPath(temp.ImageID);
- if (path != null)
- {
- list.add(path);
- }
- }
- }
- return list;
- }
- @Override
- protected void onResume()
- {
- List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
- Iterator<Mp3Info> iterator = mp3Infos.iterator();
- while (iterator.hasNext())
- //for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();)
- {
- Mp3Info mp3Info = iterator.next();
- HashMap<String, String> map = new HashMap<String, String>();
- map.put("mp3_name", mp3Info.getMp3Name());
- map.put("mp3_size", mp3Info.getMp3Size());
- list.add(map);
- }
- }
- 第二段代码其实和第一段代码所实现的功能是一样的,大家可以参考一下,作个比较!
- public class IteratorTest {
- public static void main(String[] args) {
- Collection books = new HashSet();
- books.add("计算机网络");
- books.add("数字信号处理");
- books.add("java语言程序设计");
- //生成迭代器
- Iterator it = books.iterator();
- int i=0;
- //hasNext是取值取的是当前值.他的运算过程是判断下个是否有值如果有继续.
- while(it.hasNext()){
- //next()返回的数据是Object型,需要强制转化 (取出下一个值)
- String info = (String)it.next();
- //输出遍历的每一个元素
- System.out.println("第"+i+"个元素:"+info);
- if(info.equals("数字信号处理")){
- System.out.println(i);
- it.remove(); //把《数字信号处理》从集合books中移除
- }
- i++;
- }
- //输出移除后的结果
- System.out.println(books);
- }
- }
第0个元素:java语言程序设计
第1个元素:数字信号处理
1
第2个元素:计算机网络
[java语言程序设计, 计算机网络
List集合特有的迭代器:ListIterator(是Iterator的子接口)
注意:
在迭代时,是不可以通过集合对象的方法操作集合中的元素
因为会发生ConcurrentModificationException异常(并发异常)
所以,在迭代器时,只能用迭代器的方法造作元素
因为Iterator方法是有限的所以只能对元素进行判断,取出,删除的操作
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator
该接口只能通过List集合的listIterator方法获取
public class ListIteratorDemo {
public static void main(String[] args) {
ArrayList a1 = new ArrayList();
a1.add("java01");
a1.add("java02");
a1.add("java03");
a1.add("java04");
System.out.println("原集合是:"+a1);
/*在迭代过程中准备添加或者删除元素
Iterator it = al.iterator();
while (it.hasNext()){
Object obj = it.next();
if (obj.equals("java02"))
//al.add("java008");//会出现并发异常,因为迭代器正在操作集合,不能再用集合的方法操作集合了
it.remove();//将java02的引用从集合中删除了
System.out.println("obj:"+obj);
}
*/
//只有List的listIterator有增,删,改,查这些功能,因为只有List有索引
ListIterator li = a1.listIterator();
while (li.hasNext()){
if(li.next().equals("java02"))
//li.add("java009");
li.set("java006");
}
}
}
附 LinkedList特有方法:
addFirst();在头部添加元素 addLast();在尾部添加元素
getFirst(); getLast(); 获取元素但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst(); removeLast(); 获取元素但是删除元素。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法
offerFirst(); offerLast();
peekFirst(); peekLast(); 获取元素,但是元素不被删除。如果集合中没有元素,会返回null
pollFirst(); pollLast(); 获取元素,但是元素被删除。如果集合中没有元素,会返回null
复制代码 代码如下:
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList link = new LinkedList();
link.add("java01");
link.add("java02");
link.add("java03");
link.add("java04");
while(!link.isEmpty()){
System.out.println((link.removeLast()));
}
}
}
实际应用例子:
http://www.cnblogs.com/jpwz/p/5672896.html
List接口是Collection接口的子接口,List有一个重要的实现类--ArrayList类,List中的元素是有序排列的而且可重复,所以被称为是序列。
List可以精确的控制每个元素的插入位置,或删除某个位置元素,它的实现类ArrayList底层是由数组实现的。
List中有增删改查的方法,我们可以通过例子演示:
我们通过对学生选课,来演示List中对课程增删改查的方法
1 /** 2 * 课程类 3 * @author lenovo 4 * 5 */ 6 public class KeCheng { 7 8 public String id; 9 10 public String name;11 12 public KeCheng(String id,String name){13 this.id = id;14 this.name = name;15 }16 17 }
创建一个学生类
1 import java.util.HashSet; 2 import java.util.Set; 3 4 /** 5 * 学生类 6 * @author lenovo 7 * 8 */ 9 public class Student {10 11 public String id;12 13 public String name;14 15 public Set kecheng;16 17 public Student(String id,String name){18 this.id = id;19 this.name = name;20 this.kecheng = new HashSet();21 }22 23 }
创建一个备选课程的类
1 /** 2 * 备选课程类 3 * @author lenovo 4 * 5 */ 6 public class ListTest { 7 8 //用于存放备选课程的List 9 public List beixuan;10 11 public ListTest(){12 this.beixuan = new ArrayList();13 }14 }
可以使用List中add方法添加课程
1 /* 2 * 用来往beixuan里添加备选课程的方法 3 */ 4 public void kcAdd(){ 5 6 //创建一个课程的对象,调用add方法,添加到备选课程的List中 7 KeCheng kc = new KeCheng("1","数据结构"); 8 beixuan.add(kc); 9 10 KeCheng kc2 = new KeCheng("2","C语言");11 beixuan.add(0, kc2);12 13 KeCheng[] kcArr = {new KeCheng("3","大学语文"),new KeCheng("4","线性代数")};14 beixuan.addAll(Arrays.asList(kcArr));15 16 KeCheng[] kcArr2 = {new KeCheng("5","艺术设计"),new KeCheng("6","计算机基础")};17 beixuan.addAll(2, Arrays.asList(kcArr2));18 19 }20
使用get方法取出指定位置上的内容,并用for循环遍历出课程的内容
1 /* 2 * 使用for循环遍历课程的方法 3 */ 4 public void getKC(){ 5 int size = beixuan.size(); 6 System.out.println("使用for遍历课程:"); 7 for (int i = 0; i < size; i++) { 8 KeCheng kc = (KeCheng) beixuan.get(i); 9 System.out.println("课程:"+kc.id+":"+kc.name+";");10 }11 }
遍历List的内容,除了使用for循环外,还可以使用迭代器、foreach等方法
1 /* 2 * 使用Iterator迭代器遍历课程 3 */ 4 public void testIterator(){ 5 Iterator it = beixuan.iterator(); 6 System.out.println("使用Iterator遍历课程:"); 7 while(it.hasNext()){ 8 KeCheng kc = (KeCheng) it.next(); 9 System.out.println("课程:"+kc.id+":"+kc.name+";");10 }11 12 }13 14 /*15 * 使用for each遍历课程16 */17 public void testForeach(){18 System.out.println("使用for each遍历课程:");19 for(Object obj : beixuan){20 KeCheng kc = (KeCheng)obj;21 System.out.println("课程:"+kc.id+":"+kc.name+";");22 }23 }24
修改List中的元素,可以使用set方法
1 /*2 * 使用set方法添加课程3 */4 public void testModify(){5 beixuan.set(0, new KeCheng("7","毛概"));6 }
删除List中的元素有两种方法,一是使用remove方法
1 /* 2 * 使用remove方法删除课程 3 */ 4 public void testRemove(){ 5 KeCheng kc = (KeCheng) beixuan.get(0); 6 System.out.println("我是课程:"+kc.id+":"+kc.name+";即将被删除"); 7 boolean b = beixuan.remove(kc); 8 if(b){ 9 System.out.println("成功删除课程");10 testForeach();11 }12 }
还可以使用removeAll方法删除一个课程类型的数组
1 /* 2 * 使用removeAll方法删除课程 3 */ 4 public void testRemoveAll(){ 5 System.out.println("即将删除4和5位置上的课程"); 6 KeCheng[] kc = {(KeCheng) beixuan.get(4),(KeCheng) beixuan.get(5)}; 7 beixuan.removeAll(Arrays.asList(kc)); 8 System.out.println("课程删除成功"); 9 testForeach();10 }
- android中 List
- android中layer-list标签
- android中layer-list标签
- Android中layer-list学习
- android list排序(不管list中是何种数据类型)
- android 中List转换String,String转换List 改进版本
- android 中list的创建有困难
- Android ril_event.cpp中event list分析
- android中json转换成List<Map>
- android中如何使用layer-list
- android 中layer-list的用法
- android 中 ArrayList 、LinkList、List 区别
- android/java 将数组加入list中
- android 中 ArrayList 、LinkList、List 区别
- android 中layer-list的用法
- android 中layer-list的用法
- Android中List循环遍历性能对比
- android中list数据与json互转
- 倒计时
- 微信curl上传客服头像接口遇到的坑
- Java内部静态类
- java webservice服务器端获取request对象的三种方式
- RobotFramework环境配置二十五:屏幕截图问题(滚动屏幕)
- android中 List
- 在Filter中注入Service
- 用assgin,和用weak修饰delegate的区别
- 纳什均衡的对赌问题
- [leetcode]: 27. Remove Element
- HTML 引入CSS 三种方式
- window10 tensorflow安装,完整安装,解决一切问题!
- Python datetime数据类型
- mac上svn出现SSL错误的解决方式