java基础总结
day16 集合01(ArrayList,LinkedList)
1.使用数组模拟ArrayList底层
假设我现在是某个篮球队的教练,需要安排5个球员上场打球。此时需要模拟上场球员的存储,简单一点,我们就只存储上场球员的球衣号码。那么此时我需要以下几个操作:
1.初始一个容量为5的容器,用来存储场上的5个球衣号码。
2.安排5个球员上场,比如球员号码分别为11、22、33、44、55。
3.查询指定索引位置球员的球衣号码是多少,如查询索引位置为2的球衣号码是33。
4.替换场上索引位置为2的球员,使用333号替换33号。
5.罚下场上索引位置为2的球员(直接罚下,没有补位)。
6.打印出场上球员的球衣号码,打印风格如 [11,22,33,44,55]。
//列表
public class MyList {
//用于存放数据的列表
private Object[] playerNum;
//用来表示存储的个数
private int size;
//增加元素
public void add(Object playEle){
//扩容
if(size >= playerNum.length){
playerNum = Arrays.copyOf(playerNum,playerNum.length * 2);
}
playerNum[size++] = playEle;
}
//根据索引删除元素
public void deleteByIndex(int index){
if(index < 0 || index >= size){
throw new 集合.第一题.logicExpection("索引越界");
}
for(int i = index ; i < size - 1 ; i++){
playerNum[i] = playerNum[i+1];
}
size --;
}
//根据索引修改元素值
public void updateByEle(int index ,Object object){
if(index < 0 || index >= size){
throw new 集合.第一题.logicExpection("索引越界");
}
playerNum[index] = object;
}
//根据索引查询元素值
public Object getByIndex(int index){
if(index < 0 || index >= size){
throw new 集合.第一题.logicExpection("索引越界");
}
return playerNum[index];
}
//打印列表
@Override
public String toString() {
if(size == 0){
return "[]";
}
StringBuilder sb = new StringBuilder("[");
for(int i = 0; i < size ; i++){
sb.append(playerNum[i]).append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append("]");
return sb.toString();
}
public MyList() {
this(5);
}
public MyList(int capacity) {
if(capacity < 0){
throw new logicExpection("列表长度不能小于0");
}
playerNum = new Object[capacity];
}
}
2.集合的理解和框架
集合是Java中提供的一种容器,可以用来存储多个数据,根据不同存储方式形成的体系结构,就叫做集合框架体系(掌握)。
集合框架体系
关于ArrayList
-
boolean add(Object e):将元素添加到列表的末尾
-
void add(int index, Object element):在列表的指定位置插入指定的元素
-
boolean addAll(Collection c):把c列表中的所有元素添加到当前列表中
删除操作
-
Object remove(int index):从列表中删除指定索引位置的元素,并返回被删除的元素
-
boolean removeAll(Collection c):从此列表中移除c列表中的所有元素
修改操作
- Object set(int index, Object ele):修改列表中指定索引位置的元素,返回被替换的旧元素
查询操作
-
int size():返回当前列表中元素个数
-
boolean isEmpty():判断当前列表中元素个数是否为0
-
Object get(int index):查询列表中指定索引位置对应的元素
-
Object[] toArray():把列表对象转换为Object数组
-
boolean contains(Object o):判断列表是否存在指定对象
关于LinkList
-
void addFirst(Object e) 将指定元素插入此列表的开头。
-
void addLast(Object e) 将指定元素添加到此列表的结尾。
-
Object getFirst() 返回此列表的第一个元素。
-
Object getLast() 返回此列表的最后一个元素。
-
Object removeFirst() 移除并返回此列表的第一个元素。
-
Object removeLast() 移除并返回此列表的最后一个元素。
3.关于其他数据结构以及性能的比较(详细)
具体看java基础之细节龙细节篇md笔记的数据结构
4.泛型
其实就是一种类型参数,主要用于某个类或接口中数据类型不确定时,可以使用一个标识符来表示未知的数据类型,然后在使用该类或方法时指定该未知类型的真实类型。
在类中使用泛型
//在类上声明使用符号T,表示未知的类型
public class Point<T> {
private T x;
private T y;
//省略getter/setter
}
在集合框架中使用泛型
class ArrayList<E>{
public boolean add(E e){ }
public E get(int index){ }
}
//只能存储String类型的集合
List<String> list1 = new ArrayList<String>();
list1.add("A");
list1.add("B");
//只能存储Integer类型的集合
List<Integer> list2 = new ArrayList<Integer>();
list2.add(11);
list2.add(22);
5.注意事项(细节)
- ArrayList的底层是Object【】数组,所以ArrayList里的元素为基本数据类型时,会自动装包为包装类
- 当使用泛型时,我们知道list集合里的类型为objct,所以泛型里不能传入基本数据类型