目录
为什么要用集合
1.相对于数组,数组有缺陷》》》定容【数组一旦定义好,他们的长度就无法改变】,如果改变数组的长度就会很复杂。
2.可以定义一个长度可以改变的容器
手写可变长度的容器
public class MyArray {
public Object [] arr;
public int size;//数组下标
public MyArray(){
}
public MyArray(int intSize){
if (intSize<0){
throw new ArrayIndexOutOfBoundsException("长度不合法");
}
arr = new Object[intSize];
}
public void addDate(Object a){
//扩容
if (size>= arr.length){
Object[] newArr = Arrays.copyOf(arr, size * 2);
arr=newArr;
}
//添加数组元素
arr[size]=a;
size++;
}
public Object getDate(int index){
if (index<0){
throw new ArrayIndexOutOfBoundsException("下标越界");
}
Object a = arr[index];
return a;
}
}
===========================================================
public class TestArray {
public static void main(String[] args) {
MyArray my = new MyArray(5);
my.addDate("java01");
my.addDate("java02");
my.addDate("java03");
Object date = my.getDate(0);
System.out.println(date);
for (int i = 0; i <my.size; i++) {
Object o = my.getDate(i);
System.out.println(o);
}
}
}
java官网 基于数组 根据不同的数据结构 创建多个类 而这些类统称为 集合框架
以后我们在说集合框架时,就表示多个类
集合架构
List集合
ArrayList
创建集合对象
//创建集合对象
List list = new ArrayList();//默认集合长度为10
//初始化集合空间 长度为 2
List list1 = new ArrayList(2);
集合添加操作
//增加操作 集合可增加任意类型
list.add(100);
list.add(1.52525);
list.add("张三");
list.add(true);
list.add(new Date());
//在下标为 2 的位置添加元素,并把后面元素进行移位
list.add(2,"李四");
System.out.println(list);
//添加多个元素 将list1的元素添加到list中
list1.add("a");
list1.add("b");
list.addAll(list1);
System.out.println(list);
集合删除操作
//删除操作
list.remove(2);
System.out.println(list);
//清空集合元素
list.clear();
System.out.println(list);
集合修改操作
//修改操作
list.set(1,"赵六");
System.out.println(list);
集合查询操作
//查询操作
Object o = list.get(2);//根据下标获取元素
System.out.println(o);
//获取元素中的个数
int size = list.size();
System.out.println(size);
//判断元素是否在集合中
boolean zs = list.contains("张三");
System.out.println(zs);//返回true/false
//查询元素在集合中第一次出现的位置
int ls = list.indexOf("李四");
System.out.println(ls);//返回元素下标 没有返回-1
//遍历集合中的元素 for循环方式
for (int i = 0; i < list.size(); i++) {
Object o1 = list.get(i);
System.out.println(o1);
}
System.out.println("================");
//遍历集合中的元素 foreach循环方式
for (Object o2 : list
) {
System.out.println(o2);
}
ArrayList底层源码
从构造方法来入手。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++)
if (o.equals(elementData[i])) //和数组中的每个元素内容进行比对
return i; //返回元素在集合中位置
}
return -1;
}
===========size() 请求数组的长度======================
public int size() {
return size;
}
============contain("java05")判断元素是否在集合中==============
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
===============get(1) 获取指定位置的元素========
public E get(int index) {
rangeCheck(index); //判断指定的位置是否合法
return elementData(index);
}
E elementData(int index) {
return (E) elementData[index];
}
============toString() 为什么不打印对象的引用地址
[java01, java02, java03, java02]因为重写了Object里面的toString方法。
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
通过对ArrayList方法的底层代码分析:底层就是对数组的操作。
ArrayList的底层就是基于数组实现的。
LinkedList
它是一个链表结构。
LinkedList添加操作
//添加
linkedList.add("java01"); //追加尾部
linkedList.addFirst("java02"); //添加到头部
linkedList.addLast("java03");//追加到尾部
linkedList.addFirst("java04"); //追加到头部
linkedList.addLast("java05");//追加到尾部
System.out.println(linkedList);
LinkedList删除操作
//删除操作
linkedList.removeFirst();//移除头部元素
System.out.println(linkedList);
linkedList.remove(2);//移除指定位置的元素
System.out.println(linkedList);
linkedList.removeLast();//移除尾部的元素
System.out.println(linkedList);
LinkedList修改操作
//修改操作
linkedList.set(1,"java11");
System.out.println(linkedList);
LinkedList查询操作
//查询操作
int size = linkedList.size();//求长度
boolean empty = linkedList.isEmpty();//是否为空
boolean b = linkedList.contains("java01");//判断元素是否在集合中
Object o = linkedList.get(1);//根据下标获取指定位置的元素
Object first = linkedList.getFirst();//获取第一个元素
System.out.println(first);
Object last = linkedList.getLast();
System.out.println(last);