2020-12-19迭代器/compara自定义排序/Set集合接口/HashSet/TreeSet/LinkedHashSet/Map集合接口/HashMap/Hashtable/TreeMap

Vector中的迭代器

Iterator iterator()

		Vector depVector = dao.loadDepartments();
		if(depVector!=null//没有实例化
				&& !depVector.isEmpty()//数据为空
				) {//如果集合有数据
			
		
		Iterator iterator = depVector.iterator();
		//使用迭代器变量集合元素
		while(iterator.hasNext()) {
			Department dep = (Department)iterator.next();
			System.out.println(dep.getId()+"\t"+dep.getName());

重写comparator接口的compare方法来实现集合数据的排序

		Vector depVector = dao.loadDepartments();
		class ComparatorImp implements Comparator{

			@Override
			public int compare(Object o1, Object o2) {
				Department dep0 = (Department)o1;
				Department dep2 = (Department)o2;
				
				if (dep0.getCreateDate().getTime()>dep2.getCreateDate().getTime()) {
					return -1;
					
				}else if(dep0.getCreateDate().getTime()<dep2.getCreateDate().getTime())
					return 1;
				
				return 0;
			}
			
		}
		depVector.sort(new ComparatorImp());
		System.out.println("部门ID\t\t部门名称\t\t成立日期");
		
		for (int j = 0; j < depVector.size(); j++) {
			Department depRes = (Department)depVector.get(j);
			System.out.println(depRes.getId()+"\t\t"+
			depRes.getName()+"\t\t"+new SimpleDateFormat("yyyy-MM-dd").format(depRes.getCreateDate()));
		}

Set集合接口规范概述

Set接口继承自——Collection——Iterable
Iterable接口循环迭代方式访问集合中的数据元素,定义了唯一一个返回指向集合的Iterator迭代器。它主要通过foreach方式处理集合中的元素,任何其实现类都可以通过获取指向集合的迭代实现对集合的遍历。
Set接口只能存储不相等的对象,Set接口时数学Set的抽象描述,与ArrayList不同,它其中元素不带任何索引,不能使用索引方式访问集合中的元素。
Set接口通常追加,遍历元素比较慢,随机删除修改数据速度稍快。

Set集合方法规范

boolean add(Object e)
//随机添加数据
void clear()
boolean contains(Object o)
Iteratoriterator()
boolean remove(Object o)
int size()
boolean isEmpty()
Object[] toArray()

HashSet集合实现类

此类实现Set接口,有哈希表(实际上是一个HashMap实例)支持实现算法.HashSet不能保证Set集合元素的迭代顺序,也不能保证该顺序恒久不变。HashMap允许使用null元素。
HashSet实现不是线程同步的。如果在多个线程同时访问一个HashSet,应该做必要额外同步处理,HashSet由于不排序,通常执行效率比较高。

	/**
	 * 获取所有员工信息
	 */
	@Override
	public Set loadEmployee() {
		// TODO Auto-generated method stub
		return DateBase.getEmployeeTable();//返回员工集合Set对象
	}

使用Set接口的迭代器实现迭代

		DateBase.initEmployeeTable();
		Set empSet = empDao.loadEmployee();
		//获取Set接口的迭代器实现对集合元素的遍历
		Iterator iterator = empSet.iterator();
		System.out.println("Id\t\t"+"name"+"\t\t"+"mobilePhone"+"\t\t"+"depid");
		
		while (iterator.hasNext()) {//如果有下一个数
			Employee emp = (Employee)iterator.next();//迭代器要强制转换类型
			System.out.println(emp.getId()+"\t\t"+emp.getName()+"\t\t"+emp.getMobilePhone()+"\t\t"+new SimpleDateFormat("yyyy-MM-dd").format(emp.getBirth())+"\t\t"+emp.getDepId());

HashSet重载构造器

Set set = new HashSet(int a,int b )//a为初始容量a>=0,b为加载因子(扩展集合时按b扩展)b>0
Set集合接口不能存储相同的数据

	int capicaty = 5;
		Set set = new HashSet(capicaty);
		String name = "king";
		String name2 = "king";
		set.add(name);set.add(name2);set.add(null);
		System.out.println(set.size());
		System.out.println(name.equals(name2));
		for (Object e : set) {
			System.out.println(e);

TreeSet集合实现类

TreeSet是基于TreeMap的NavigableSet实现并实现SortenSet排序接口。默认按照元素的自然顺序(升序)对元素进行排序,或者根据创建set时提供的Commparetor进行排序。
TreeSet不是线程同步的。如果在多个线程同时访问一个TreeSet,必须做同步处理。
TreeSet由于需要进行排序,因此TreeSet比HashSet效率要低。

TreeSet集合常用方法

public TreeSet(Comparatorcomparator)
public IteratordescendingIterator()
//降序排序迭代器
public E last()
public E first()
TreeSet默认排序,descendingIterator反向迭代器

	TreeSet tree = new TreeSet();//用TreeSet的默认升序对元素进行排序
		tree.add(Integer.valueOf(34));
		tree.add(Integer.valueOf(20));
		tree.add(Integer.valueOf(30));
		tree.add(Integer.valueOf(40));
		tree.add(Integer.valueOf(50));
		
		for (Object e : tree) {
			System.out.println(e);
		}
		System.out.println("-------------");
		
		Iterator it = tree.descendingIterator();//获取迭代器(反向迭代集合中元素)
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		//去除第一个和最后有一个元素方法
		System.out.println("--------------");
		System.out.println(tree.first());
		System.out.println(tree.last());

TreeSet自定义排序应用

		TreeSet resSet =  new TreeSet(new Comparator() {

			@Override
			public int compare(Object o1, Object o2) {
				Employee emp0 = (Employee)o1;
				Employee emp1 = (Employee)o2;
				if (emp0.getBirth().getTime()>emp1.getBirth().getTime()) {
					return -1;
				}else if(emp0.getBirth().getTime()<emp1.getBirth().getTime()) {
					return 1;
				}
				
				return 0;
			}
			
		});
		Set tempSet = DateBase.getEmployeeTable();
		for (Object o : tempSet) {
			resSet.add(o);//添加到新的TreeSet集合中
		}
		return resSet;
	DateBase.initEmployeeTable();
		TreeSet resSet = empDao.loadEmployeeSort();
		
		for (Object o : resSet) {
			Employee emp = (Employee)o;
			System.out.println(emp.getId()+"\t"+emp.getName()+"\t"+new SimpleDateFormat("yyyy-MM-dd").format(emp.getBirth()));

LinkedHashSet集合实现类

基于哈希表和链接列表的Set接口的实现类,与HashSet无序集合相比,LinkedHashSet的迭代是一个可以被预知的访问操作,它以添加到集合中的顺序为迭代最终顺序。
由于LinkedHashSet需要维护元素顺序,因此效率比HashSet要稍低些。
在需要保证使用Set接口并按照存储顺序迭代时使用它。
LinkedHashSet按输入顺序迭代

		LinkedHashSet set = new LinkedHashSet();
		set.add(new Integer(250));
		set.add(new Integer(260));
		set.add(new Integer(911));
		set.add(new Integer(120));
		for (Object e : set) {
			System.out.println(e);

Map集合接口规范概述

Map接口是存储键值对像的顶级集合接口。存储在Map集合中的键值对象必须确保每个键是不重复的;对于相同的键对象在添加到Map中时会产生覆盖源键值对象操作。
在通常情况下Map通过一个唯一的键查找其对应的值对象,键和值必须同时成对出现,一个键对应一个值对象。
在很多情况下可以使用Map对象替代(如果需要)实体对象,这样可以在应用程序实体类比较多的情况下减少类的定义。

Map集合接口常用方法

Object put(Object key,Object value)
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
SetkeySet()
Collectionvalues()
boolean isEmpty()
V remove(Object key)
void clear()

HashMap集合实现类

HashMap是继承自AbstractMap间接实现Map接口的基本哈希表算法的Map接口的实现类。此实现提供所有可选的映射操作,允许使用null值和null键。HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap不是线程安全的,如果在多线程中使用必须在程序中处理同步问题。

HashMap构造器

public HashMap()
构造一个具有默认初始容量(16)和默认加载因子(0.75)的空HashMap

public HashMap(int initSize)
构造一个指定初始容量和默认加载因子的空HashMap

public HadaMap(int initSize,float loadFactor)
构造一个带指定初始容量和加载因子的空HashMap

使用键值对集合映射角色对象以减少系统应用中的类定义

Map接口中的put方法

public static void initRoles() {//initRoles方法用来创建2个Map类型的实例存储到roleMaps变量中
		
		Map roleMap0 = new HashMap();//创建系统角色
		roleMap0.put("id", new Integer(1001));
		roleMap0.put("roleName", "普通");
		roleMap0.put("status",new Integer(0));
		roleMap0.put("Describe", "普通系统用户");
		roleMaps.add(roleMap0);
		
		Map roleMap1 = new HashMap();//创建系统角色
		roleMap1.put("id", new Integer(1002));
		roleMap1.put("roleName", "普管");
		roleMap1.put("status",new Integer(0));
		roleMap1.put("Describe", "普通系统管理员用户");
		roleMaps.add(roleMap1);
	}
	public List loadList() {
		
		return DateBase.getRoleMaps();//从数据库中获取所有权限信息
	}

获取并显示所有系统中角色信息

Map接口中的get方法

		DateBase.initRoles();
		List roles = roleDao.loadList();
		System.out.println("权限ID\t权限名称\t权限描述");
		for (int i = 0; i < roles.size(); i++) {
			Map roleMap = (Map)roles.get(i);//获取每个Map对象
			
			Integer statusInt = (Integer)roleMap.get("status");
			System.out.println(roleMap.get("id")+"\t"+
			roleMap.get("roleName")+"\t"+
			(statusInt==0?"启用":"禁用")+"\t\t"+
			roleMap .get("Describe"));
		}

添加新角色到角色表中

	public boolean addRole(Map roleMap) {
		List roleList = DateBase.getRoleMaps();
		return roleList.add(roleMap);
	}
		Scanner scan = new Scanner(System.in);
		DateBase.initRoles();
		System.out.println("添加新角色请输入信息");
		System.out.println("请输入权限id");
		Integer id = new Integer(scan.nextInt());
		System.out.println("请输入权限名称");
		String name = scan.next();
		System.out.println("请输入权限说明");
		String descs = scan.next();
		
		Map newRole = new HashMap();
		newRole.put("id", id);
		newRole.put("roleName", name);
		newRole.put("status", new Integer(0));
		newRole.put("Describe", descs);
		
		roleDao.addRole(newRole);//添加新权限
		System.out.println("权限ID\t权限名称\t权限描述\t\t用户类型");
		List roles = roleDao.loadList();
		for (int i = 0; i < roles.size(); i++) {
			Map roleMap = (Map)roles.get(i);//获取每个Map对象	
		Integer statusInt = (Integer)roleMap.get("status");
		System.out.println(roleMap.get("id")+"\t"+
		roleMap.get("roleName")+"\t"+
		(statusInt==0?"启用":"禁用")+"\t\t"+
		roleMap .get("Describe"));
		}

对给定唯一标识的角色进行禁用修改

	public void disableRoleById(Integer roleId) {
		List roleList = DateBase.getRoleMaps();
		for (int i = 0; i < roleList.size(); i++) {
			Map temMap = (Map)roleList.get(i);//获取当前Map
			if (((Integer)temMap.get("id")).intValue() == roleId.intValue()) {
				temMap.put("status", 1);//设置当前权限被禁用
				break;
			}
		}
		
	}
		System.out.println("请输入被禁用的权限id");
		Integer id0 = new Integer(scan.nextInt());
		
		roleDao.disableRoleById(id0);

获取键、值、键值对集合

		Map map = new HashMap();
		map.put("a",new Long(1000));
		map.put(Integer.valueOf(18), "king");
		map.put(new Date(),new Object());
		
		//获取所有键
		Set keys= map.keySet();
		System.out.println(keys);
		//获取所有值
		Collection coll =  map.values();
		System.out.println(coll);
		//获取键值对集合
		Set keyAndValue = map.entrySet();
		System.out.println(keyAndValue);

Hashtable集合实现类

Hashtable类实现一个哈希表,该哈希表将键映射到相应的值。任何给null对象都可以用作键或值。
Hashtable与HashMap功能几乎是相同的,最大区别在于HashMap是非线程同步的,而Hashtable是线程同步的,在多线程中通常使用同步的Hashtable。
由于Hashtable要考虑线程同步问题,因此Hashtable执行效率要比HashMap低。在非多线程中提倡使用HashMap存储键值对象,从而提供性能。
Hashtable的键和值不能存储null;

		Map table = new Hashtable();
		Map hashMap = new HashMap();
		
		//table.put(null, "king");
		//table.put("king", null);
		hashMap.put(null, null);

TreeMap集合实现类

基于红黑树的NavigableMap实现。NavigableMap接口时SortedMap排序Map的子接口。
TreeMap基于树形结构的排序方式实现排序,TreeMap默认以键为依据采用自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法 由于排序,通常此类比HashMap效率要低。
TreeMap不是线程安全的,在多线程中必须手动处理同步问题。

		TreeMap tree = new TreeMap();//默认采用升序排序
		tree.put("b", "king");
		tree.put("a", "king2");
		tree.put("e", "king3");
		tree.put("x", "king4");
		
		System.out.println(tree);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值