public class ListExercise {
public static void main(String[] args) {
List list = new ArrayList<>();
// 添加十个以上的 String "hello"
for (int i = 0; i < 12; i++) {
list.add("hello" + i);
}
System.out.println("list = " + list);
// 在2号位插入一个元素"chen"
list.add(1, "chen");
System.out.println("list = " + list);
// 获取第6个元素
System.out.println("第6个元素 = " + list.get(5));
// 删除第7个元素
list.remove(6);
System.out.println("list = " + list);
// 修改第8个元素
list.set(7, "三国演义");
System.out.println("list = " + list);
// 使用迭代器遍历集合
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println("obj = " + obj);
}
}
}
1.3.4、List集合的三种遍历方式
迭代器Iterator
增强for
普通for
public class ListFor {
public static void main(String[] args) {
// List 接口的实现子类 Vector LinkedList
// List list = new ArrayList<>();
List list = new LinkedList<>();
// List list = new Vector<>();
list.add("jack");
list.add("tom");
list.add("天龙八部");
list.add("北京烤鸭");
// 遍历
// 1.迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println("obj = " + obj);
}
System.out.println("=================");
//2.增强for循环
for (Object x : list) {
System.out.println(x);
}
System.out.println("================");
//3.普通for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
1.3.5、List排序练习
Book类
public class Book {
private String name;
private String author;
private int price;
public Book(String name, String author, int price) {
this.name = name;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "名称:"+ name +"tt价格:" + price+ "tt作者:" + author;
}
}
main:
public class ListExercise2 {
public static void main(String[] args) {
// List list = new Vector<>();
List list = new ArrayList<>();
// List list = new LinkedList<>();
list.add(new Book("红楼梦", "曹雪芹", 70));
list.add(new Book("西游记", "吴承恩", 10));
list.add(new Book("水浒传", "施耐庵", 90));
list.add(new Book("三国志", "罗贯中", 80));
// 遍历
for (Object o : list) {
System.out.println(o);
}
// 冒泡排序
sort(list);
System.out.println("=========");
// 排序后遍历
for (Object o : list) {
System.out.println(o);
}
}
public static void sort(List list) {
for (int i = 0; i < list.size() - 1; i++) {
for (int j = 0; j < list.size() - 1 - i; j++) {
// 取出对象Book
Book book1 = (Book) list.get(j);
Book book2 = (Book) list.get(j + 1);
if (book1.getPrice() > book2.getPrice()) {
list.set(j, book2);
list.set(j + 1, book1);
}
}
}
}
}
1.4、ArrayList底层结构和源码分析
1.4.1、注意事项
ArrayList可以存放空值null
ArrayList是由数组来实现数据存储的
ArrayList是线程不安全的(执行效率高),多线程情况下,不建议使用ArrayList
public class ArrayListDetail {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList<>();
arrayList.add(null);
arrayList.add("jack");
arrayList.add(null);
System.out.println("arrayList = " + arrayList);
}
}
public class ArrayListSource {
public static void main(String[] args) {
// 使用午餐构造器创建ArrayList对象
ArrayList list = new ArrayList<>();
// ArrayList list = new ArrayList<>(8);
// 使用for给list集合添加 1-10数据
for (int i = 1; i <= 10; i++) {
list.add(i);
}
// 使用for给list集合添加11-15数据
for (int i = 11; i <= 15; i++) {
list.add(i);
}
list.add(200);
list.add(100);
}
}
1.5、Vector底层结构和源码分析
1.5.1、基本介绍
Vector类的定义说明
Vector底层也是一个对象数组,protected Object[] elementData;
Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized
1.5.2、Vector底层和ArrayList的比较
底层结构
版本
线程安全(同步)效率
扩容倍数
ArrayList
可变数组
JDK1.2
不安全,效率高
如果有参构造1.5倍如果是无参1.第一次102.从第二次开始按照1.5倍
Vector
可变数组
JDK1.0
安全效率高
如果是无参,默认10,满后直接按2倍扩容如果指定大小,则每次直接按2倍扩容
1.5.3、源码解读
一、创建Vector对象时使用无参构造器源码
public class Vector_ {
public static void main(String[] args) {
// 无参构造器
Vector vector = new Vector<>();
for (int i = 0; i < 10; i++) {
vector.add(i);
}
vector.add(100);
System.out.println("vector = " + vector);
// 源码解读
// 1. new Vector() 底层
}
}
public class LinkedList01 {
public static void main(String[] args) {
// 模拟简单的双向链表
Node jack = new Node("jack");
Node tom = new Node("tom");
Node chen = new Node("chen");
// 连接三个节点,形成双向链表
// jack -> tom -> chen
jack.next = tom;
tom.next = chen;
// chen -> tom -> jack
chen.prev = tom;
tom.prev = jack;
// 让first引用指向jack,就是双向链表的头节点
Node first = jack;
// 让last引用指向chen,就是双向链表的尾节点
Node last = chen;
// 遍历 从头到尾遍历
while (true) {
if (first == null) {
break;
}
// 输出信息
System.out.println(first);
first = first.next;
}
// 遍历 从尾到头遍历
System.out.println("===从尾到头遍历===");
while (true) {
if (last == null) {
break;
}
// 输出信息
System.out.println(last);
last = last.prev;
}
// 添加元素
// 1.创建一个Node结点, name 是张飞
Node zf = new Node("张飞");
zf.next = chen;
zf.prev = tom;
chen.prev = zf;
tom.next = zf;
// 让first 再次指向jack
first = jack;
System.out.println("===从头到尾遍历===");
while (true) {
if (first == null) {
break;
}
// 输出信息
System.out.println(first);
first = first.next;
}
}
}
class Node {
public Object item;
public Node next;
public Node prev;
public Node(Object name) {
this.item = name;
}
public String toString() {
return "Node name = " + item;
}
}
1.6.3、LinkedList底层源码
1.6.3.1、添加元素
linkedList.add(1);
// 1、LinkedList linkedList = new LinkedList<>();
public LinkedList() {}
// 2、这是LinkedList 的属性first = null last = null
// 3、执行add方法
public boolean add(E e) {
linkLast(e);
return true;
}
// 4、将新的结点,加入到双向链表的最后
void linkLast(E e) {
final Node l = last;
final Node newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
流程图
执行 add 方法
执行 linkList
1.6.3.2、删除元素
linkedList.remove();
// 1、linkedList.remove();// 默认删除第一个元素
// 2、执行 removeFirst() 方法
public E remove() {
return removeFirst();
}
// 3、执行
public E removeFirst() {
final Node f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
// 4、执行 unlinkFirst, 将 f 指向的双向链表的第一个结点拿掉
private E unlinkFirst(Node f) {
// assert f == first && f != null;
final E element = f.item;
final Node next = f.next;
f.item = null;
f.next = null; // help GC
first = next;
if (next == null)
last = null;
else
next.prev = null;
size--;
modCount++;
return element;
}