首页 > 代码库 > 学习-集合框架

学习-集合框架

  集合:装东西的容器;

  框架:为了打到某一目的或者实现某个功能,而预先设计好的一系列具有继承或实现关系的类与接口;

  Collection接口,常用的集合或是他的直接实现类,或是有间接关系;

  三种常用集合:

  一.List

  特点:a.线性,就是有序的意思,有下标,元素放入集合的顺序就是他存放元素的顺序;

     b.可以放入重复元素;

  1.ArrayList

  ArrayList在内存中依然是连续内存地址,这样做的优点是:查找元素效率高;往末尾添加元素效率高;

  List的另一个子类Vector的元素存放方式与ArrayList一样,所以常把他们拿来比较,ArrayList是线程不安全的但是效率高;Vector是线程安全的但是效率低.

  常用操作:

public static void main(String[] args) {		// TODO Auto-generated method stub		ArrayList array = new ArrayList();		//增		array.add(1000);		array.add("hello");		array.add("world");		array.add(new Object());		//获取集合中元素的数量		int num = array.size();		//删		array.remove(1);		//查		Object obj = array.get(2);		//改		array.set(1, "helloworld");	}

  2.LinkedList

  LinkedList在方法与效果上与ArrayList相同,不同的是元素的储存方式.LinkedList在内存是链式存储元素,集合的引用指向第一个元素,每个元素都有前后两个引用,前引用指向上一个元素,后引用指向下一个元素,第一个元素的前引用为null,最后一个的后引用为null;缺点是,在查找时,必须按顺序一个个的去找;优点是:内存利用率高,向中间添加数据方便.

  二.Set

  特点:放入的元素无序不重复;

  常用的Set是HashSet,他通过两个方法判断放入元素是否重复:1.两个对象的equals返回true表示内容相同;

                               2.两个对象的HashCode一致为相同;

  必须两个都不相同才能放入集合.

  常用方法:

public static void main(String[] args) {		HashSet hs = new HashSet();		//增		hs.add(new ArrayList());		hs.add("hello");		//查看集合中元素个数		int num = hs.size();		//删		hs.remove(1);	}

  由于是无序存放所以没有下标的说法,没办法操作其中某个元素

  三.Map

  特点:元素以键值对的形式存入集合;一个键对应一个值;键和值都可以是任意自定义类型;每个键都是唯一的不能重复,值可以有重复.

  1.常用的Map是HashMap,他判断键是否相等的方式与HashSet一样

  常用方法:

  

		// TODO Auto-generated method stub		/*		 * Map集合--映射--元素是以键值对的方式,成对表示的。		 * 键不能重复,但是值可以重复		 * 键与值都可以是任意数据类型		 * 		 */				HashMap<Integer, Student> map = new HashMap<Integer, Student>();				//增		map.put(12901, new Student(12901,"zhang3",23));		map.put(12902, new Student(12902,"li4",21));		map.put(12903, new Student(12903,"wang5",24));				//删		map.remove(12902);				//查		Student stu = map.get(12901);		System.out.println(stu);				//改		map.put(12901, new Student(12901,"zhang3",32));				System.out.println(map.size());				//得到map中所有的key		Set<Integer> keySet = map.keySet();		for(Integer key : keySet){			System.out.println(key);		}		 		//得到map中所有的值		Collection<Student> values = map.values();		for(Student tmpStu : values){			System.out.println(tmpStu);		}				//是否包含某个键		System.out.println(map.containsKey(12904));		//是否包含某个值		System.out.println(map.containsValue(new Student(12901,"zhang3",32)));	

   HashMap与HashTable的区别:a.HashMap不允许使用null做键,线程不安全;

                 b.HashTable允许其中一个键是null,线程安全;

  2.Properties-一个特殊的Map

  特点:a.是属于Map的集合类

     b.可以直接操作文件-属性文件(Properties文件)一种专属的文本文件.

 

public static void main(String[] args) {		// TODO Auto-generated method stub		/*		 * Properties---属于Map分支的一种集合类;		 * 				可以操作一种专属格式的文本文件(属性文件,properties文件)		 */				Properties props = new Properties();		//增//		props.setProperty("J120", "J120-123456-10000.0");//		props.setProperty("J121", "J121-123456-11000.0");//		props.setProperty("J122", "J122-123456-12000.0");				//取//		String value = http://www.mamicode.com/props.getProperty("J121");//		//		//改//		props.setProperty("J121", "J121-123456-11200.0");//		//		//删除//		props.remove("J121");//		//		//同样拥有Map的其他常用方法//		props.containsKey("J121");//		Set<Object> allKey = props.keySet();//		Collection<Object> allValues = props.values();//		for(Object key : allKey){//			String strKey = (String)key;//		}						//写文件---不能单独写入某一个键值对,只能全部写入		//store方法两个参数:1、文件输出流,参数是文件的名字和位置;2、注释,可以不写那就传入null或空串//		try {//			props.store(new FileOutputStream("properties/user.data"), null);//		} catch (FileNotFoundException e) {//			// TODO Auto-generated catch block//			e.printStackTrace();//		} catch (IOException e) {//			// TODO Auto-generated catch block//			e.printStackTrace();//		}				//读文件		try {			props.load(new FileInputStream("properties/user.data"));		} catch (FileNotFoundException e) {			// TODO Auto-generated catch block			e.printStackTrace();		} catch (IOException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}				Collection allValues = props.values();		for(Object values : allValues){			String strValue = http://www.mamicode.com/(String)values;>

  四.集合工具

  1.遍历:a.for-each循环

  

		// TODO Auto-generated method stub		/*		 * for-each循环专用(只能用作)对集合进行遍历(所谓遍历--指代把集合中的每个元素取出来,操作一次。);		 * 支持数组、List、Set		 */				int[] array1 = new int[]{1,3,5,7,9};		//		for(int i = 0; i < array1.length; i++){//			System.out.println(array1[i]);//		}		//		for(int tmp : array1){//			System.out.println(tmp);//		}						ArrayList<String> lst = new ArrayList<String>();//		lst.add("hello");//		lst.add("world");//		lst.add("hell");//		//		for(String str : lst){//			System.out.println(str);//		}						HashSet<Integer> set = new HashSet<Integer>();		set.add(100);		set.add(120);		set.add(102);		set.add(200);		set.add(122);				for(int in : set){			System.out.println(in);		}			

          b.迭代器(Iterator)

  支持遍历的集合:a.数组支持普通for循环,for-each循环;

          b.List支持普通for循环,for-each循环,迭代器;

          c.Set支持for-each循环,迭代器;

  2.集合工具类:Collections类,Arrays类

  

public static void main(String[] args) {		// TODO Auto-generated method stub		// 1、addAll---一次往集合中放入多个元素		ArrayList<String> lst1 = new ArrayList<String>();		lst1.add("J129");		lst1.add("J120");		lst1.add("J121");		ArrayList<String> lst2 = new ArrayList<String>();		lst2.add("J124");		lst2.add("J127");		lst2.add("J128");				Collections.addAll(lst2, lst1.get(0),lst1.get(1),lst1.get(2),"hello","world");		//max\min---得到集合中最大的元素和最小的元素		String max = Collections.max(lst1);		String min = Collections.min(lst2);		System.out.println(max);		System.out.println(min);		
          //排序方法只支持List //reverse---把一个集合倒序排列,也称之为反转 System.out.println("反转前====================="); for(String str : lst2){ System.out.println(str); } Collections.reverse(lst2); System.out.println("反转后====================="); for(String str : lst2){ System.out.println(str); } //sort---把集合排序 Collections.sort(lst2); System.out.println("排序后====================="); for(String str : lst2){ System.out.println(str); } //shuffle---随机混排 Collections.shuffle(lst2); System.out.println("排序后====================="); for(String str : lst2){ System.out.println(str); } }

  五.补充知识点:

  1.JDK1.5以后数组作为方法形参的新语法

public void test(){				int[] array  = new int[5];		array[0] = 1;				testArray(array);		testArray(1,2,3,4,5,6,7,8,9);	}		//JDK1.5之后用数组做参数的新语法	public void testArray(int... array){		System.out.println(array[0]);		System.out.println(array.length);	}

  2.比较器

    a.内部比较器-Compareable接口

    参与比较的类实现Compareable接口,重写比较方法,传入一个同类型对象,自定义当前对象与传入对象比较内容,得到当前对象与传入对象的位置差,为正则表示当前对象排在传入对象之后,为负则表示当前对象排在传入对象之前.

    b.外部比较器-Comparator接口

    需要新建一个专门用于比较的类实现Comparator接口,传入2个对象,自定义前对象与后对象比较内容,得到前对象与后对象的位置差,为正则表示前对象排在后对象之后,为负则表示前对象排在后对象之前;

  在外部比较器不参与时,元素比较使用内部比较器;当外部比较器参与比较则内部比较器失效.

学习-集合框架