LinkedList
-
简介:
双链表实现了List和Deque接口。 实现所有可选列表操作,并允许所有元素(包括null )。
所有的操作都能像双向列表一样预期。 索引到列表中的操作将从开始或结束遍历列表,以更接近指定的索引为准。 -
方法:
- void addFirst(E e) :在该列表开头插入指定的元素。
- void addLast(E e) :将指定的元素追加到此列表的末尾。
- E get(int index) :返回此列表中指定位置的元素。
- E getFirst() :返回此列表中的第一个元素。
- E getLast() :返回此列表中的最后一个元素。
- E removeFirst() :从此列表中删除并返回第一个元素。
- E removeLast() :从此列表中删除并返回最后一个元素。
- int size() :返回此列表中的元素数
LinkedList list = new LinkedList();
list.addFirst("a");
list.addFirst("b");
list.addFirst("c");
list.addFirst("d");
list.addLast("e");
System.out.println(list);
System.out.println(list.getFirst());
System.out.println(list.getLast());
System.out.println(list.removeFirst());
System.out.println(list.removeLast());
System.out.println(list.get(1));
System.out.println(list);
- 案例:使用LinkedList来模拟栈
public class Stack {
private LinkedList list = new LinkedList(); //创建LinkedList对象
public void in(Object obj) {
list.addLast(obj); //封装addLast()方法
}
public Object out() {
return list.removeLast(); //封装removeLast()方法
}
public boolean isEmpty() {
return list.isEmpty(); //封装isEmpty()方法
}
}
泛型
推荐两个链接:
- https://blog.csdn.net/gyhgyh12345/article/details/86078349?ops_request_misc=&request_id=&biz_id=&utm_source=distribute.pc_search_result.none-task-blog-1blogbaidu_landing_v1~default-2
- https://blog.csdn.net/u011275346/article/details/103850568?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158689713619195239859901%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158689713619195239859901&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-1blogdefault~default-1
总的来说泛型就是java为了避免类型转换异常和安全创造出来的,当你写代码的时候泛型就会报错,避免了类型不匹配导致的错误问题
for循环增强
- 简化数组和Collection集合的遍历
- for(元素的数据类型:需要遍历元素的数组名)
int[] arr = {1,2,3,4};
for(int i:arr){
System.out.println(i);
}
数组转集合
- Array对象的aslist() 方法
//Arrays中的asList方法:数组转换成集合(不能增加或减少元素)
//数组转换成集合必须使用引用数据类型
String[] str = {"a","b","c","d"};
List<String> list1 = Arrays.asList(str);//将数组转换成集合
System.out.println(list1);
- 集合转数组
//当集合转数组时,如果集合长度大于数组长度,那转换后的数组长度就等于集合长度
//如果数组长度大于集合长度,那么分配的数组长度就等于你指定的数组长度一样
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
String[] arr = list.toArray(new String[0]);
for (String str : arr) {
System.out.println(str);
}
Set集合
- 简介:
不包含重复元素的集合。 更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。 正如其名称所暗示的那样,这个接口模拟了数学集抽象。 - 方法:跟Collection的方法大致相同
- 特点:无索引,无重复,无序(存取顺序不一样)
HashSet
- 简介:
此类实现Set接口,由哈希表(实际为HashMap实例)支持。 对集合的迭代次序不作任何保证; 特别是,它不能保证订单在一段时间内保持不变。 这个类允许null元素。 - 方法:
- boolean add(E e) :将指定的元素添加到此集合(如果尚未存在)。
- void clear() :从此集合中删除所有元素。
- boolean contains(Object o) :如果此集合包含指定的元素,则返回 true 。
- boolean isEmpty() :如果此集合不包含元素,则返回 true 。
- Iterator iterator() :返回此集合中元素的迭代器。
- boolean remove(Object o) :如果存在,则从该集合中删除指定的元素。
- int size() :返回此集合中的元素数
- HashSet如何保证元素唯一性的原理
例子:
HashSet<Person> hs = new HashSet<>();
hs.add(new Person("zjf",23));
hs.add(new Person("zjf",23));
hs.add(new Person("gzq",24));
hs.add(new Person("gzq",24));
hs.add(new Person("gzq",24));
System.out.println(hs.size());//6
当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象
* 1. 如果没有哈希值相同的对象就直接存入集合
* 2. 如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存
- LinkedHashSet:
- 哈希表和链表实现了Set接口,具有可预测的迭代次序。 这种实现不同于HashSet,它维持于所有条目的运行双向链表。 该链表定义了迭代排序,它是将元素插入集合(插入顺序 ) 的顺序 。 请注意,如果一个元件被重新插入到组插入顺序不受影响 。
- 特点:底层是链表实现的,可以保证怎么存就怎么取,因为是HashSet的子类,也可以保证元素唯一性。
TreeSet集合
- 是用来对元素进行排序的,也同样可以保证元素唯一。
- 当他存储自定义对象的时候,如果自定义对象没有重写CompareTo方法时,会报错
例子:
//当compateTo方法返回0的时候集合中只有一个元素
//当compateTo方法返回正数的时候集合中会怎么存怎么取
//当compateTo方法返回负数的时候集合中怎么存会倒序存储
TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person("zjf",23));
ts.add(new Person("gzq",24));
ts.add(new Person("wrq",25));
ts.add(new Person("xxp",26));
System.out.println(ts);
3. 特点
* TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
* 使用方式
* 自然顺序(Comparable)
* TreeSet类的add()方法中会把存入的对象提升为Comparable类型
* 调用对象的compareTo()方法和集合中的对象比较
* 根据compareTo()方法返回的结果进行存储
* 比较器顺序(Comparator)
* 创建TreeSet的时候可以制定 一个Comparator
* 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
* add()方法内部会自动调用Comparator接口中compare()方法排序
* 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
* 两种方式的区别
* TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
* TreeSet如果传入Comparator, 就优先按照Comparator