课前小练习
创建3个Dog {name,age} 对象,放入到ArrayList中,赋给List引用
用送代器和增强for循环两种方式来遍历
重写Dog的toString方法, 输出name和age
code
package cs.kaoyan.javase.com.list4;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 创建3个Dog {name,age} 对象,放入到ArrayList中,赋给List引用
* 用送代器和增强for循环两种方式来遍历
* 重写Dog的toString方法, 输出name和age
*/
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Dog("小狐狸",8));
list.add(new Dog("花花",3));
list.add(new Dog("小黑",7));
//遍历方式1:增强for循环
for (Object dog : list) {
System.out.println(dog);
}
System.out.println("------------------");
//遍历方式2:迭代器
Iterator iterator = list.iterator();
//有下一个元素,才可以输出
while (iterator.hasNext()) {
Object dog = iterator.next();
System.out.println(dog);
}
/*
Dog{name='小狐狸', age=8}
Dog{name='花花', age=3}
Dog{name='小黑', age=7}
------------------
Dog{name='小狐狸', age=8}
Dog{name='花花', age=3}
Dog{name='小黑', age=7}*/
}
}
class Dog{
private String name;
private int age;
//构造器
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
List接口基本介绍
- List接口是Collection接口的子接口
- List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复
[java,tom,jack,java,mary,tom,zxy]//不报错
- List集合中的每个元素都有其对应的顺序索引,即支持索引
list.get(i);
List的3中遍历方法
package cs.kaoyan.javase.com.list4;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 创建3个Dog {name,age} 对象,放入到ArrayList中,赋给List引用
* 用送代器和增强for循环两种方式来遍历
* 重写Dog的toString方法, 输出name和age
*/
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Dog("小狐狸",8));
list.add(new Dog("花花",3));
list.add(new Dog("小黑",7));
//遍历方式1:增强for循环
for (Object dog : list) {
System.out.println(dog);
}
System.out.println("------------------");
//遍历方式2:迭代器
Iterator iterator = list.iterator();
//有下一个元素,才可以输出
while (iterator.hasNext()) {
Object dog = iterator.next();
System.out.println(dog);
}
System.out.println("------------------");
//遍历方式3:
for (int i = 0; i < list.size(); i++) {
Object dog = list.get(i);
System.out.println(dog);
}
/*
Dog{name='小狐狸', age=8}
Dog{name='花花', age=3}
Dog{name='小黑', age=7}
------------------
Dog{name='小狐狸', age=8}
Dog{name='花花', age=3}
Dog{name='小黑', age=7}
------------------
Dog{name='小狐狸', age=8}
Dog{name='花花', age=3}
Dog{name='小黑', age=7}*/
}
}
class Dog{
private String name;
private int age;
//构造器
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
课堂小练习
使用List的实现类(ArrayList、LinkedList和Vector)添加三本图书,并遍历,打印如下效果
名称:XX
价格:xx
作者:xx
(要求按价格排序,从低到高)
code
package cs.kaoyan.javase.com.list5;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 使用List的实现类(ArrayList、LinkedList和Vector)添加三本图书,并遍历,打印如下效果
* 名称:XX
* 价格:xx
* 作者:xx
* (要求按价格排序,从低到高)
*/
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Book("三国演义","作者1",80));
list.add(new Book("红楼一梦","作者1",76));
list.add(new Book("西天取经","作者1",29));
//冒泡排序
bubbleSort(list);
//使用迭代器遍历集合并输出
//快捷键 : itit
Iterator iterator = list.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}
}
public static void bubbleSort(List list){
int listSize = list.size();
for (int i = 0; i < listSize - 1; i++) {
for (int j = 0; j < listSize - 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);
}
}
}
}
}
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;
}
//getter(以便获取图书的价格)
public int getPrice() {
return price;
}
//重写toString方法
@Override
public String toString() {
//按照指定格式输出
return "书名:" + name + "\t\t作者" + author + "\t\t价格" + price;
}
}
ArrayList’s Detail
- ArrayList可以加入(一个或者多个)null
- ArrayList是由数组来实现数据存储的
- ArrayList基本等同于Vector,执行效率更高,但是ArrayList是线程不安全的
- 多线程情况下,不建议使用ArrayList
ArrayList扩容机制(面试重点)
- 通过源码发现,ArrayList中维护了一个Object类型的数组elementData
- 当创建ArrayList对象时,如果使用的是无参构造器ArrayList(),则初始elementData数组的容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍(15),如还需要扩容,则扩容elementData为15的1.5倍(33)
- 如果使用的是指定大小的构造器ArrayList(int),则初始elementData数组的容量为指定大小,如果需要扩容则直接扩容elementData为1.5倍,如8 -> 12 -> 18 -> 27…