黑马java学习笔记13(阶段二 第四章4-2~第四章4-3 98)
以下学习笔记记录于:2024.09.25-2024.09.30
文章目录
阶段二 JavaSE进阶
第四章 集合框架
4-2 List系列集合
90 特点、特有方法
ListTest1.java:
package com.itheima.hello.d3_collection_list;
import java.util.ArrayList;
import java.util.List;
public class ListTest1 {
public static void main(String[] args) {
// 1.创建一个ArrayList集合(有序、可重复、有索引)
List<String> list = new ArrayList<>(); // 一行经典代码(多态写法)
list.add("蜘蛛精");
list.add("至尊宝");
list.add("至尊宝");
list.add("牛夫人");
System.out.println(list);
// 2.public void add(int index, E element):在某个索引位置插入元素。
list.add(2, "紫霞仙子");
System.out.println(list);
// 3.public E remove(int index):根据索引删除元素,返回被删除元素
System.out.println(list.remove(2));
System.out.println(list);
// 4.public E get(int index):返回集合中指定位置的元素。
System.out.println(list.get(3));
// 5.public E set(int index, E element):修改索引位置处的元素,修改成功后,会返回原来的数据
System.out.println(list.set(3, "牛魔王"));
System.out.println(list);
}
}
运行结果:
91 遍历方式
ListTest2.java:
package com.itheima.hello.d3_collection_list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListTest2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // 一行经典代码(多态写法)
list.add("蜘蛛精");
list.add("至尊宝");
list.add("至尊宝");
list.add("牛夫人");
// 1、for循环【list.fori + 回车】
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("---------------");
// 2、迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
System.out.println("---------------");
// 3、增强for循环(foreach遍历)【list.for + 回车】
for (String s : list) {
System.out.println(s);
}
System.out.println("---------------");
// 4、JDK 1.8开始之后的Lambda表达式
list.forEach(s -> System.out.println(s));
}
}
92 ArrayList集合的底层原理
ArrayList集合和LinkedList集合底层采用的**数据结构(存储、组织数据的方式)**不同,应用场景不同
93 LinkedList集合的底层原理、特有方法
94 LinkedList集合的应用场景:栈、队列
LinkedList集合的应用场景之一:可以用来设计队列(先进先出,后进后出),只在首尾增删元素。
LinkedList集合的应用场景之一:可以用来设计栈(后进先出,先进后出),只在首部增删元素。——> 压/进栈push,弹/出栈pop
package com.itheima.hello.d3_collection_list;
import java.util.LinkedList;
public class ListTest3 {
public static void main(String[] args) {
// 1、创建一个队列
LinkedList<String> queue = new LinkedList<>(); // 此处不要使用多态写法,因为针对首尾的操作只在LinkedList中有
// 入队
queue.addLast("第1位客人");
queue.addLast("第2位客人");
queue.addLast("第3位客人");
queue.addLast("第4位客人");
System.out.println(queue);
// 出队
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue);
System.out.println("-------------------");
// 1、创建一个栈
LinkedList<String> stack = new LinkedList<>(); // 此处不要使用多态写法,因为针对首部的操作只在LinkedList中有
// 进栈(push)
stack.addFirst("第1颗子弹");
stack.addFirst("第2颗子弹");
stack.addFirst("第3颗子弹");
stack.addFirst("第4颗子弹");
// stack.push("第4颗子弹");
System.out.println(stack);
// 出栈(pop)
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
// System.out.println(stack.pop());
System.out.println(stack);
}
}
运行结果:
4-3 Set系列集合
95 整体特点
SetTest1.java:
package com.itheima.hello.d4_collection_set;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetTest1 {
public static void main(String[] args) {
// 1、创建一个Set集合的对象
// Set<Integer> set = new HashSet<>(); // 创建了一个HashSet(无序 -> 这里的无序只会无序一次,之后都会固定、不重复、无索引)的集合对象。 一行经典代码。 输出[888, 777, 666, 555]
// Set<Integer> set = new LinkedHashSet<>(); // (有序、不重复、无索引) 输出[666, 555, 888, 777]
Set<Integer> set = new TreeSet<>(); // (排序 -> 默认升序、不重复、无索引) 输出[555, 666, 777, 888]
set.add(666);
set.add(666);
set.add(555);
set.add(888);
set.add(888);
set.add(777);
set.add(777);
System.out.println(set);
}
}
96 HashSet集合的底层原理1(哈希表)
SetTest2.java:
package com.itheima.hello.d4_collection_set;
public class SetTest2 {
public static void main(String[] args) {
Student s1 = new Student("蜘蛛精", 25, 169.5);
Student s2 = new Student("紫霞仙子", 18, 165.0);
System.out.println(s1.hashCode());
System.out.println(s1.hashCode()); // 同一对象的Hash值相同
System.out.println(s2.hashCode()); // 不同对象的Hash值一般不相同(小概率相同)
String str1 = new String("abc");
String str2 = new String("acD");
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
}
}
运行结果:
97 HashSet集合的底层原理2(红黑树)
1、如果数组快占满了,会出什么问题?怎么解决?
链表会过长,导致查询性能降低。解决方法:扩容,以“创建一个默认长度16的数组,默认加载因子为0.75”为例,若所存数据超过了16*0.75=12则会扩成原数组的两倍,再将这些数据按算法(哈希值对数组长度求余)重新存入新数组中。
2、若扩容后其链表长度过长又该怎么解决?
在Java中对于平衡二叉树使用较多:
98 HashSet集合去重复机制
- 解决方式:重写hashCode()和equals()方法。
Student.java:
package com.itheima.hello.d4_collection_set;
import java.util.Objects;
public class Student {
private String name;
private int age;
private double height;
public Student() {
}
public Student(String name, int age, double height) {
this.name = name;
this.age = age;
this.height = height;
}
// 只要两个对象内容一样就返回true
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Double.compare(student.height, height) == 0 && Objects.equals(name, student.name);
}
// 只要两个对象内容一样,返回的哈希值就是一样的
@Override
public int hashCode() {
return Objects.hash(name, age, height);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = 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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
'}';
}
}
SetTest3.java:
package com.itheima.hello.d4_collection_set;
import java.util.HashSet;
import java.util.Set;
public class SetTest3 {
public static void main(String[] args) {
Set<Student> students = new HashSet<>();
Student s1 = new Student("蜘蛛精", 25, 169.5);
Student s2 = new Student("紫霞仙子", 18, 165.0);
Student s3 = new Student("紫霞仙子", 18, 165.0);
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
Student s4 = new Student("牛魔王", 230, 190.8);
students.add(s1);
students.add(s2);
students.add(s3);
students.add(s4);
System.out.println(students);
}
}
运行结果:
原文地址:https://blog.csdn.net/xiaozhuzhu__/article/details/142708070
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!