1.2为什么使用集合?
1. 思考: 数组有缺陷?--定容【一定数组定义好,他们得长度就无法改变.】如果需要改变数组得长度,变得很复杂。
2.我们是否可以定义一个长度改变的容器。---当然可以。
3.手撕可变长度的容器。
//自定义可改变长度的容器内容
public class Myarray {
private Object [] arr;//声明一个Object类型的数组
private int size;//表示数组下标 因为他们是类成员变量 在创建对象时都有默认
public Myarray(){//无参构造函数 this(5);//本类中其他的构造函数 this本类的对象。 如果在构造方法中this()表示调用本类的其他构造函数 } public Myarray(int size){ if(size<0){ throw new RuntimeException("数组长度有问题"); } arry=new Object[size]; } //把元素o放入数组arry public void addDate(Object o){ //判断数组长度是否已满 if(size>= arry.length){ //扩容--1.容器长度边长 2.把原来容器中的元素复制到新的容器中 Object[] newArry=Arrays.copyOf(arry,size*2); arry= newArry; } arry[size]=o; size++; } //根据下表获取数组中的元素 public Object getDate(int index){ if(index>size){ throw new ArrayIndexOutOfBoundsException("数组下标越界"); } Object o = arry[index]; return o; } }
我们自己可以手写一个可变的容器,那么别人也可以手写可变的容器。
java官网 基于数组 根据不同的数据结构 创建了多个类 而这些类统称 为集合框架。
以后 我们在说集合框架时 就表示多个类。
1.3集合的架构
1.4 List集合 - ArrayList
1.4.0创建集合对象
List list = new ArrayList();//创建一个集合对象 如果没有指定集合容器的长度默认为10
List list1 = new ArrayList(15);
1.4.1添加的操作
//添加(1)可添加任意类型
list.add("123"); list.add("321"); list.add(15.1); list.add(56); list.add(true); list.add(new Date()); System.out.println(list); list.add(2,"你好");//下表为二的位置添加元素,并把后面的进行位移 System.out.println(list);//打印一个对象同时默认调用toString(); List list2 = new ArrayList(); list2.add("123"); list2.add("321"); list.addAll(list2);//添加多个元素吧list2中的元素添加到list中 System.out.println(list);
1.4.2 删除的操作
//删除操作
list.remove(2);//依据下标删除该元素
list.clear();//清楚集合中的所有元素
1.4.3修改的操作
//修改操作
list.set(1,"陈冠希");//修改下标为1的内容为陈冠希;
1.4.4查询操作
List list = new ArrayList();
list.add("java01");
list.add("java02");
list.add("java03");
list.add("java02");
//查询方法
Object o = list.get(1);//根据下标获取元素
int size = list.size();//获取集合中元素的个数
boolean f = list.contains("java05");//判断元素是否在集合中
int index = list.indexOf("java02");//查询元素在集合中第一次出现的位置
//遍历集合中的元素for循环
for(int i = 0;i<list.size();i++){
Object ol = list.get(i);
System.out.println(ol);
}
1.4.5ArrayList底层源代码
java
从构造方法来入手。new ArrayList(22) 底层声明了一个Object类型的数组 名字elementData
Object[] elementData
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) { //大于0
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) { //等于初始化为一个空数组
this.elementData = EMPTY_ELEMENTDATA;
} else { //抛出一个异常
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
==========add("java01")======E理解为Object类型================
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 扩容
elementData[size++] = e; //把元素赋值给数组的相应位置
return true;
}
==========indexOf("java02") 判断元素在集合中第一次的位置=============
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)