学习-集合框架

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习-集合框架相关的知识,希望对你有一定的参考价值。

  集合:装东西的容器;

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

  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 = 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 = (String)values;
			System.out.println(strValue);
		}
	}

  四.集合工具

  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个对象,自定义前对象与后对象比较内容,得到前对象与后对象的位置差,为正则表示前对象排在后对象之后,为负则表示前对象排在后对象之前;

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

以上是关于学习-集合框架的主要内容,如果未能解决你的问题,请参考以下文章

代码片段 - Golang 实现集合操作

laravel特殊功能代码片段集合

Java集合框架学习笔记

java学习日记20230410-集合框架体系

Java学习笔记29(集合框架三:泛型)

Java集合源代码剖析Java集合框架