1数据结构
栈
队列
数组 :有序的元素序列;长度固定。
链表linked list :每一个Node 包含一个数据源(存储数组),两个指针域(存储地址)
自己的地址 | 数据 | 下一个节点的地址
单向链表:无序
双向链表:有序
红黑树:红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树
特点:趋近于平衡树,查询速度非常快,查询叶子节点最大次数和最小次数不能超过2倍。
2 List接口
特点
1.有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123)
2.有索引,包含了一些带索引的方法
3.允许存储重复的元素
带索引的方法(特有)public void add(int index, E element)
将指定的元素,添加到该集合中的指定位置上。public E get(int index)
public E remove(int index)
public E set(int index, E element)
防止索引越界异常IndexOutOfBoundsException
:索引越界异常,集合会报ArrayIndexOutOfBoundsException
:数组索引越界异常StringIndexOutOfBoundsException
:字符串索引越界异常
2.1LinkedList集合
特点
1.底层是一个双向链表结构:查询慢,增删快
2.里边包含了大量操作首尾元素的方法
注意:使用LinkedList集合特有的方法,不能使用多态public void addFirst(E e)
public void addLast(E e)
public void push(E e)
public E getFirst()
public E getLast()
public E removeFirst()
public E removeLast()
public E pop()
public boolean isEmpty()
2.2Vector集合
特点 底层是一个数组
3 Set接口
特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
3.1HashSet
特点
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历(遍历用Iterator)
Iterator<Integer> it = set.iterator(); //set为Hashset的一个实例
while (it.hasNext()){
Integer n = it.next();
System.out.println(n);
}
3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4.底层是一个哈希表结构(查询的速度非常的快)
存储数据的结构(哈希表)
- 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)
在Object类有一个方法,可以获取对象的哈希值:hashCode方法public native int hashCode();
native
: 代表该方法调用的是本地操作系统的方法
toString方法的源码:return getClass().getName() + "@" + Integer.toHexString(hashCode());
- 在JDK1.8之前: 数组+链表
在JDK1.8之后: 数组+链表+红黑树
当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间 - Set 集合在调用add 方法会调用元素的hashCode方法和equals方法,判断元素是否重复。
- 存储自定义类型元素
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一
3.2LinkedHashSet
特点
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
4 可变参数(VarArgs)
使用前提:
当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数.
使用格式: 定义方法时使用
修饰符 返回值类型 方法名(数据类型…变量名){}public static int add(int...arr){}
可变参数的原理:
可变参数底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数
传递的参数个数,可以是0个(不传递),1,2…多个
可变参数的注意事项
1.一个方法的参数列表,只能有一个可变参数
2.如果方法的参数有多个,那么可变参数必须写在参数列表的末尾public static void method(String b,double c,int d,int...a){}
可变参数的特殊(终极)写法public static void method(Object...obj){}
5 集合工具类
-
public static <T> boolean addAll(Collection<T> c, T... elements)
往集合中添加一些元素 ; addAll( , ) -
public static void shuffle(List<?> list)
打乱集合顺序 ; shuffle(list) -
public static <T> void sort(List<T> list)
将集合中元素按照默认规则排序,默认是升序 ; sort(list)
使用前提 被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则
public class Person implements Comparable<Person>{
@Override
public int compareTo(Person o) {
//return 0;//认为元素都是相同的
//return this.getAge() - o.getAge();//年龄升序排序
return o.getAge() - this.getAge();//年龄降序排序
}
}
Comparable接口的排序规则: 自己(this)-参数: 升序;参数-自己(this) : 降序
4. public static <T> void sort(List<T> list,Comparator<? super T> )
:将集合中元素按照指定规则排序 ; sort(list, )
Collections.sort(list01, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//return o1-o2;//升序
return o2-o1;//降序
}
});
Collections.sort(list02, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int result = o1.getAge()-o2.getAge();
if(result==0){ // 升序
result = o1.getName().charAt(0)-o2.getName().charAt(0);
}
return result;
}
});