目录
一、List
List接口
/**
* @author: 程序员飞扬
* @description:
*/
public class List_ {
public static void main(String[] args) {
List list = new ArrayList();
//1. List集合中元素有序(即添加顺序和取出顺序一致)、且可重复
list.add("tom");
list.add("jack");
list.add("alice");
System.out.println(list);//[tom, jack, alice]
list.add("jack");
System.out.println(list);//[tom, jack, alice, jack]
//2. List集合中的每个元素都有其对应的顺序索引,即支持索引
System.out.println(list.get(0));//tom
}
}
List常用方法
/**
* @author: 程序员飞扬
* @description:
*/
public class ListMethod {
public static void main(String[] args) {
List list = new ArrayList();
//增(单元素)
list.add("张三丰");
list.add("洪七公");
list.add(1,"黄老邪");
System.out.println(list);//[张三丰, 黄老邪, 洪七公]
//增(多元素)
List list2 = new ArrayList();
list2.add("rose");
list2.add("jack");
list.addAll(1,list2);
System.out.println(list);//[张三丰, rose, jack, 黄老邪, 洪七公]
//返回指定元素首次出现的索引
int jack = list.indexOf("jack");
System.out.println(jack);
//返回元素末次出现的索引
list.add(4,"jack");
int jack1 = list.lastIndexOf("jack");
System.out.println(jack1);
//删(指定元素)
System.out.println(list);//[张三丰, rose, jack, 黄老邪, jack, 洪七公]
list.remove("洪七公");
System.out.println(list);//[张三丰, rose, jack, 黄老邪, jack]
//删(指定索引处的元素)
list.remove(4);
System.out.println(list);//[张三丰, rose, jack, 黄老邪]
//改(指定索引处的元素)
list.set(0, "张无忌");
System.out.println(list);//[张无忌, rose, jack, 黄老邪]
//查(指定索引处的元素)
Object o = list.get(0);
System.out.println(o);//张无忌
//取子集合(指定索引,含左不含右)
System.out.println(list);//[张无忌, rose, jack, 黄老邪]
List list1 = list.subList(0, 2);
System.out.println(list1);//[张无忌, rose]
}
}
List的三种遍历方式
List排序练习
/**
* @author: 程序员飞扬
* @description:将list集合按指定元素大小排序
*/
public class ListExercise02 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Book3("红楼梦",99));
list.add(new Book3("三国",48));
list.add(new Book3("西游记",66));
list.add(new Book3("水浒传",28));
System.out.println("=========排序前==========");
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){
int size = list.size();
for (int i = 0; i < size-1; i++) {
for (int j = 0; j < size-1-i; j++) {
Book3 book3 = (Book3)list.get(j);
Book3 book32 = (Book3)list.get(j+1);
if(book3.getPrice()>book32.getPrice()){
list.set(j,book32);
list.set(j+1,book3);
}
}
}
}
}
class Book3{
private String name;
private double price;
public Book3(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "名称:" + name + "\t" + "价格:" + price;
}
}
输出:
=========排序前==========
名称:红楼梦 价格:99.0
名称:三国 价格:48.0
名称:西游记 价格:66.0
名称:水浒传 价格:28.0
=========排序后==========
名称:水浒传 价格:28.0
名称:三国 价格:48.0
名称:西游记 价格:66.0
名称:红楼梦 价格:99.0
1.ArrayList
ArrayList注意事项
ArrayList源码分析
ArrayList底层结构和源码分析:
分析案例:
1)不指定大小
ArrayList list = new ArrayList();
/**
* @author: 程序员飞扬
* @description:
*/
public class ArrayListSource {
public static void main(String[] args) {
ArrayList list = new ArrayList();//1. 创建空数组。容积10
//ArrayList list = new ArrayList(8);
for (int i = 1; i <= 10 ; i++) {//2. 从第二次循环开始,2~10之间不会再扩容
list.add(i);
}
for (int i = 11; i <= 15 ; i++) {//3. 需要的容积大于10了,执行扩容,此时容积为15(1.5倍扩容机制)
list.add(i);
}
list.add(100);//扩容,此时容积为22
list.add(200);
list.add(null);
for (Object o : list) {
System.out.println(o);
}
}
}
第一步:调用无参构造器,创建空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
第二步:确认是否要扩容,然后再赋值
第三步:
①确定最小容积,第一次扩容为10
private static final int DEFAULT_CAPACITY = 10;
②真正的扩容方法
第四步:调用真正的扩容方法
2)指定大小
ArrayList list = new ArrayList(8);
第一步:调用构造器
下一步,流程与上诉相同,当容积不满足需要时,调用grow方法扩容
2.Vector
Vector介绍
Vector源码分析
第一步:调用构造器,默认容积10
第二步:确认容积大小,判断是否要扩容
如果需要真正的扩容:
ArrayList和Vector比较
3.LinkedList
LinkedList介绍
模拟双向链表
/**
* @author: 程序员飞扬
* @description:模拟双向链表
*/
public class LinkedList01 {
public static void main(String[] args) {
Node node1 = new Node("唐僧");
Node node2 = new Node("猴子");
Node node4 = new Node("老沙");
//唐僧 -> 猴子 -> 老沙
node1.next = node2;
node2.next = node4;
//老沙 -> 猴子 -> 唐僧
node4.pre = node2;
node2.pre = node1;
Node first = node1;
Node last = node4;
//从头到尾遍历
System.out.println("===从头到尾遍历===");
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.pre;
}
//插入元素
Node node3 = new Node("八戒");
node3.next = node4;
node3.pre = node2;
node2.next = node3;
node4.pre = node3;
//增加元素后从头到尾遍历
System.out.println("==增加元素后从头到尾遍历===");
first = node1;
last = node4;
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.pre;
}
}
}
class Node{
public Object item;
public Node next;
public Node pre;
public Node(Object item) {
this.item = item;
}
public String toString(){
return "Node name=" + item;
}
}
输出:
===从头到尾遍历===
Node name=唐僧
Node name=猴子
Node name=老沙
===从尾到头遍历====
Node name=老沙
Node name=猴子
Node name=唐僧
==增加元素后从头到尾遍历===
Node name=唐僧
Node name=猴子
Node name=八戒
Node name=老沙
===增加元素后从尾到头遍历====
Node name=老沙
Node name=八戒
Node name=猴子
Node name=唐僧
LinkedList源码分析
第一步:调用构造器
第二步:执行方法,进入linkLast算法
操作链表的方法重点在具体执行的方法。
/**
* @author: 程序员飞扬
* @description:
*/
public class LinkedList02 {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
linkedList.add("赵灵儿");
System.out.println(linkedList);
linkedList.removeFirst();
linkedList.remove(0);
linkedList.remove(new Integer(3));
linkedList.remove("赵灵儿");
System.out.println(linkedList);
linkedList.add("赵灵儿");
System.out.println(linkedList);
linkedList.set(0,"李逍遥");
System.out.println(linkedList);
Object o = linkedList.get(0);
System.out.println(o);
}
}
ArrayList和LinkedList比较
List集合选择