LinkedList实现类
ArrayList:数据结构:
物理结构:紧密结构
逻辑结构:线性表(数组)
LinkedList数据结构:
物理结构:跳转结构
逻辑结构:线性表(链表)
(链表:双向链表)
import java.util.LinkedList;
public class LinkedList_01 {
public static void main(String[] args) {
LinkedList<String> ls1 = new LinkedList<>();
// 可以添加重复元素
ls1.add("aaa");
ls1.add("bbb");
ls1.add("ccc");
ls1.add("eee");
ls1.add("fff");
ls1.add("bbb");
// System.out.println(ls1);
ls1.addFirst("jj");
ls1.addLast("lll");
// 添加元素在尾端
ls1.offer("zh");
// System.out.println(ls1);
ls1.offerFirst("rt");
ls1.offerLast("pp");
System.out.println(ls1);
// 删除元素首段
// ls1.poll();
// System.out.println(ls1);
// System.out.println(ls1.pollFirst());//删除首元素
// System.out.println(ls1.pollLast());//删除尾元素
// System.out.println(ls1.removeFirst());//删除首元素
// System.out.println(ls1.removeLast());//删除末尾元素
// System.out.println(ls1);
// ls1.clear();
// System.out.println(ls1.pollFirst());元素为空会显示null
// System.out.println(ls1.removeFirst());元素为空会报错
System.out.println("-------------------------------------");
// 普通for循环
/* for (int i = 0; i < ls1.size(); i++) {
System.out.println(ls1.get(i));
}*/
// 增强for循环
/*for (String s : ls1) {
System.out.println(s);
}*/
// 迭代器
/* Iterator it = ls1.iterator();
while (it.hasNext()){
System.out.println(it.next());
}*/
// 其他,节省内存
/*for (Iterator it = ls1.iterator();it.hasNext();) {
System.out.println(it.next());
}*/
}
}
链表
//节点类
public class Node {
// 三个属性
// 上一个元素的地址
private Node pre;
// 当前存入的元素
private Object obj;
// 下一个元素地址
private Node next;
public Node getPre() {
return pre;
}
public void setPre(Node pre) {
this.pre = pre;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
@Override
public String toString() {
return "Node{" +
"pre=" + pre +
", obj=" + obj +
", next=" + next +
'}';
}
}
public class MyLikedList {
// 链首节点
Node first;
// 链尾节点
Node last;
// 计数器
int count = 0;
public MyLikedList() {
}
public void add(Object o){//证明你添加的元素是第一个节点
if (first == null){
// 将添加的元素封装为一个Node对象
Node n = new Node();
n.setPre(null);
n.setObj(o);
n.setNext(null);
// 当前链表中的第一个节点为n
first = n;
// 当前链表中最后一个节点为n
last = n;
}else{
// 证明已经不是链表中的第一个节点
// 将添加的元素封装为一个Node对象
Node n = new Node();
n.setPre(last);//n的上一个节点一定是当前链中的最后一个节点
n.setObj(o);
n.setNext(null);
// 当前链中的最后一个节点的下一个元素一定指向n
last.setNext(n);
// 将最后一个节点变为n
last = n;
}
// 链中元素数量加1
count++;
}
public int getSize(){
return count;
}
public Object get(int index){
// 获取链表的头元素
Node n = first;
// 通过next得到想要的元素
for (int i = 0; i < index; i++) {
n = n.getNext();
}
return n.getObj();
}
}
class TestMyLikedList{
public static void main(String[] args) {
MyLikedList m1 = new MyLikedList();
m1.add("aaa");
m1.add("bbb");
m1.add("ccc");
// System.out.println(m1.count);
System.out.println(m1.get(2));
}
}
加入字符串操作
public class LinkedList_02 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
// 在"cc"后面加一个字符串"kk"
Iterator it = list.iterator();
while (it.hasNext()){
if ("cc".equals(it.next())){
list.add("kk");
}
}
}
}
//ArrayList与it同时对集合进行操作导致报错
//报错,并发修改异常
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at Otherport.LinkedList_02.main(LinkedList_02.java:23)
import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Scanner;
public class LinkedList_02 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
// 在"cc"之后添加一个字符串为"kk"
ListIterator<String> it = list.listIterator();
while (it.hasNext()){
// System.out.println(it.next());
if ("cc".equals(it.next())){
it.add("kk");
}
}
// System.out.println(it.hasNext());
// System.out.println(it.previous());
//
// System.out.println(list);
// 逆向遍历
while (it.hasPrevious()){
System.out.println(it.previous());
}
Scanner input = new Scanner(System.in);
String k = input.nextLine();
}
}
List 接口不唯一,有序
Set (这个无序是相对于List接口而言,无序不等于随机) 唯一,无序
没有更索引相关的方法
HashSet
import java.util.HashSet;
public class TestInteger {
public static void main(String[] args) {
// 创建一个HashSet集合
HashSet<Integer> hs = new HashSet<>();
hs.add(19);
hs.add(32);
hs.add(19);
hs.add(35);
hs.add(19);
hs.add(176);
System.out.println(hs.size());
System.out.println(hs);
}
}
// 结果
4
[32, 176, 19, 35]
public class Student_01 {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student_01{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public Student_01(int age, String name) {
this.age = age;
this.name = name;
}
}
public class TestStudent_01 {
public static void main(String[] args) {
// 上面自定义的类型不满足 唯一,无序的特点
HashSet<Student_01> hs = new HashSet<>();
hs.add(new Student_01(19,"lili"));
hs.add(new Student_01(20,"lulu"));
hs.add(new Student_01(18,"feifei"));
hs.add(new Student_01(19,"lili"));
hs.add(new Student_01(10,"nana"));
System.out.println(hs.size());
System.out.println(hs);
}
}
//结果
5
[Student_01{age=18, name='feifei'}, Student_01{age=10, name='nana'}, Student_01{age=20, name='lulu'}, Student_01{age=19, name='lili'}, Student_01{age=19, name='lili'}]
HashSet的底层原理:数组+链表=哈希值
注意:如果放入HashSet的数据,一定要重写两个方法: hashCode, equals
//在Student_01重写hashCode,equals方法
public class TestStudent_01 {
public static void main(String[] args) {
// 上面自定义的类型不满足 唯一,无序的特点
HashSet<Student_01> hs = new HashSet<>();
hs.add(new Student_01(19,"lili"));
hs.add(new Student_01(20,"lulu"));
hs.add(new Student_01(18,"feifei"));
hs.add(new Student_01(19,"lili"));
hs.add(new Student_01(10,"nana"));
System.out.println(hs.size());
System.out.println(hs);
}
}
//结果
4
[Student_01{age=18, name='feifei'}, Student_01{age=19, name='lili'}, Student_01{age=20, name='lulu'}, Student_01{age=10, name='nana'}]
public class LinkedHashSet_01 {
public static void main(String[] args) {
// LinkedHashSet 有序,不唯一
// 其实就是在HashSet的基础上,多了一个总的链表,这个总链表将放入的元素串在了一起,方便有序的遍历
LinkedHashSet<Integer> lhs = new LinkedHashSet<>();
lhs.add(19);
lhs.add(1);
lhs.add(199);
lhs.add(19);
lhs.add(21);
lhs.add(40);
lhs.add(0);
System.out.println(lhs.size());
System.out.println(lhs);
}
}
内部比较器
public class Student_02 implements Comparable<Student_02>{
private int age;
private double height;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Test_01{" +
"age=" + age +
", height=" + height +
", name='" + name + '\'' +
'}';
}
public Student_02(int age, double height, String name) {
this.age = age;
this.height = height;
this.name = name;
}
@Override
public int compareTo(Student_02 o) {
// return this.getAge()-o.getAge();
return ((Double)(this.getHeight())).compareTo((Double) (o.getHeight()));
}
}
public class TestStudent_02 {
public static void main(String[] args) {
Student_02 stu1 = new Student_02(10,16.5,"lili");
Student_02 stu2 = new Student_02(14,17.05,"nana");
System.out.println(stu1.compareTo(stu2));
}
}
外部比较类(外部比较类比内部好)
import java.util.Comparator;
public class Student_03 {
private int age;
private double height;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Test_01{" +
"age=" + age +
", height=" + height +
", name='" + name + '\'' +
'}';
}
public Student_03(int age, double height, String name) {
this.age = age;
this.height = height;
this.name = name;
}
}
//扩展性好,用于实际开发外部比较器
class Rather implements Comparator<Student_03> {
@Override
public int compare(Student_03 o1, Student_03 o2) {
return o1.getAge() -o2.getAge();
}
}
import java.util.Comparator;
public class TestStudent_03 {
public static void main(String[] args) {
Student_03 stu1 = new Student_03(10,16.5,"lili");
Student_03 stu2 = new Student_03(14,17.05,"nana");
Comparator ca = new Rather();
System.out.println(ca.compare(stu1, stu2));
}
}
1 排序规则实现的方法不同
Comparable接口的方法:compareTo(Object o)
Comparator接口的方法:compare(T o1, To2)
2 类设计前后不同
Comparable接口用于在类的设计中使用;设计初期,就实现这个借口,指定排序方式。
Comparator接口用于类设计已经完成,还想排序(Arrays)。