Collection详解

一张图

[外链图片转存失败(img-Goi31IRj-1564662892841)(D:\360MoveData\Users\万达爷\Desktop\码歌学习\7-29\集合.png)]

泛型

1:什么是泛型?

广泛的类型 也是一种数据类型 而这种数据类型可以是任意类型 编写过程当中不能确定该类型
创建对象时可以指定泛型的具体类型

2:

泛型是编译期行为,只能在编译器有效如果能够跨过编译期 那么泛型就没有任何意义

泛型类

如何定义泛型类
在类后加<> 括号中编写任意长度任意字符 不能是数值
一般情况下我们通过大写的26个字母去声明当前泛型 T type E element

泛型类<具体类型> 变量名 = new 泛型类<>();
泛型接口

实现类实现泛型接口时不指定泛型类型 此时创建实现类对象是可以指定泛型类型
class UserServiceImpl implements UserService
实现类实现泛型接口时指定泛型类型 那么将确定泛型类型
class UserServiceImpl implements UserService

泛型方法

方法中使用泛型 该方法就是一个泛型方法
静态方法无法使用泛型类中声明的泛型类型 因为泛型类型的确定是创建对象时确定的
而静态方法是先于对象存在的 ,如果要使用,在当前静态方法上声明泛型类型
public static <泛型类型> vaid 方法名()

public class Test {
	public static void main(String[] args) {
		//使用泛型类
		Genric<Integer> g = new Genric<Integer>();//对于当前g对象而言 它的泛型E的类型是String
		g.add(123);//参数只能是integer类型
		
		//声明泛型类 不指定泛型的具体类型
		Genric g1 = new Genric();
		g1.add("123");// 此时泛型E的类型是String
		g1.add(1);//此时泛型类型是Integer
		Genric.fun("123");
	}
}

迭代器

Iterable 是java.lang包下的接口 实现改接口都能够作为foreach的目标

Iterator 是java.util包下的接口 迭代器 用来迭代当前集合对象的

Iterator 是一个接口 ArrayList中通过内部类完成了对于改接口的实现 获取的其实是实现类对象

比较器:

外部比较器:

​ java.util.Compartor接口指定的。

​ 如果要使用外部比较器,实现该接口 重写compare方法
​ 自定义排序规则 可以随着业务扩展随时变化的

内部比较器

​ java.lang.Comparable接口指定

​ 如果要使用内部比较器,实现该接口 重写compareTo方法
​ 不利于后期扩展

collection接口

存储元素的特点 无序 可重复 对于所有的集合框架中的对象 只能存储引用类型

添加元素

add(Object) 添加元素 返回是否添加成功 true/false

addAll(Coll) 添加一个集合

删除元素

clear()清空所有元素

remove()移除一个

removeAll(Coll) 移除交集

retainAll(Coll) 保留交集

修改元素

没有修改元素

查看元素

isEmpty

size

contains

containsAll

package com.mage.collectio.lian;
import java.util.ArrayList;
import java.util.Collection;

public class Test01 {
	public static void main(String[] args) {
		Collection coll = new ArrayList();
		coll.add("玛利亭");
		coll.add(2);
		System.out.println(coll);
		Collection coll2 = new ArrayList();
		coll2.add("肖立亭");
		coll2.add("java");
		
		System.out.println(coll.addAll(coll2));
		System.out.println(coll);
		
		//coll.clear();
		System.out.println(coll.remove("java"));
		System.out.println(coll.removeAll(coll2));
		System.out.println(coll.retainAll(coll2));
		System.out.println(coll);
        
		System.out.println("查看当前集合是否为null:"+coll.isEmpty());
		System.out.println("查看当前集合元素个数:"+coll.size());
		System.out.println("查看当前集合是否包含元素2:"+coll.contains(2));
	}
}

List接口

有序 可重复 可以是null值

定义:

public interface List extends Collection

常见方法:

增加:add(index,obj) add(obj) addAll(Coll) addAll(index,coll)
删除:remove(index/obj) clear() removeAll(Coll) retainAll(coll)
修改: set(index,obj)
查看:indexOf(obj) lastIndexOf(obj) subList(sindex,eindex)
isEmpty() get(index) size() contains(obj) contaisAll(coll)
迭代:
普通for 增强for 迭代器(iterator[不能支持并发修改] listIterator[支持并发修改])

package com.mage.collection;
import java.util.ArrayList;
import java.util.List;

public class Test03 {
	public static void main(String[] args) {
		//创建对象
		List ls = new ArrayList()
		//添加元素
		ls.add(1);
		ls.add(1, "李四");//无返回值
		ls.add(2);  //[1,李四,2]
		ls.add("嘿嘿");
		//删除操作
		ls.remove(Integer.valueOf(1));// int   Object
		//修改
		ls.set(0, "嘿嘿");
		//查看元素
		System.out.println("为null判定:"+ls.isEmpty());
		Object obj = ls.get(0);
		System.out.println("查看指定位置上的元素:"+obj);
		System.out.println(ls);
		List newLs = ls.subList(0, 1);
		System.out.println(newLs);
		System.out.println("查询指定元素的所有:"+ls.indexOf(2));
		System.out.println("查询指定元素的索引(最后一次):"+ls.lastIndexOf("嘿嘿"));
		System.out.println("元素个数:"+ls.size());	
	}
}
package com.mage.collection.lian;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class TestList {
	public static void main(String[] args) {
		List<String> li = new ArrayList<String>();
		li.add("光阴");
		li.add("天地玄黄");
		li.add("呵呵");
		System.out.println("普通for循环");
		for(int i = 0;i<li.size();i++) {
			System.out.println(li.get(i));
		}
		for(String str:li) {
			System.out.println(str);
		}
		System.out.println("正序迭代:");
		ListIterator it = li.listIterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		System.out.println("逆序迭代:");
		while(it.hasPrevious()) {
			System.out.println(it.previous());
		}
	}
}

Set接口

无序 唯一

定义:

public interface Set extends Collection

常见方法:

​ add 、clear、remove、addAll、removeAll、retainAll、size、isEmpty、contains、
​ containsAll、iterator

迭代方法:

​ foreach、迭代器

迭代器接口:

​ Iterator 用来迭代元素
​ Iterable 可以作为foreach的目标

比较器

​ 内部比较器

​ 外部比较器

package com.mage.collection.lian;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Test01 {
	public static void main(String[] args) {
		Set<String> sets = new HashSet<String>();
		sets.add("万达爷");
		sets.add("万哥");
		sets.add("小平平");
		sets.add("吴姿");
		
		System.out.println(sets.add("小平平"));
		System.out.println(sets);
		System.out.println("迭代元素:");
		for(String str:sets) {
			System.out.println(str);
		}
		System.out.println("Iterator用for语句变种写法:");
		for(Iterator<String> it = sets.iterator();it.hasNext();) {
			System.out.println(it.next());
		}	
	}
}

Map接口

​ 数据: k-v 键值的方式存储
​ k:唯一 无序 (set) v 无序可重复 (collection)

常见方法:

​ put(k,v) get(k) containsKey(k) keySet()
​ remove(k) size() containsValue(v) values()

迭代方法:

​ 获取键 迭代键的过程中通过get方法获取值
​ for(Object key:keySet()){
​ sout(k+"="+map.get(k));
​ }
​ 获取Entry对象,通过getKey和getValue获取键和值

​ //获取entry对象

​ // 返回一个set集合 该集合中的每个元素都是 entry对象

​ Set<Entry<String, String>> kvs = mps.entrySet();

​ // 实际是 HashSet中的Node对象 因为Node实现了Map中的Entry接口

​ for(Entry<String, String> entry:kvs) {

​ System.out.println(entry.getKey()+"==="+entry.getValue());

​ }

ArrayList类

扩容2倍
底层: 数组
优缺点分析:通过索引获取元素以及迭代元素比较快 但是添加、删除很慢

常见方法:

增加:add(index,obj) add(obj) addAll(Coll) addAll(index,coll)
删除:remove(index/obj) clear() removeAll(Coll) retainAll(coll)
修改: set(index,obj)
查看:indexOf(obj) lastIndexOf(obj) subList(sindex,eindex)
isEmpty() get(index) size() contains(obj) contaisAll(coll)

迭代:

普通for 增强for 迭代器(iterator[不能支持并发修改] listIterator[支持并发修改])

package com.mage.collection;
import java.util.ArrayList;
import java.util.Iterator;
public class Test08 {
	public static void main(String[] args) {
		ArrayList<String> ls = new ArrayList<>();
		//添加元素
		ls.add("人在囧途");
		ls.add("扫毒");
		ls.add("七龙珠");
		ls.add(1,"头号玩家");
		for(int i = 0;i<ls.size();i++) {
			System.out.println(ls.get(i));
		}
		for(String str:ls) {
			System.out.println(str);
		}	
		for(Iterator<String> it = ls.iterator();it.hasNext();) {
			System.out.println(it.next());
		}	
	}
}
LinkedList类
底层: 双向链表

优缺点: 添加、删除快 获取元素慢

常见方法:

和List一样多了一些头尾操作:
查看 getFirst getLast element头 peek peekFirst peekLast
删除 poll pollFirst pollLast removeFirst removeLast
添加 offer offerFirst offerLast addFirst addLast

package com.mage.collection;
import java.util.LinkedList;
public class Test09 {
	public static void main(String[] args) {
		//1: 创建对象
		LinkedList<String> ls = new LinkedList<>();
		//2:添加元素
		ls.add("不知火舞");
		System.out.println(ls.get(0));	
		System.out.println(ls);
		ls.add("橘右京");
		ls.add("娜可露露");
		ls.add("宫本武藏");
		// 多了一些针对于头尾元素的操作
		ls.addFirst("草薙京");
		ls.addLast("八神庵");
		System.out.println(ls.offer("春丽"));//添加到末尾
		System.out.println(ls.offerFirst("春丽"));//添加到末尾
		System.out.println(ls.offerLast("春丽"));//添加到末尾
		System.out.println(ls);
		System.out.println(ls.element());//获取头元素
		System.out.println(ls.getFirst());
		System.out.println(ls.getLast());
		System.out.println(ls);
		//ls = null;
		System.out.println(ls.peekFirst());
		System.out.println(ls.peek());	
	}
}
Vectorl类

底层:数组 线程安全 速度慢 安全 1.5倍

HashSet类

底层: 数组+链表?
优缺点:添加、删除、修改效率都很高
常见方法:
add 、clear、remove、addAll、removeAll、retainAll、size、isEmpty、contains、
containsAll、iterator
迭代方法:
foreach、迭代器
注意事项:
hashset存储自定义对象时一定要重写hashcode和equals方法。

package com.mage.collection.hashset;
import java.util.HashSet;
import java.util.Set;
public class Test02 {
	public static void main(String[] args) {
		HashSet<User> sh = new HashSet<>();
		sh.add(new User(10,"肖狗"));
		sh.add(new User(9,"hanhan"));
		sh.add(new User(8,"建狗"));
		System.out.println(sh);
	}
}
class User{
	private int money;
	private String name;	
	public User() {
		// TODO Auto-generated constructor stub
	}
	public User(int money, String name) {
		super();
		this.money = money;
		this.name = name;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "User [money=" + money + ", name=" + name + "]";
	}	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + money;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (money != other.money)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}	
}

TreeSet:
底层: 树 红黑树 / 二叉树 / 平衡树
优缺点: 维护数据的大小 (有序) ,添加速度和删除速度高于ArrayList 比其他的都低
查询速度高于List 低于Hash。
如果对于存储的数据有 排序的要求,那么首选TreeSet。
常见方法:
add 、clear、remove、addAll、removeAll、retainAll、size、isEmpty、contains、
containsAll、iterator
多了一些针对于排序元素的操作 first last floor ceiling higher lower
迭代方法:
foreach、迭代器
注意事项:
如果存储的元素需要按照指定的需求进行排序,创建TreeSet对象时 指定比较器。
如果存在的元素是自定义对象:
1:要么自定义对象的所属类 实现了内部比较器Comparable接口 重写compareTo方法
2:要么创建TreeSet对象是 指定外部比较器Comparetor接口 重写compare方法
set中每个元素存储的时候 都是存储在一个map集合中 map集合的键是set中的元素, map中的值是自动添加的一个默认值

package com.mage.collection.treeset;

import java.util.Comparator;
import java.util.TreeSet;

public class Test01 {
	public static void main(String[] args) {
		TreeSet<String> set = new TreeSet<>(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				// TODO Auto-generated method stub
				return o2.length()-o1.length();
			}
		});
		set.add("史泰龙1");
		set.add("杰森斯坦森12");
		set.add("奥黛丽赫本123");
		set.add("小李子12");
		set.add("埃琳娜123");
		System.out.println(set);
	}

}
HashMap类

​ 计算key值
​ 底层: 数组+链表?
​ 优缺点:添加、删除、修改效率都很高
​ 存储自定义对象作为键时 要保证当前自定义类重写hashcode和equals方法
​ 什么情况下要重写,当前两个对象的属性相同 我们觉得是同一个对象 此时要重写。

TreeMap类

​ 计算key
​ 底层:红黑树
​ 优缺点: 维护数据的大小 (有序) ,添加速度和删除速度高于ArrayList 比其他的都低
​ 查询速度高于List 低于Hash。
​ 如果对于存储的数据有 排序的要求,那么首选TreeMap。
​ 如果存储的元素需要按照指定的需求进行排序,创建TreeMap对象时 指定比较器。
​ 如果存在的元素是自定义对象:
​ 1:要么自定义对象的所属类 实现了内部比较器Comparable接口 重写compareTo方法
​ 2:要么创建TreeMap对象是 指定外部比较器Comparetor接口 重写compare方法

package com.mage.map;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
public class Test03 {
	public static void main(String[] args) {
		TreeMap<String,Integer> ts = new TreeMap<>();
		ts.put("balabala小魔仙",30 );
		ts.put("z jake",136 );
		ts.put("yakamaka 花园宝宝", 45);
		System.out.println(ts);
		System.out.println("查找大于或等于给定元素的最小元素:"+ts.ceilingKey("p"));
		System.out.println("查找大于或等于给定元素的最小元素:"+ts.ceilingEntry("p"));
		Set<String> sets = ts.keySet();
		for(String key:sets) {
			System.out.println(key+"="+ts.get(key));
		}
		Set<Entry<String, Integer>> kvs = ts.entrySet();
		for(Entry<String, Integer> entry:kvs) {
			System.out.println(entry.getKey()+"="+entry.getValue());
		}	
	}
}
Arrays类

​ 针对数组

Collections类

​ 针对集合操作

30 );
ts.put(“z jake”,136 );
ts.put(“yakamaka 花园宝宝”, 45);
System.out.println(ts);
System.out.println(“查找大于或等于给定元素的最小元素:”+ts.ceilingKey(“p”));
System.out.println(“查找大于或等于给定元素的最小元素:”+ts.ceilingEntry(“p”));
Set sets = ts.keySet();
for(String key:sets) {
System.out.println(key+"="+ts.get(key));
}
Set<Entry<String, Integer>> kvs = ts.entrySet();
for(Entry<String, Integer> entry:kvs) {
System.out.println(entry.getKey()+"="+entry.getValue());
}
}
}


#### Arrays类

​                针对数组

#### Collections类

​		针对集合操作





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MyBatis中,association和collection是resultMap属性中用于定义关联对象和集合对象映射规则的元素。 1. association:用于定义关联对象的映射规则。它可以在一个resultMap中嵌套另一个resultMap,以实现对象之间的关联映射。常见的应用场景是一对一的关联关系。 association元素可以包含以下属性: - property:指定关联对象在Java对象中的属性名。 - column:指定关联字段在数据库中的列名。 - resultMap:指定关联对象的resultMap,用于定义关联对象的映射规则。 示例: ```xml <resultMap id="userResultMap" type="User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <association property="role" resultMap="roleResultMap"/> </resultMap> ``` 2. collection:用于定义集合对象的映射规则。它可以将查询结果中的多行数据映射为一个集合对象,常见的应用场景是一对多的关联关系。 collection元素可以包含以下属性: - property:指定集合对象在Java对象中的属性名。 - ofType:指定集合元素的类型。 - column:指定关联字段在数据库中的列名。 - resultMap:指定集合元素的resultMap,用于定义集合元素的映射规则。 示例: ```xml <resultMap id="orderResultMap" type="Order"> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> <collection property="items" ofType="OrderItem" resultMap="orderItemResultMap"/> </resultMap> ``` 通过使用association和collection元素,我们可以定义复杂的对象关系映射,使查询结果能够直接转换为Java对象及其关联对象或集合对象。这样可以方便地进行对象间的关联查询和数据封装。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值