java学习笔记-集合类2

一、set集合类

不包含重复元素的集合
没有带索引的方法,所以不能用普通for循环索引遍历

1.1、哈希值

哈希值:是jdk根据对象的地址或字符串或者数字算出来的int类型的数值
特点:同一个对象多次调用hashCode()方法返回的哈希值是相同的
默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同

1.2、HashSet集合的特点

底层数据结构是哈希表
对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
没有带索引的方法,所以不能使用普通for循环遍历

1.3、LinkedHashSet集合

特点:哈希表和链表实现的set接口,具有可预测的迭代次序
由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
由哈希表保证元素唯一,也就是说没有重复的元素

1.4、TreeSet集合

元素有序,按照一定的规则进行排序,具体排序取决于构造方法
TreeSet():根据其元素的自然排序进行排序
TreeSet(Comparator comparator):根据指定的比较器进行排序
没有带索引的方法,所以不能使用普通for循环遍历
由于是set集合,所以不包含重复元素的集合

二、泛型

将类型由原来的具体的类型参数化,在使用/调用时传入具体的类型

2.1、泛型

泛型的定义格式:
<类型>:指定一种类型的格式。这里的类型可以看成是形参
<类型1、类型2、。。。>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参
将来具体调用时给定的类型可以看成是实参,并且实参的类型只能是引用数据类型
泛型的好处:
把运行时期的问题提前到了编译时期
避免了强制类型转换

2.2、泛型类

格式:修饰符 class 类名<类型>{}
范例:public calss Generic{}

2.3、泛型方法

格式:修饰符<类型>返回值类型 方法名(类型 变量名){}
范例:publicvoid show(T t){}

2.4、泛型接口

格式:修饰符 interface 接口名<类型>{}
范例:public interface Generic{}

2.5、类型通配符:<?>

List<?>:表示元素类型未知的List,它的元素可以匹配任何的类型
这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中
如果说我们不希望List<?>是任何泛型List的父类,只希望它代表某一类泛型List的父类,可以使用类型通配符的上限
类型通配符上限:<? extends 类型>
List<? extends Number>:它表示的类型是Number或者其他子类型
类型通配符下限:<? super 类型>
List<? super Number>:它表示的类型是Number或者其父类型

2.6、可变参数

格式:修饰符 返回值类型 方法名(数据类型… 变量名){}
范例:public static int sum(int… a){}
这里的变量其实是一个数组
如果一个方法由多个参数,包含可变参数,可变参数要放在最后

2.7、可变参数的使用

Arrays工具类中有一个静态方法:
public staticListasList<T… a>:返回由指定数组支持的固定大小的列表
List接口中有一个静态方法:
public staticListof<E… elements):返回包含任意数量元素的不可变列表
Set接口中有一个静态方法:
public staticSetof(E…elements):返回一个包含任意数量元素的不可变集合

三、Map集合

interface Map<K,V> K:键的类型;V:值的类型
将键映射到值的对象;不能包含重复的键;每个键可以映射带最多一个值
创建Map集合的对象:多态类是实现

3.1、Map集合的基本功能

V put(K key,V value)//将指定的值与该映射中的指定键相关联
V remove(Object key) //根据键删除键值对元素,并返回相对键值
void clear() //移除所有的键值对元素
boolean containsKey(Object key)//判断集合是否包含指定的键boolean containsValue(Object value)//判断集合是否包含指定的值
boolean isEmpty() //判断集合是否为空
int size() //集合的长度,也就是集合中键值对的个数

3.2Map集合的获取功能

V get(Objec key) //根据键获取值
SetkeySet() //获取所有键的集合
Collectionvalues()//获取所有值的集合

3.3Map集合的遍历

//获取所有键的集合,用keySet()方法实现
	Set<String> keyset = map.keySet();
	//遍历键的集合,获取到每一个键,用增强for实现
	for(String key : keyset)
	{
		//根据键去找值,用get(Object key)方法实现
		String value = map.get(key);
		System.out.println(key+","+value);
	}
//获取所有键值对对象的集合
Set<Map.Entry<String,String>> entrySet = map.entrySet();
//遍历键值对对象的集合,得到每一个键值对对象
for(Map.Entry<String, String> me : entrySet) {
	//根据键值对对象获取键和值
	String key = me.getKey();
	String value = me.getValue();
	System.out.println(key+","+value);
}

3.4、统计字符串中每个字符出现的个数

		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个字符串:");
		String line = sc.nextLine();
		
//		HashMap<Character,Integer> hm = new HashMap<Character,Integer>();
		TreeMap<Character,Integer> hm = new TreeMap<Character,Integer>();
		//遍历字符串,得到每一个字符
		for(int i = 0; i < line.length();i++) {
			char key = line.charAt(i);
			
			//拿得到的每一个字符作为键到HashMap集合中找对应的值,看其返回值
			Integer value = hm.get(key);
			
			if(value == null) {
				//如果返回值是null;说明该字符在HashMap集合中不存在
				hm.put(key,1);
			}
			else {
				value++;
				hm.put(key, value);
			}
		}
		
		StringBuilder sb = new StringBuilder();
		Set<Character> keySet = hm.keySet();
		for(Character key : keySet) {
			Integer value = hm.get(key);
			sb.append(key).append("(").append(value).append(")");
		}
		String result = sb.toString();
		System.out.println(result);

四、Collections

针对集合操作的工具类

4.1、常用的方法

public static<T extends Comparable<?super T>>void sort(Listlist):将指定的列表按升序排序
public static void reverse(List<?>list):反转指定列表中元素的顺序
public static void shuffle(LIst<?>list):使用默认的随机源随机排列指定的列表

		List<Integer> list = new ArrayList<Integer>();
		list.add(10);
		list.add(30);
		list.add(15);
		list.add(25);
//		Collections.sort(list);
//		Collections.reverse(list);
		Collections.shuffle(list);
		System.out.println(list);

4.2、ArrayList存储学生对象并排序

		ArrayList<Student> list = new ArrayList<Student>();
		
		//创建学生对象
		Student s1 = new Student("张三",28);
		Student s2 = new Student("李四",19);
		Student s3 = new Student("王五",25);
		Student s4 = new Student("王小五",25);
		
		//把学生添加到集合
		list.add(s1);
		list.add(s2);
		list.add(s3);
		list.add(s4);
		
		//使用Collections对Arraylist集合排序
		Collections.sort(list,new Comparator<Student>(){
			
			public int compare(Student s1,Student s2) {
				//按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
				int num = s1.getAge() - s2.getAge();
				int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
				return num2;
			}
		});
		
		//遍历集合
		for(Student s : list) {
			System.out.println(s.getName()+","+s.getAge());
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王不叫小王叭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值