【黑马程序员】Java基础07:集合框架与典型应用

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


一、集合类

集合类的由来:Java语言中对事物的体现都是以对象的形式,为了方便对多个对象进行操作,就定义一个容器对这些对象进行存储。集合就是存储对象最常用的一种方式。对象里面封装数据,集合里面封装对象。

 

集合和数的区别

1数组中可以存储基本数据类型和对象类型;集合中只能存储对象类型

2数组的长度是固定的;集合的长度是可变的

3数组中存储的数据类型必须一致;集合可以存储不同类型的对象

4在遇到不明确对象数量和类型的情况下,可以选择用集合存储。

 

二、集合框架

Java中定义了很多集合,每种集合存储数据的方式不同,将其中共性的内容不断的向上抽取,就形成了集合框架。如图所示:

         


为什么会出现这么多的集合容器呢?

因为每一个容器对数据的存储方式都有不同,这个存储方式称之为"数据结构"

 

三、集合中的常用接口

常用接口:Collection、List、Map、SetIterator等,各自的特点如下。

Collection是集合框架的一个顶层接口,它里面定义了单列集合的共性方法。存储元素是无序的,可以重复的对象

 

List:继承Collection接口,元素是有序的,对元素都有定义索引,元素可以重复;

常用实现类:

ArrayList:底层使用的是数组结构;特点:查询速度很快,但增删稍慢,线程不同步;

LinkedList:底层使用的是链表数据结构;特点:增删速度很快,查询稍慢,线程不同步;

Vector:底层使用的是数组结构;特点:早期提供的方法,增删速度慢,线程同步。

package blog.itheima;

//代码示例:在ArrayList中添加元素,并演示泛型,进行for循环和迭代,以及高级for循环
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ArrayListTest {

	public static void main(String[] args) {
		addInteger();
		addClass();
	}

	public static void addClass() {
		List<Person> list = new ArrayList<Person>();
		//此处需要注明元素的类型,1.5的泛型机制
		list.add(new Person("lucy",25));
		list.add(new Person("Mike",28));
		list.add(new Person("Lily",22));
		//演示迭代器,也要注明元素类型
		Iterator<Person> it = list.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
			/*打印结果
			name=lucy, age=25
			name=Mike, age=28
			name=Lily, age=22
			*/
		}
		//高级for循环:for(迭代的元素类型  变量名 : 集合对象)
		for(Person person : list){
			System.out.println(person);
			//和以上结果一相同
		}
		//普通for循环
		for(int i=0; i<list.size(); i++){
			System.out.println(list.get(i));
		}
	}

	public static void addInteger() {
		List<Integer> list = new ArrayList<Integer>();
		for(int i=1; i<=10; i++){
			//往ArrayList集合中循环添加元素
			list.add(i);
		}
		System.out.println(list);
		//打印结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
		//高级for循环
		for(Integer inte : list){
			System.out.println(inte);
		}
	}
	
	//创建一个对象,让集合添加
	static class Person{
		private String name;
		private int age;
		
		Person(String name,int age){
			this.name = name;
			this.age = age;
		}
		
		public String toString() {
			return "name=" + name + ", age=" + age;
		}
	}
}

Set:继承Collection接口,元素是无序的,不可以添加重复元素;

常用实现类:

HashSet:底层数据结构是哈希表,通过hashCode和equals方法来保证元素的唯一性;也可以复写hashCode和equals方法自定义排序规则;其内部是一个只有Key的HashMap;线程不安全,存取速度快

TreeSet:底层数据结构是二叉树,通过compareTo方法来保证元素的唯一性;可以对元素进行自然排序,当元素不具备比较性时,不能存入TreeSet集合也可以自定义比较器覆盖compare()方法再存入;线程不安全的。

 

Map接口存储一组成对的键-值对象,提供key(键)到value(值)的映射Map中的key不要求有序,不允许重复(如果重复,key对应的value会有覆盖操作)value同样不要求有序,但允许重复。

常用实现类

HashTable:底层是哈希表数据结构,不可以存入null键和null值,该集合是线程同步的,JDK1.0就有的类,效率较低;

HashMap:底层是哈希表数据结构,可以存入null键和null值,该集合是线程不同步的,JDK1.2出现,效率高;

TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行自然排序

package blog.itheima;

//把Map集合转化成Set集合,再通过迭代取出元素
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

class HashMapTest {
	
	public static void main(String[] args) {
		Map<Integer,String> m = new HashMap<Integer,String>();
		m.put(01,"lucy01");
		m.put(02,"lucy02");
		m.put(03,"lucy03");
		m.put(04,"lucy04");

		//通过Map集合的entrySet方法,将map集合转化成Set集合再迭代
		Set<Map.Entry<Integer,String>> s = m.entrySet();
		Iterator<Map.Entry<Integer,String>> it = s.iterator();
		while(it.hasNext()){
			//通过迭代,取出Map集合中的映射关系Map.Entry
			Map.Entry<Integer,String> map = it.next();
			Integer s1 = map.getKey();
			String s2 = map.getValue();
			System.out.println((s1 + "---" + s2));
		}

		//通过Map集合的keySet方法,取出集合中key的Set集合
		Set<Integer> keyset = m.keySet();
		Iterator<Integer> iterator = keyset.iterator();
		while(iterator.hasNext()){
			Integer key = iterator.next();
			//通过Map集合的get(key)方法,得到对应的value值
			String value = m.get(key);
			System.out.println("key=" + key + "  value=" + value);
		}
	}
}

Iterator接口是对Collection进行迭代的迭代器。

ListIterator是Iterator的子接口,该接口只能通过List集合的ListIterator方法获取,是List集合特有的迭代器。因为Iterator迭代时只能对元素进行判断和取出等操作,如果想操作添加修改功能,就要用ListIterator

 

MapCollection的区别

1Map与Collection在集合框架中属并列存在

2、Map存储的是键值对

3、Map存储元素使用put方法,Collection使用add方法

4、Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素

5、Map集合中键要保证唯一性。

 

集合框架中的工具类

Collections

1是集合框架中的一个工具类,该类方法都是静态的;

2提供的方法中有可以对List集合进行排序、取出最大值最小值二分查找、反转打印、反转比较器等操作;

3通常常用的集合都是线程不安全的,因为要提高效率,如果多线程操作这些集合时,可以通过Collections中的同步方法将线程不安全的集合转换成安全的。

 

Arrays类

1用来操作数组的工具类,可对数组进行排序和搜索等各种方法

2可以将数组转成List集合对数组进行排序、二分查找等;将数组变成集合后,不可以使用集合的增删方法,因为数组的长度是固定的;

3、数组转集合时,如果数组中的元素是对象或者基本数据类型,会出现什么情况呢?

package blog.itheima;
//用代码说明:数组转集合时,如果数组中的元素类型不同的问题

import java.util.Arrays;
import java.util.List;

public class ArraysTool {

	public static void main(String[] args) {

		String[] arr1 = {"asd","abc","cbv","qwe"};
		List<String> listString = Arrays.asList(arr1);
		System.out.println(("contains: " + listString.contains("abc")));
		//list.add("qw"); 此代码会抛UnsupportedOperationException异常,数组变成集合后,不能使用集合的增删方法
		System.out.println("有"+listString.size()+"个元素");

		Integer[] arr2 = {1,3,4,6};
		System.out.println("有"+Arrays.asList(arr2).size()+"个元素");

		int[] arr3 = {1,3,4,6};
		System.out.println("有"+Arrays.asList(arr3).size()+"个元素");
		
/*		打印如下结果:
 		contains: true
		有4个元素
		有4个元素
		有1个元素
		
		总结:数组转集合时,如果数组中的元素都是对象,那么变成集合时,数组中的元素就会直接转成集合中的元素;如果数组中的元素都是基本数据类型(8种基本类型),那么会将该数组作为集合中的元素存在。
*/
	}
}


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子图书资源服务系统是一款基于 Java Swing 的 C-S 应用,旨在提供电子图书资源一站式服务,可从系统提供的图书资源中直接检索资源并进行下载。.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人系统开发经验充足,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(若有),项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注计算机领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能 【无积分此资源可联系获取】 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值