JAVA中List和Map用法与区别(上)

Java集合框架体系中有collection 和Map两个接口,collection主要有三个子接口(List,Queue,Set),List Set比较常用,其中List(序列)中的元素是有序的可以重复的,Set(集)无序且不能重复。List有一个很重要的实现类ArrayList,Set一个很重要的实现类HashSet 。Map一个很重要的实现类是HashMap.

collection中存储的是一个个独立的对象,Map内部提供的是一种映射关系entry<key,value>,value可重复,key不可。

一.关于List接口中的方法的增删改查

1.增加新元素:用add(E e),add(int index, E element),addAll(Collection<? extends E> c),addAll(int index,Collection<? extends E> c)

例如:
public class ListTest {

	/*
	 * 用于存放备选课程的list
	 */
	public List coursesToSelect;
	public ListTest(){
		this.coursesToSelect = new ArrayList(); //实现类
	}
	
	/*
	 * 用于往courseToSelect中添加备选课程
	 */
	public void testAdd(){
		//list里添加元素,用add(element),add(index,element),addAll(element),addAll(index,element);
		//创建一个课程对象调用ADD方法,添加到备选课程List中去
		//取出LIST的元素用get
		Course cr1 = new Course("1","数据结构");
		coursesToSelect.add(cr1);
		//对象存入集合都变成Object类型取出时需要类型转换
		Course temp = (Course)coursesToSelect.get(0);
		System.out.println("添加了课程:"+temp.id+":"+temp.name);
		
		Course cr2 = new Course("2","C语言");
		coursesToSelect.add(1,cr2);
		Course temp2 = (Course)coursesToSelect.get(1);
		System.out.println("添加了课程:"+temp2.id+":"+temp2.name);
		
	
		coursesToSelect.add(cr1);
		//对象存入集合都变成Object类型取出时需要类型转换
		Course temp0 = (Course)coursesToSelect.get(2);
		System.out.println("添加了课程:"+temp0.id+":"+temp0.name);
		/*
		Course cr3 = new Course("3","test");
		coursesToSelect.add(0,cr3);
		Course temp3 = (Course)coursesToSelect.get(0);
		System.out.println("添加了课程:"+temp3.id+":"+temp3.name);*/
		
		Course[] course = {new Course("3","离散数学"),new Course("4","汇编语言")};
		coursesToSelect.addAll(Arrays.asList(course));
		Course temp3 = (Course)coursesToSelect.get(3);
		Course temp4 = (Course)coursesToSelect.get(4);
		System.out.println("添加两门课程:"+ temp3.id+":"+temp3.name+";"+
		temp4.id+":"+temp4.name);
		
		Course[] course2 = {new Course("5","高等数学"),new Course("6","大学英语")};
		coursesToSelect.addAll(4, Arrays.asList(course2));
		Course temp5 = (Course)coursesToSelect.get(4);
		Course temp6 = (Course)coursesToSelect.get(5);
		System.out.println("添加两门课程:"+ temp5.id+":"+temp5.name+";"+
				temp6.id+":"+temp6.name);		
	}

2.查看集合中的元素:有三种:get,迭代器,foreach

public void testGet(){
		int size = coursesToSelect.size();
		System.out.println("有如下课程待选(普通循环):");
		for(int i = 0 ; i < size ; i++){
			Course cr = (Course)coursesToSelect.get(i);
			System.out.println("课程"+cr.id+":"+cr.name);
		}
	}
	
	/*
	 * 通过迭代器来遍历List   iterator,迭代器不能存储,只是用来遍历,
	 */
	public void testIterator(){
		Iterator it = coursesToSelect.iterator();
		System.out.println("有如下课程待选(通过迭代器访问):");
		while(it.hasNext()){
			Course cr =(Course) it.next();
			System.out.println("课程"+cr.id+":"+cr.name);
		}
	}
	
	/*
	 * 通过for each方法访问集合元素
	 */
	public void testForEach(){
		System.out.println("有如下课程待选(通过for each访问):");
		for(Object obj:coursesToSelect){
			Course cr = (Course) obj;
			System.out.println("课程"+cr.id+":"+cr.name);
			
		}
	}

3.删除List中的元素,remove,removeAll

	/*
	 * 删除List中的元素,remove removeAll
	 */
	public void testRemove(){
		Course cr = (Course)coursesToSelect.get(2);
		System.out.println("即将删除2,3位置上的课程");
		Course[] courses = {(Course)coursesToSelect.get(2),(Course)coursesToSelect.get(3)};
		coursesToSelect.removeAll(Arrays.asList(courses));
	//	coursesToSelect.remove(2); //coursesToSelect.remove(cr);两种删除方法
		System.out.println("成功删除课程!");
		testForEach();	
	}




4.修改List中的元素

	/*
	 * 修改list中的元素,set(index,element);
	 */
	public void testModify(){
		coursesToSelect.set(2, new Course("7","毛概"));
	}




二.Set接口中的增删改查

1.增加,add与List基本相同, 注意addAll
当 在Set中重复添加元素时,并不能添加进去
		Course[] course = {new Course("3","离散数学"),new Course("4","汇编语言")};
		coursesToSelect.addAll(Arrays.asList(course));
		Course temp3 = (Course)coursesToSelect.get(2);
		Course temp4 = (Course)coursesToSelect.get(3);
		/*System.out.println("添加两门课程:"+ temp3.id+":"+temp3.name+";"+
		temp4.id+":"+temp4.name);*/
		
		Course[] course2 = {new Course("5","高等数学"),new Course("6","大学英语")};
		coursesToSelect.addAll(4, Arrays.asList(course2));
		Course temp5 = (Course)coursesToSelect.get(4);
		Course temp6 = (Course)coursesToSelect.get(5);
		/*System.out.println("添加两门课程:"+ temp5.id+":"+temp5.name+";"+
				temp6.id+":"+temp6.name);	*/	

2.查询集中的元素
	循环遍历Set只能用foreach,iterator.而List可以用get()方法例如:
public void testForEach(){
		System.out.println("有如下课程待选(通过for each访问):");
		for(Object obj:coursesToSelect){
			Course cr = (Course) obj;
			System.out.println("课程"+cr.id+":"+cr.name);		
		}
	}
其余基本相同。

三、关于泛型

集合中的元素可以是任意类型的对象(对象的引用),如果把某个对象放入集合,则会忽略它的类型,而把它当做Object处理。泛型则规定了某个集合只可以存放特定类型的对象,在编译器会对类型进行检查List<可以用的类型>,而不是执行之后才看到报错情况,另外,在foreach循环遍历时,若没有规定泛型,则如上,规定泛型以后可以这么写:

public void testForEach(){
		for(Course cr :courses){
			System.out.println(cr.id+":"+cr.name);
		}
	}
反省集合既可以存 入泛型类型的对象实例,又可以存入泛型子类型的对象实例。

1.房型集合中的限定类型不能使用基本数据类型

2可以通过使用包装类限定允许存入的基本数据类型

public void testBasicType(){
		List<Integer>list = new ArrayList<Integer>();
		list.add(1);
		System.out.println("基本类型的包装类作为泛型:"+list.get(0));
	}

四、关于Map接口&HashMap中的方法的增删改查

1.添加新元素,put(key,value)

public MapTest(){
		this.students = new HashMap<String,Student>();
	}
	
	/*
	 * 测试添加:输入学生ID,判断是否被占用
	 * 若未被占用则输入姓名,创建新学生对象,并添加到students中
	 */
	public void testPut(){
		Scanner console = new Scanner(System.in);
		int i = 0;
		while(i<3){
			System.out.println("请输入学生ID");
			String ID = console.next();
			Student st = students.get(ID);
			if(st == null)
			{
				System.out.println("请输入学生姓名");
				String name = console.next();
				Student newStudent = new Student(ID,name);
				
				students.put(ID, newStudent);
				System.out.println("成功添加学生:"+students.get(ID).name);
				i++;
			}else{
				System.out.println("该学生ID已被占用");continue;
			}
			
		}
	}

2.查询
	方法一:keySet方法返回的是value值
	/*
	 * 测试Map的keySet方法
	 */
	public void testKeySet(){
		//通过keySet方法,返回Map中所有键的Set集合
		Set<String> keySet = students.keySet();
		//取得students的容量
		System.out.println("总共有 "+students.size()+"个学生");
		//遍历keySet方法,取得每一个件,在调用get方法取得每个键对应的value
		for(String stuId:keySet){
			Student st = students.get(stuId);
			if(st!=null){
				System.out.println("学生:"+st.name);
			}
		}
	}
	方法二:entrySet返回的是所有的键值对
/*
	 * 通过entrySet方法遍历Map
	 */
	public void testEntrySet(){
		//通过entrySet方法,返回Map中的所有键值对
		Set<Entry<String,Student>>entrySet = students.entrySet();
		for(Entry<String,Student> entry:entrySet){
			System.out.println("取得键"+entry.getKey());//取得KEY值
			System.out.println("对应的值为"+entry.getValue().name);//取得value值
		}
	}
	


3.删除

	/*
	 * 测试删除Map中已有的映射
	 */
	public void testRemove(){
		
		Scanner sc = new Scanner(System.in);
		while(true){
			//提示输入待删除学生的ID
			System.out.println("输入待删除学生的ID");
			String ID = sc.next();
			Student st = students.get(ID);
			if(st==null){
				System.out.println("输入的ID不存在");
				continue;
			}else{
				students.remove(ID);
				System.out.println("成功删除学生"+st.name);
				break;
			}
		}
	}
4.修改

用put(key,value)方法,与添加不同的是这里的key是已经存在的方法
/*
	 * 利用put方法修改Map中的已有的映射
	 */
	public void testModify(){
		System.out.println("请输入要修改的学生ID");
		Scanner sc = new Scanner(System.in);
		while(true){
			String stuId = sc.next();
			//查找是否有相应的ID对应的学生对象
			Student student = students.get(stuId);
			if(student == null){
				System.out.println("ID不存在");
				continue;
			}
			System.out.println("对应的学生名"+student.name);
			System.out.println("请输入新的学生姓名:");
			String name = sc.next();
			Student newStudent = new Student(stuId,name);
			students.put(stuId, newStudent);
			System.out.println("修改成功");
			break;
		}
		
	}





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值