Collections
1.是一个集合工具类
2.特点:方法私有,方法都是静态的
3.使用:类名直接调用
4.方法
static <T> boolean addAll(Collection<? super T> c, T... elements)
->批量添加元素
static void shuffle(List<?> list)
->将集合中的元素顺序打乱
static <T> void sort(List<T> list)
->将集合中的元素按照默认规则排序
static <T> void sort(List<T> list, Comparator<? super T> c)
->将集合中的元素按照指定规则排序
public class Demo01Collections {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
//static <T> boolean addAll(Collection<? super T> c, T... elements)->批量添加元素
Collections.addAll(list,"张三","李四","王五","赵六","田七","朱八");
System.out.println(list);
//static void shuffle(List<?> list) ->将集合中的元素顺序打乱
Collections.shuffle(list);
System.out.println(list);
//static <T> void sort(List<T> list) ->将集合中的元素按照默认规则排序-> ASCII码表
ArrayList<String> list1 = new ArrayList<>();
list1.add("c.举头望明月");
list1.add("a.床前明月光");
list1.add("d.低头思故乡");
list1.add("b.疑是地上霜");
Collections.sort(list1);
System.out.println(list1);
}
}
扩展方法:Arrays类中的方法,List asList(T...a)
直接指定元素,转存到list集合中
public static void main(String[] args) {
List<String> list = Arrays.asList("张三", "李四", "王五");
System.out.println(list);
}
泛型⭐⭐⭐⭐⭐
1.使用层面:统一类型,防止类型转换异常
注意:
a.泛型中的类型必须是引用类型
b.如果泛型不写,默认类型为Object
2.定义层面:
定义带有泛型的类,方法,接口,将来使用的时候给泛型确定什么类型,泛型就是什么类型,灵活,通用。
3.含有泛型的类
//含有泛型的类
public class 类名<E>{
}
//new 对象的时候确定类型
4.含有泛型的方法
修饰符 <E> 返回值类型 方法名(E e){
}
//调用方法的时候确定类型
5.含有泛型的接口
public interface 接口名<E>{
}
//1.在实现类的时候不确定类型,只能在new的时候确定类型
public interface MyList <E>{
public boolean add(E e);
}
public class MyArrayList1<E> implements MyList<E>{
//定义一个数组,充当ArrayList底层的数组,长度直接规定为10
Object[] obj = new Object[10];
//定义size,代表集合元素个数
int size;
/**
* 定义一个add方法,参数类型需要和泛型类型保持一致
*
* 数据类型为E 变量名随便取
*/
public boolean add(E e){
obj[size] = e;
size++;
return true;
}
/**
* 定义一个get方法,根据索引获取元素
*/
public E get(int index){
return (E) obj[index];
}
@Override
public String toString() {
return Arrays.toString(obj);
}
}
public class Demo04Genericity {
public static void main(String[] args) {
MyArrayList1<String> list1 = new MyArrayList1<>();
list1.add("张三");
list1.add("李四");
System.out.println(list1.get(0));
}
}
//2.在实现类的时候就确定类型
public interface MyIterator <E>{
E next();
}
public class MyScanner implements MyIterator<String>{
@Override
public String next() {
return "涛哥和金莲的故事";
}
}
public class Demo05Genericity {
public static void main(String[] args) {
MyScanner myScanner = new MyScanner();
String result = myScanner.next();
System.out.println("result = " + result);
}
}
6.泛型通配符
上限
<? extends 类型>
?接收的extends后面的本类以及子类类型
下限
<? super 类型>
?接收的是super后面的本类以及父类类型
set集合⭐⭐⭐⭐⭐
1.Hashset
特点
a.元素唯一
b.元素无序
c.线程不安全
d.无索引
底层数据结构:
哈希表
jdk8前 哈希表=数组+链表
jdk8后 哈希表=数组+链表+红黑树(红黑树为了查找更快)
方法
和Collection一样
遍历(没索引)
增强for
迭代器
2.LinkedHashSet(HashSet的一个子类)
特点
a.元素唯一
b.元素有序
c.线程不安全
d.无索引
底层数据结构
哈希表+双向链表
使用
和HashSet一样
3 set集合如何去重复
1.先计算元素的哈希值(重写hashCode方法),再比较内容(重写equals方法)
2.先比较哈希值,如果哈希值不一样,直接存
3.如果哈希值一样,再比较内容
a.如果哈希值一样,内容不一样,存
b.如果哈希值一样,内容也一样,去重复
4.HashSet存储自定义类型如何去重复
1.如果HashSet存储自定义类型,如何去重复呢?重写hashCode和equals方法,让HashSet比较属性的哈希值以及属性的内容
2.如果不重写hashCode和equals方法,默认调用的是Object中的,不同的对象,肯定哈希值不一样,equals比较对象的地址值也不一样,所以此时即使对象的属性值一样,也不能去重复
笔记来源 尚硅谷