集合ArrayList
回顾一下前面的课程学过哪些容器:StringBuilder,数组
StringBuilder当作容器只能是字符串类型,类型具有局限性
数组的长度是固定,一旦创建数组,容量就固定,也具有局限性
既要可以存任意类型,又有长度不受限制,我们可以使用集合
ArrayList
ArrayList特点:长度可变,类型不固定
ArrayList E是泛型 是一种特殊的数据类型,当集合存入元素是什么
类型,E就代表什么类型,但是一个集合只能存同一种数据类型
ArrayList底层是数组结构,有序的,查询快,增删慢
创建ArrayList集合格式
// 当你创建集合对象 就必须要确定存储元素的数据类型
ArrayList<Integer> 集合名字 = new ArrayList<Integer>
();
注意:集合不能存放基本数据类型
【高频面试】说一说ArrayList
-
底层使用什么存数据?
-
初始化容量多少?
-
容量不够,怎么扩容?
-
线程是否安全?安全 bye 不安全:说另外一个
CopyOnWriteArrayList -
说一说CopyOnWriteArrayList
…
最基础到第3点 -
底层使用什么存数据:Object对象数组
private static final Object[] EMPTY_ELEMENTDATA= {}
- 初始化容量多少
private static final int DEFAULT_CAPACITY = 10;
- 扩容机制?1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity
>> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so
this is a win:
//使用Arrays.copyOf 进行数组元素的copy
elementData = Arrays.copyOf(elementData,
newCapacity);
}
ArrayList增删改查方法
get(int index):返回指定下标处的元素 查
size():返回集合中元素的个数,就是集合的长度
add(E element):向集合中添加元素 增
remove(int index):根据下标删除元素,这个下标是存在的才能删除 删
remove(Object obj):根据指定的元素删除,这个指定的元素集合中要存在 删
set(int index,E element):修改指定下标处的元素,用element替换掉 改
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList();
// 向集合中添加元素 add 增
list.add(10);
list.add(20);
list.add(30);
System.out.println(list);
// get(int index) 查
System.out.println(list.get(0));
// System.out.println(list.get(3));
// set(int index,Element e) 改
list.set(0,100);
System.out.println(list);
// remove(int index) remove(Objcet obj) 删
list.remove(0);
System.out.println(list);
list.remove((Object)20);
System.out.println(list);
}
ArrayList遍历
public static void main(String[] args) {
System.out.println("===========遍历集合中存入
的字符串===========");
ArrayList<String> list = new ArrayList<>();
list.add("java");
list.add("web");
list.add("c++");
list.add("c#");
list.add("spring");
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// lambda表达式的写法
list.forEach(System.out::println);
System.out.println("===========遍历集合中存入的对象===========");
ArrayList<Student> listStu = new ArrayList<>();
// 创建Student对象
Student s1 = new Student();
s1.setName("张三");
s1.setAge(18);
Student s2 = new Student("李四",20);
Student s3 = new Student("王五",22);
Student s4 = new Student("马六",23);
// 把Student对象存入集合
listStu.add(s1);
listStu.add(s2);
listStu.add(s3);
listStu.add(s4);
for (int i = 0; i < listStu.size(); i++) {
Student student = listStu.get(i);
System.out.println(student);
System.out.println(student.getName()+":"+student.getAge());
}
}