Java基础(7)-集合类3

list集合的特点

1)有序(存储和取出的元素一直)
2)可重复

List子类的特点

ArrayList

  • 有序,可重复
  • 底层数据结构是数组
  • 查询快,增删慢
  • 线程不安全,效率高

Vector

  • 有序,可重复
  • 底层数据结构是数组
  • 查询快,增删慢
  • 线程安全,效率低

LinkedList

  • 有序,可重复
  • 底层数据结构是双向循环链表
  • 查询慢,增删快
  • 线程不安全,效率高

list存储字符串并遍历

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class ListTest1{
	public static void main(String[] args){
		//创建集合对象
		List list = new ArrayList();

		//创建字符串并添加字符串
		list.add("wu");
		list.add("jia");
		list.add("dong");

		//遍历集合
		Iterator it = list.iterator();
		while(it.hasNext()){
			String s = (String) it.next();
			System.out.println(s);
		}
	}

}

-----------------------------
输出结果
wu
jia
dong
-------------------------------


练习:list存储自定义对象并遍历

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class ListDemo2{
	public static void main(String[] args){
		//创建集合对象
		List list = new ArrayList();

		Student s1 = new Student("wu",21);
		Student s2 = new Student("jia",22);
		Student s3 = new Student("dong",23);

		list.add(s1);
		list.add(s2);
		list.add(s3);
		
		Iterator it = list.iterator();
		while(it.hasNext()){
			Student s = (Student) it.next();
			System.out.println(s);
		}
	}
}


class Student{
	//成员变量
	private String name;
	private int age;

	//无参构造方法
	public Student(){
		super();
	}

	//有参构造方法
	public Student(String name,int age){
		this.name = name;
		this.age = age;
	}

	//setXxx()方法和getXxx()方法
	public void setName(String name){
		this.name = name;
	}

	public String getName(){
		return name;
	}

	public void setAge(int age){
		this.age = age;
	}

	public int getAge(){
		return age;
	}

	//toString()方法
	public String toString(){
		return "Student [name="+name+",age="+age+"]";
	}
}

--------------------------------------
输出结果
Student [name=wu,age=21]
Student [name=jia,age=22]
Student [name=dong,age=23]
-------------------------------------

List集合特有的功能

1)添加功能

void add(int index, Object element):在指定位置添加元素
  1. 获取功能
Object get(int index):获取指定位置的元素

3)列表迭代器

ListIterator listIterator():List集合特有的迭代器

4)删除功能

Object remove(int index):根据索引删除元素,返回被删除的元素

5)修改功能

Object set(int index, Object element):根据索引修改元素,返回被修改的元素

示例:

向指定位置添加元素

/*
*void add(int index,Object element):在指定位置添加元素
*/

import java.util.ArrayList;
import java.util.List;

public class ListDemo3{
	public static void main(String[] args){
		//创建集合对象
		List list = new ArrayList();
		
		list.add("hadoop");
		list.add("spark");
		list.add("storm");
		
		System.out.println("最先的list:"+list);

		//向指定位置添加元素
		list.add(1,"data");
	
		System.out.println("指定位置添加元素后的list:"+list);
	}
}

-------------------------------------
输出结果
最先的list:[hadoop, spark, storm]
指定位置添加元素后的list:[hadoop, data, spark, storm]
---------------------------------------

get()方法获取指定元素和list的遍历

import java.util.List;
import java.util.ArrayList;

public class ListDemo4{
	public static void main(String[] args){
		//创建集合对象
		List list = new ArrayList();

		//添加元素
		list.add("aaa");
		list.add("bbb");
		list.add("ccc");
		list.add("ddd");

		//get()方法获取指定位置的元素
		System.out.println(list.get(0));
		System.out.println(list.get(1));
		System.out.println("----------------------");
		
		//for循环改进
		//遍历的方式是size()和get()
		for(int i = 0;i<list.size();i++){
			System.out.println(list.get(i));
		}
	
		
	}
}

--------------------------------------
输出结果
aaa
bbb
----------------------
aaa
bbb
ccc
ddd

--------------------------------------

list存储自定义对象并遍历

import java.util.List;
import java.util.ArrayList;

public class ListDemo5{
	public static void main(String[] args){
		//创建集合对象
		List list = new ArrayList();
	
		Student s1 = new Student("www",21);
		Student s2 = new Student("jjj",22);
		Student s3 = new Student("ddd",24);

		list.add(s1);
		list.add(s2);
		list.add(s3);

		for(int i=0;i<list.size();i++){
			System.out.println(list.get(i));
		}
	}
}


class Student{
	//成员变量
	private String name;
	private int age;
	
	//无参构造方法
	public Student(){
		super();
	}

	public Student(String name,int age){
		this.name = name;
		this.age = age;
	}

	//get和set方法
	public void setName(String name){
		this.name = name;
	}

	public String getName(){
		return name;
	}

	public void setAge(int age){
		this.age = age;
	}

	public int getAge(){
		return age;
	}

	public String toString(){
		return "Student [name="+name+",age="+age+"]";
	}
}

-------------------------------------
输出结果
Student [name=www,age=21]
Student [name=jjj,age=22]
Student [name=ddd,age=24]
---------------------------------------------
也可用迭代器去遍历

列表迭代器ListIterator

/*
*列表迭代器:
ListIterator listIterator():List集合特有的迭代器
该迭代器继承了Iterator迭代器,所有可以直接使用hasNext()和next()方法
*/


import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class ListDemo6{
	public static void main(String[] args){
		//创建集合对象
		List list = new ArrayList();
	
		list.add("hive");
		list.add("habase");
		list.add("sqoop");
/*		
		Iterator it = list.iterator();
		while(it.hasNext()){
			String s = (String) it.next();
			System.out.println(s);		
*/		
		
		ListIterator it = list.listIterator();
		while(it.hasNext()){
			String s = (String) it.next();
			System.out.println(s);
			
			
		}
	}

}


=-------------
输出结果
hive
habase
sqoop
----------------------



/*
特有功能
Object previous():获取上一个元素
boolean hasPrevious():判断是否有元素
注意:ListIterator可以实现逆向遍历,但须先正向遍历,所以无意义,不使用
*/
import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;
public class ListDemo6{
	public static void main(String[] args){
		//创建集合对象
		List list = new ArrayList();
	
		list.add("hive");
		list.add("habase");
		list.add("sqoop");
		
		ListIterator it = list.listIterator();

		while(it.hasNext()){
			String s = (String) it.next();
			System.out.println(s);
		}
		System.out.println("-----------------------");
		//逆向遍历
		while(it.hasPrevious()){
			String s = (String) it.previous();
			System.out.println(s);
		}
	

	}

}

----------------------------------
输出结果
hive
habase
sqoop
-----------------------
sqoop
habase
hive

---------------------------------

并发修改异常:ConcurrentModificationException

/*
一个集合,判断是否有"cccc"这个元素,如果有添加一个“wujiadong”元素

该异常产生原因:迭代器是依赖于集合而存在,在判断成功后,集合中添加了新元素,而迭代器却不知道,所以报错。即迭代器遍历元素时,通过集合不能修改元素


*/



import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;

public class ListDemo7{
	public static void main(String[] args){
		//创建集合对象
		List list = new ArrayList();
	
		list.add("aaaa");
		list.add("bbbb");
		list.add("cccc");
		list.add("dddd");

		ListIterator it = list.listIterator();
		while(it.hasNext()){
			String s = (String) it.next();
			if("cccc".equals(s)){
				list.add("wujiadong");
			}
		}
		System.out.println(list);
	
	}
}

------------------------------------------
输出结果
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
	at java.util.ArrayList$Itr.next(ArrayList.java:851)
	at ListDemo7.main(ListDemo7.java:17)

注释:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常
------------------------------------------

解决方法
1)迭代器遍历元素,迭代器修改元素
2)集合遍历元素,集合修改元素

/*
方式1:用迭代器,元素时添加在刚才迭代的元素后面
*/
import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;

public class ListDemo7{
	public static void main(String[] args){
		//创建集合对象
		List list = new ArrayList();
	
		list.add("aaaa");
		list.add("bbbb");
		list.add("cccc");
		list.add("dddd");

		ListIterator it = list.listIterator();//注意这里不能用Iterator,该接口中不含add方法
		while(it.hasNext()){
			String s = (String) it.next();
			if("cccc".equals(s)){
				it.add("wujiadong");//通过迭代器添加元素
			}
		}
		System.out.println(list);
	
	}
}

------------------------------------------
输出结果
[aaaa, bbbb, cccc, wujiadong, dddd]
-------------------------------------------

/*
方式2:用集合,元素添加在最后
*/
import java.util.List;
import java.util.ArrayList;

public class ListDemo7{
	public static void main(String[] args){
		//创建集合对象
		List list = new ArrayList();
	
		list.add("aaaa");
		list.add("bbbb");
		list.add("cccc");
		list.add("dddd");

		for(int i=0;i<list.size();i++){
			String s = (String) list.get(i);
			if("cccc".equals(s)){
				list.add("wujiadong");
			}
		}	
		System.out.println(list);
	}
}

-----------------------------------------------
输出结果
[aaaa, bbbb, cccc, dddd, wujiadong]
-------------------------------------------------

ArrayList存储字符串并遍历

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo1{
	public static void main(String[] args){
		//创建集合对象
		ArrayList al = new ArrayList();

		al.add("hadoop");
		al.add("storm");
		al.add("spark");

		System.out.println("---迭代器遍历------------------------");
		//迭代器遍历
		Iterator it = al.iterator();
		//方法一
		while(it.hasNext()){
			String s = (String) it.next();
			System.out.println(s);
		}
		System.out.println("---size和get方法遍历--------------------------");
		//方法二
		for(int i=0;i<al.size();i++){
			String s = (String) al.get(i);
			System.out.println(s);
		}
	}
}

-------------------------------------------
输出结果
---迭代器遍历------------------------
hadoop
storm
spark
---size和get方法遍历--------------------------
hadoop
storm
spark

----------------------------------------------

ArrayList存储自定义对象并遍历

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo2{
	public static void main(String[] args){
		//创建集合对象
		ArrayList al = new ArrayList();

		Student s1 = new Student("wujiadong",21);
		Student s2 = new Student("jiangrui",22);
		Student s3 = new Student("sunqiangkun",23);
		Student s4 = new Student("xuqingyu",24);

		al.add(s1);
		al.add(s2);
		al.add(s3);
		al.add(s4);

		System.out.println("--------迭代器遍历--------------");
		Iterator it = al.iterator();
		while(it.hasNext()){
			Student s = (Student) it.next();
			System.out.println(s);
		}

		System.out.println("------size和get遍历---------------");
		for(int i=0;i<al.size();i++){
			Student s = (Student) al.get(i);
			System.out.println(s);
		}
	}
}


class Student{
	//成员变量
	private String name;
	private int age;

	//构造方法
	public Student(){
		super();
	}

	public Student(String name,int age){
		this.name = name;
		this.age = age;
	}

	//set和get方法
	public void setName(String name){
		this.name = name;
	}

	public String getName(){
		return name;
	}

	public void setAge(int age){
		this.age = age;
	}

	public int getAge(){
		return age;
	}

	//toString方法
	public String toString(){
		return "Student [name="+name+",age="+age+"]";
	}
}




----------------------------------
输出结果
--------迭代器遍历--------------
Student [name=wujiadong,age=21]
Student [name=jiangrui,age=22]
Student [name=sunqiangkun,age=23]
Student [name=xuqingyu,age=24]
------size和get遍历---------------
Student [name=wujiadong,age=21]
Student [name=jiangrui,age=22]
Student [name=sunqiangkun,age=23]
Student [name=xuqingyu,age=24]

--------------------------------------

Vector特有的功能

添加功能

public void addElement(Object obj)

获取功能

public Object elementAt(int index)
public Enumeration elements()

import java.util.Vector;
import java.util.Enumeration;
public class ArrayListDemo3{
	public static void main(String[] args){
		//创建集合对象
		Vector v = new Vector();
		
		v.addElement("aaaa");
		v.addElement("bbbb");
		v.addElement("CCCC");
		v.addElement("dddd");

		for(int i=0;i<v.size();i++){
			String s = (String) v.elementAt(i);
			System.out.println(s);
		}

		System.out.println("------------------");
		Enumeration en = v.elements();//返回的是实现类的对象
		while(en.hasMoreElements()){
			String s = (String) en.nextElement();
			System.out.println(s);
		}

	}
}

--------------------------------------
输出结果
aaaa
bbbb
CCCC
dddd
------------------
aaaa
bbbb
CCCC
dddd

注意:以后还是用add(), get() , Iterator 这些方法,上述方法基本不用。

JDK升级:  
1)安全  
2)效率  
3)简化书写
------------------------------------

LinkList特有功能

添加功能

public void addFirst(Objet e):
public void addLast(Object e): 和add()没很大区别

获取功能

public Object getFirst():
public Object getLast():

删除功能

public Object removeFirst():
public Object removeLast():

实例

import java.util.LinkedList;

public class LinkedListDemo{
	public static void main(String[] args){
		LinkedList ll = new LinkedList();
		
		ll.add("java");
		ll.add("python");
		ll.addLast("PERL");
		ll.add("scalca");
		
		System.out.println(ll);
		System.out.println("1-----------------------------");
		
		ll.addLast("R");
		System.out.println(ll);

		System.out.println("2-----------------------------");
		ll.addFirst("C++");	

		System.out.println(ll);
		System.out.println("3--------------------------------");
		ll.removeFirst();
		System.out.println(ll);
		System.out.println("4========================");
		ll.removeLast();
		System.out.println(ll);
	}
}

-----------------------------------------
输出结果
[java, python, PERL, scalca]
1-----------------------------
[java, python, PERL, scalca, R]
2-----------------------------
[C++, java, python, PERL, scalca, R]
3--------------------------------
[java, python, PERL, scalca, R]
4========================
[java, python, PERL, scalca]


练习1:ArrayList去除集合中字符串的重复值(创建新集合)

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo4{
	public static void main(String[] args){
		//创建集合
		ArrayList al = new ArrayList();
	
		al.add("java");
		al.add("python");
		al.add("scalca");
        al.add("java");
        al.add("python");
        al.add("scalca");
        al.add("python");

		//遍历集合,获取到每一个元素
		ArrayList al1 = new ArrayList();
		Iterator it = al.iterator();
		while(it.hasNext()){
			String s = (String) it.next();
		
			//拿这个元素到集合中去找,看有没有
			if(!al1.contains(s)){
				al1.add(s);
			}
			
		}

		//遍历新集合
		for(int i=0;i<al1.size();i++){
			String s = (String) al1.get(i);
			System.out.println(s);
		}
		
	}
}

-----------------------------------------------
输出结果
java
python
scalca

-----------------------------------------------

练习1:ArrayList去除集合中自定义对象的重复值(对象的成员变量值)

posted @ 2016-11-05 19:45  邬家栋  阅读(163)  评论(0编辑  收藏  举报