目录
一、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());
}