集合框架的体系及方法

目录

                                               框架架构图

Collections集合框架

1.List接口

2.Set接口

2.1 HashSet集合特点:

2.2 TreeSet类:

3. Map接口

4. Map、Set、List的简单实用

4.1 三者之间的区别

4.2 三者的查询数据方法

4.3 Map的使用方法

4.4 set集合的使用方法

4.5 list集合的使用方法

4.6 迭代器遍历

4.7 使集合框架中线程变成同步

4.8 Map集合的功能

4.9.0 快速遍历Map集合的方法

4.9.1  void  clear():删除该Map对象中所有的键值对

4.9.2  boolean  containsKey(Object key) :查询Map中是否包含指定key。

4.9.3 boolean  containsValue(Object value):查询Map中是否包含一个或多个value。

4.9.4 Set  entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象。

4.9.5 Object  get(Object obj):返回指定key所对应的value。如果没有,这返回null。

4.9.6 boolean  isEmpty():查询该Map是否为空,如果为空则返回true。

4.9.7 Set  keySet():返回该Map中所有key组成的Set集合。

4.9.8 Object  put(Object key, Object value):添加一个键值对,如果当前Map中已经有一个与该key相等的键值对,则新的键值对将覆盖原来的键值对。

4.9.9 void  putAll(Map  m):将指定Map中的键值对复制到m中

4.9.10 Object  remove(Object  key):删除指定key所对应的键值对,如果不存在,则返回null。

4.9.11 int   size():返回Map里的键值对个数。

4.9.12 Collection  values():返回该Map里所有的vlaue组成的Collection。

5.0 Map中包括一个内部类Entry。该类封装了一个键值对。

5.1 Map接口中的子类--可以将数据存储在本地 (Properties类)

5.2 SortedMap接口和TreeMap实现类

5.3 写compareTo规则

第一种方法:

第二种写法(jdk 8新特性)

5.4 IdentityHashMap实现类

5.5 Collections提供了如下几个方法对List集合元素进行排序

5.6 Collections还提供了如下用于查找、替换集合元素的常用方法

5.7 设置不可变集合


 


                                               框架架构图


Collections集合框架

1.List接口

Vector:使用比较久的子类,线程安全,同步,有序不唯一的特征,使用数组的存储结构

Stack:堆栈

LinkedList:线程不安全,不同步,无序不唯一,使用链表存储结构

ArrayList:替代Vector,线程不安全,不同步

2.Set接口

2.1 HashSet集合特点:

(1)不能保证元素的排列顺序,顺序有可能发生变化。

(2)HashSet不是同步的,如果多个线程同时访问一个HashSet,如果有2条或2条以上线程同时修改HashSet集合时,必须通过代码实现线程同步。

(3)集合元素值可以是null。

向HastSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值来决定该对象在HashSet中存储位置。如果有两个元素通过equals方法比较返回true,但它们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同的位置,就可以添加成功(简单的理解HastSet集合判断两个元素是否相等的标准是两个对象通过equals方法比较相等,且两个对象的hashCode()方法返回的值也要相等)。

 

2.2 TreeSet类:

TreeSet是SortedSet接口的唯一实现,TreeSet可以确保集合元素处于排序状态

3. Map接口

键值对,键唯一值不唯一,无序

HashMap  HashTable  TreeMap

HashMap:线程不安全

HashTable:线程安全

TreeMap:结果是按照字母表的顺序进行存储的

4. Map、Set、List的简单实用

4.1 三者之间的区别

答: LIst:有序(包含下标)不唯一(数据可以重复)

Set: 无序(不包含下标)唯一(数据不可以重复)

Map:键值对,键唯一值不唯一

4.2 三者的查询数据方法

答: List:for循环,foreach遍历,迭代器

Set:迭代器,foreach遍历

Map:只能通过keySet()获得所有键、values()获得所有值,Map.Entry<>

4.3 Map的使用方法

4.4 set集合的使用方法

4.5 list集合的使用方法

4.6 迭代器遍历

4.7 使集合框架中线程变成同步

同步控制

Collections类提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程安全问题。

案例:

/*
* 同步控制
*/
//可以当ArrayList使用
Collection<String> c = Collections.synchronizedCollection(new ArrayList<>());
//可以当Set集合使用
Collection<Object> s = Collections.synchronizedCollection(new HashSet<>());

List<Object> list =Collections.synchronizedList(new ArrayList<Object>());

Set<Object> set = Collections.synchronizedSet(new HashSet<>());

Map<String,Object>map=Collections.synchronizedMap(new HashMap<String,Object>());

4.8 Map集合的功能

4.9.0 快速遍历Map集合的方法

4.9.1  void  clear():删除该Map对象中所有的键值对

map2.clear();

4.9.2  boolean  containsKey(Object key) :查询Map中是否包含指定key。

//查询键是否已存在。。如果存在就返回true,不然返回false
//		boolean boo1 = map2.containsKey(11);
//		System.out.println(boo1);

4.9.3 boolean  containsValue(Object value):查询Map中是否包含一个或多个value。

//查询值是否已存在。。如果存在就返回true,不然返回false
//		boolean boo2 = map2.containsValue(xx);
//		System.out.println(boo2);

4.9.4 Set  entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象。

//查询map2中的全部键值对
//		Set<Entry<String, Student>> set2 = map2.entrySet();
//		for (Entry<String, Student> e2 : set2) {
//			System.out.println(e2);
//		}

4.9.5 Object  get(Object obj):返回指定key所对应的value。如果没有,这返回null。

//通过键得到元素
//		Student stu = map2.get(2);
//		System.out.println(stu);

4.9.6 boolean  isEmpty():查询该Map是否为空,如果为空则返回true。

//查询map集合是否为空,如果为空就返回true,不然返回为false
//		boolean boo3 = map2.isEmpty();
//		System.out.println(boo3);

4.9.7 Set  keySet():返回该Map中所有key组成的Set集合。

//返回所有的键
//		Set<Integer> set4 = map2.keySet();
//		for (Integer i : set4) {
//			System.out.println(i);
//		}

4.9.8 Object  put(Object key, Object value):添加一个键值对,如果当前Map中已经有一个与该key相等的键值对,则新的键值对将覆盖原来的键值对。

//添加值
		Map<Integer, Student> map2 = new HashMap<>();
		map2.put(1, new Student(1, "张三"));
		map2.put(2, new Student(2, "李四"));
		map2.put(3, new Student(3, "万五"));
		map2.put(4, new Student(4, "赵六"));
		map2.put(5, new Student(5, "承认"));

4.9.9 void  putAll(Map  m):将指定Map中的键值对复制到m中

		//将map2的数据复制到ma中
		Map<Integer , Student> ma = new HashMap<>();
		ma.putAll(map2);
		Set<Entry<Integer, Student>> set6 = ma.entrySet();
		for (Entry<Integer, Student> e6 : set6) {
			System.out.println(e6);
		}

4.9.10 Object  remove(Object  key):删除指定key所对应的键值对,如果不存在,则返回null。

//删除map中键为2的
		Student stu = ma.remove(2);
		System.out.println(stu);

4.9.11 int   size():返回Map里的键值对个数。

	//返回当前的键值对数
	int n = ma.size();
	System.out.println(n);

4.9.12 Collection  values():返回该Map里所有的vlaue组成的Collection。

//返回所有的value值
	Collection<Student> coll = ma.values();

5.0 Map中包括一个内部类Entry。该类封装了一个键值对。

(1)Object  getKey():返回该Entry里包含的key值。

(2)Object   getValue():返回该Entry里包含的value值。

(3)Object   setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。

		Set set7 = map2.entrySet();   //通过map点entrySet得到map集合的所有数据
		Iterator it = set7.iterator();	//通过得到的set集合点出迭代器
		while(it.hasNext()) {			//循环迭代器
			Map.Entry entry2 = (Entry) it.next();	//通过得到的数据得到Map的内部类Entry
			Object key = entry2.getKey();			//通过得到内部类Entry得到getKey()和getValue()
			Object value = entry2.getValue();
			entry2.setValue("11111");               //通过得到内部类设置元素的值
			System.out.println(key);                //输出键
			System.out.println(value);				//输出值
			System.out.println(entry2);				//输出所有的数据
		}

5.1 Map接口中的子类--可以将数据存储在本地 (Properties类

Properties类是Hashtable的子类。该对象在处理属性文件时特别方便。Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的键值对写入属性文件,也可以把属性文件中的属性名=属性值加载到Map对象中。由于属性文件中的属性名和属性值只能是字符串类型,所以Properties里的key和value都是字符串类型。Properties提供的常用方法:

(1)String getProperty(String key):获取Properties中指定属性名对应的属性值,类似于Map的get方法。

(2)String getProperty(String key, String defaultValue):该方法与上面的方法基本类似,如果Properties中不存在指定的key值,该方法返回默认值。

(3)Object setProperty(String key,String value):设置属性值,类似Hashtable的put方法。

(4)void load(InputStream inStream):从属性文件(以输入流表示)中加载属性名=属性值,把加载到的属性名=属性值对追加到Properties里。

(5)void store(OutputStream out,String comments):将Properties中的键值对写入指定属性文件(以输出流表示)。

Test.txt文件的内容为:

#aa

#Fri May 04 21:36:47 CST 2018

\u738B\u4E94=\u597D\u597D\u52A0\u6CB9\u5427

22=\u6211\u6C38\u8FDC\u5C5E\u4E8E\u4F60\uFF09

\u5F20\u4E09=\u559C\u6B22\u4F60

123=\u9EC4\u6021\u6211\u559C\u6B22\u4F60

\u674E\u56DB=\u8FD8\u662F\u559C\u6B22\u4F60

Properties还可以把键值对以XML文件的形式保存,也可以从XML文件中加载属性名-属性值。  --没测试过

//		//向Properties中添加属性
//		prop.setProperty("张三", "喜欢你");
//		prop.setProperty("李四", "还是喜欢你");
//		prop.setProperty("王五", "好好加油吧");
//		prop.setProperty("123", "\u9EC4\u6021\u6211\u559C\u6B22\u4F60");
//		prop.setProperty("22", "\u6211\u6c38\u8fdc\u5c5e\u4e8e\u4f60\uff09");
//		try {
//			//将Properties对象存入本地文件中
//			prop.store(new FileOutputStream("E:\\test.txt"), "aa");
//			//实例化一个Properties对象
//			Properties prop2 = new Properties();
//			//提取E:\\\\test.txt
//			prop2.load(new FileInputStream("E:\\test.txt"));
//			System.out.println(prop2);
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}

5.2 SortedMap接口和TreeMap实现类

Map接口和set接口一样,也派生出一个SortedMap子接口,TreeMap是SortedMap接口的实现类。与TreeSet类似,TreeMap也是基于红黑树对TreeMap中所有key进行排序,从而保证TreeMap中所有键值对处于有序状态。

TreeMap同样有两种排序方式:自然排序,定制排序。

TreeMap判断两个key相等的标准和TreeSet判断两个元素相等的标准是一样的。TreeMap提供的方法也和TreeSet的类似

通过TreeMap集合排序:

5.3 写compareTo规则

第一种方法:

//写TreeMap中的Comparator规则
Map<String, Student> map = new TreeMap<>(new Comparator<String>() {

		@Override
		public int compare(String o1, String o2) {
			// TODO Auto-generated method stub
			return o1.compareTo(o2);
		}
			
	});

第二种写法(jdk 8新特性)

Map<String,Student>map4 = new TreeMap<>((o1,o2)->o1.compareTo(o2));

 

5.4 IdentityHashMap实现类

IdentityHashMap和HashMap基本相似,但它在处理两个key相等时比较独特:在IdentityHashMap中,当且仅当两个key严格相等(key1==key2)时,IdentityHashMap才认为两个key相等,而HashMap,只要key1和key2通过equals比较返回true,并且他们的hashCode值相等才认为两个可以相等。

IdentityHashMap提供了与HashMap基本相似的方法,也允许使用null作为key和value。

EnumMap实现类

EnumMap是一个与枚举类一起使用的Map实现。EnumMap中所有key都必须是单个枚举类的枚举值。

EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑、高效。

EnumMap根据key的自然顺序(枚举值在枚举类中定义的顺序)来维护键值对的次序,

EnumMap不允许使用null作为key值,但允许使用null作为value。

5.5 Collections提供了如下几个方法对List集合元素进行排序

(1)static  void  reverse(List list):反转指定List集合中元素的顺序。

(2)static  void  shuffle(List list):对List集合元素进行随机排序。

(3)static  void  sort(List list):根据元素的自然顺序对指定List集合的元素按升序进行排序。

(4)static  void  sort(List list,Comparator c):根据指定Comparator产生的顺序对List集合的元素进行排序。

(5)static  void  swap(List list,int i,int j):将指定List集合中i处元素和j处元素进行交换。

(6)static  void  rotate(List list,int distance):当distance为正数时,将list集合的后distance个元素移到前面;当distance为负数时,将list集合中的前distance个元素移到后面。该方法不会改变集合的长度。

查找,替换操作

5.6 Collections还提供了如下用于查找、替换集合元素的常用方法

(1)static  int  binarySearch(List list,Object key):使用二分搜索法搜索指定List集合,以获得指定对象在List集合中的索引。记得必须保证List中的元素已经处于有序状态。

(2)static  Object max(Collection coll):根据元素的自然顺序,返回给定集合中最大元素。

(3)static  Object max(Collection coll,Comparator comp):根据指定Comparator产生的顺序,返回给定集合的最大元素。

(4)static  Object  min(Collection coll):根据元素的自然顺序,返回给定集合中最小元素。

(5)static  Object  min(Collection coll,Comparator comp):根据指定Comparator产生的顺序,返回给定集合的最小元素。

(6)static  void  fill(List list,Object obj):使用指定元素obj替换指定List集合中的所有元素。

(7)static  int frequency(Collection c,Object o):返回指定集合中等于指定对象的元素数量。

(8)static  int  indexOfSubList(List source,List targer):返回子List对象在母List对象中第一次出现的位置索引;如果母List中没有出现子List,返回-1。

(9)static  int  lastIndexOfSubList(List source,List targer):返回子List对象在母List对象中最后一次出现的位置索引;如果母List中没有出现子List,返回-1。

(10)static  boolean replaceAll(List list,Object oldVal,Object newVal):使用一个新值newVal替换List对象所有的旧值oldVal。

5.7 设置不可变集合

Collections提供了入下三类方法来返回一个不可以变的集合:

(1)emptyXxx():返回一个空的,不可以变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。

(2)singletonXxx():返回一个值包含指定对象(只有一个或一项元素)的,不可以变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。

(3)unmodifiableXxx():返回指定集合对象的不可变视图。此处的集合既可以是List,也可以是Set,还可以是Map。

//当给集合添加unmodifiablexxx方法之后变成不可改变的集合对象
Map<Integer, Student> map4 = Collections.unmodifiableMap(map2);
		 try {
			 map4.put(6, new Student(6, "陈八"));
		} catch (UnsupportedOperationException e) {
			// TODO: handle exception
			System.out.println("没添加进去");
		}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值