- 数据结构
线性表 List
栈和队列 Queue/Stack/Deque
二叉树 堆 PriorityQueue
排序 Array.sort |List.sort
搜索 Set/Map 搜索树 哈希表 …
Map是映射关系
例:通讯录
姓名 映射 电话号码
Key Value
同学的到勤次数姓名
映射 上课次数
Key Value
Key不允许重复,Value允许重复
静态内部类:定义在类的成员界面(member-level),同时被static修饰的一种类
class LinkedList {
public/default/protected/private static class Node
{
int val; Node next;
}
}
最大的作用就是一个类从概念上应该属于另一个的范围使用上:
1. 在LinkedList内部使用,和普通类没有区别
Node n = new Node();
2. 在LinkedList外部使用,指明所属关系
LinkedList.Node n = new LinkedList.Node();
泛型之问题的引入
class Person{} class Book{}
class MyArrayList {
private int[] array; private int[] size; …
}
class MyArrayListPerson {
private Person[] array; private int size; …
}
同样的代码,定义不同类型每次使用都要重新定义解决办法:
1.前提:
(1)Object是所有类型的祖先类
(2)向上转型是自然发生的class MyArrayList {
private Object[] array;private int size;
}
Java 1.5都是这么去做的上述方法的一个弊端:
MyAyyayList list = new MyArrayLisft();
List.add(new Person());
Person p = (Person)list.get(0); // 每次都得向下转型Book b = (Book)list.get(0);
//编译时没问题,运行时异常
前提:问题发生在编译期间,影响远远小于发生在运行期间
泛型 诞生了!
泛型:看到有尖括号<>就要想到泛型,<>中的元素类型是可变的
1. 泛型类
定义
使用 //重点学会使用泛型类
2. 泛型方法
3. 定义
4. 使用
5. class MyArrayList {
6. private E[] array; private int size;
7. }
8. MyArrayList //概念上可以认为是定义了String[] array; //但实际上不是
Class MyMap<K,V>{
}
MyArrayList list = new MyArrayList();
new MyArrayList<>();//编译器可以自己进行类型推导
(Type Inference)list.add(new Person());
List.add(new Book()); //编译错误
Person p = list.get(0); //不再是向下转型,不需要类型转换
Book b = list.get(0); //编译错误
泛型作用在编译期间 MyArrayList和MyArrayList和MyArrayList在运行期间实际上就是一个类型MyArrayList,这个过程叫做类型擦除,本质上E被擦除成Object类型了
Class MyArrayList {
Object[] array; a instanceof MyArrayList 错误
int size; a instanceof MyArrayList 正确
}
泛型只能接收类,所以基本数据类型必须使用包装类
包装类:
public static interger valueOf(int i){}
int i=10;
Interger ii=Integer.valueOf(i); //装箱
i=11;
ii.intValue(); //仍然是10
1. 装箱过程会生成Integer的对象
2. i的值改变,不影响ii指向对象的内部的值
下面是两个特殊的,其他基本数据类型的包装类就是首字母大写
int->Interger
char->Charavcter
学习下面两种接口的常用方法:
1.Collection接口常用方法:
boolean add(E e) 将元素 e 放入集合中;
void clear() 删除集合中的所有元素;
boolean isEmpty() 判断集合是否没有任何元素,俗称空集合 ;
boolean remove(Object e) 如果元素 e 出现在集合中,删除其中一个 int size() 返回集合中的元素个数;
Object[] toArray() 返回一个装有所有集合中元素的数组 ;
2.List接口的常用方法:
V get(Object k) 根据指定的 k 查找对应的 v;
V getOrDefault(Object k, V defaultValue) 根据指定的 k 查找对应的 v,没有找到用默认值代替 ;
V put(K key, V value) 将指定的 k-v 放入;
Map boolean containsKey(Object key) 判断是否包含 key boolean ;containsValue(Object value) 判断是否包含 value ;
Set<Map.Entry<K, V>> entrySet() 将所有键值对返回 ;
boolean isEmpty() 判断是否为空 ;
int size() 返回键值对的数量 ;