A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 heifachangcun 于 2018-11-20 15:02 编辑

数据结构
栈:
栈的特点:
先进后出 (FILO, First In Last Out)
入口和出口在同一侧
入栈(压栈): 将元素存入栈
出栈(弹栈): 从栈中取出元素
栈的适用场景:
栈内存 (main方法先进栈调用, main方法中的其他方法都调用完毕后, main才能出栈)
反转内容 (车尾变车头, 进去再出来就反转了)
队列:
队列的特点:
         先进先出 (FIFO, First In First Out)
  入口和出口在两端

队列的适用场景:
秒杀, 抢购
在线售票
处理高并发场景
数组
特点::
查询快: 通过 (第一个元素地址值 + 索引) 可以快速计算出该索引元素的地址值
增删慢: 增加一个元素, 要创建长度+1的新数组, 然后将原数组元素复制到新数组, 然后存        入新元素; 删除类似
数组的适用场景:
查询多, 增删少的数据存储场景  国内城市
链表:(链表由多个 节点(Node / Entry) 组成)
链表的特点:
查询慢: 要找到其中某个节点, 只能从第一个节点一个一个向后寻找
增删快: 只需要修改保存的下一个节点的地址值, 就可以快速完成增删
链表的适用场景:
查询少, 增删多的场景
链表可以实现栈和队列的结构, 因为栈和队列增删频繁
红黑树:
红黑树: 是一种 平衡 二叉 查找 树
平衡: 左子节点和右子节点数量相等
二叉: 每个节点最多有2个子节点
查找: 节点存储的元素是按照大小顺序存储的
特点:
元素存储过程中就完成了大小排序
查询比链表快, 增删比数组快 (数组和链表的折中)
红黑树的适用场景:
查询和增删都有, 需要元素自动排序的场景
集合
何时应用list集合或set集合
要存储的元素可以重复的, 用List集合:
增删少, 用ArrayList
增删多, 用LinkedList
要存储的数据要求不重复, 或者相对一个集合去重, 用Set集合:
不要求存取顺序一致, 用HashSet
要求存取顺序一致, 用LinkedHashSet
注意:shuffle和sort不能运用到set集合,只能运用到list集合
List集合
体系特点:
1. 元素存取有序 (存入和取出元素的顺序一致) 321->321  排序: 从小到大
2. 元素可以重复  
3. 有索引
List子体系中的实现类都具有上述特点
成员方法:
// 常用特有成员方法 (都是按照索引来操作的)
void add(int index, E element): 将指定的元素, 添加到该集合中的指定位置上
E get(int index): 返回集合中指定位置的元素
E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素
E set(int index, E element): 用指定元素替换集合中指定位置的元素, 返回值的更新前的元素
ArrayList集合
ArrayList底层的数据结构:
数组
ArrayList的特点:
查询快
增删慢
线程不安全, 效率高
ArrayList适用场景:
存储的数据"查询多, 增删少"的场景. 如用一个ArrayList存储中        国城市名称
成员方法:    增 (add)   删(remove)    改(set)    查(get)
LinkedList集合
LinkedList底层的数据结构:
链表
LinkedList的特点:
查询慢
增删快
线程不安全, 效率高
LinkedList适用场景:
存储的数据"查询少, 增删多"的场景. 如用LinkedList实现栈或队列
// 特有成员方法(主要操作开头和末尾元素)

void addFirst(E e): 将指定元素插入此列表的开头
void push(E e): (其实就是addFirst())将元素添加到此列表所表示的栈中

void addLast(E e): 将指定元素添加到此列表的结尾

E getFirst(): 返回此列表的第一个元素

E getLast(): 返回此列表的最后一个元素

E removeFirst(): 移除并返回此列表的第一个元素
E pop(): (其实就是removeFirst())从此列表所表示的栈中弹出一个元素

E removeLast(): 移除并返回此列表的最后一个元素
Vector集合(了解)
Vector底层的数据结构:
数组
Vector的特点:
查询慢
增删快
(同步)线程安全, 效率低
Vector目前几乎没人使用

Set集合
Set集合体系特点:
1. 元素不可重复
2. 没有索引
HashSet集合
Set集合体系特点:
1. 元素不可重复
2. 没有索引
3. 元素存取无序 (存入和取出顺序有可能不一致)
4. 底层采用 哈希表 结构. (查询快)
哈希表 = 数组 + 链表或红黑树
// 常用方法
boolean add(E e): 添加元素, 根据元素的 hashCode() 和 equals() 方法判断是否重复.         重复则不添加并返回false, 不重复则添加并返回true
HashSet原理: 哈希值
哈希值:一个十进制数值, 一般是通过将该对象的内部地址转换成一个整数来实现的
public native int hashCode();
可以调用系统本地代码(C/C++)计算出一个对象地址的哈希值
hashCode()方法的作用
方法内部的算法用于将对象计算为一个哈希值, 便于根据哈希值比较对象是否"相等"
哈希值主要是为了提高对象存储在 哈希表 中的效率
注意:
hashCode() 方法有可能将"不同的对象"计算出"相同的哈希值", 这称为"哈希冲突", 在出现冲突后, 一般再通过 equals() 方法来继续判断对象是否"相等"
HashSet原理: 哈希表结构
特点:        速度特别快
哈希表 = 数组 + 链表或红黑树
数组中存储的每个元素, 是哈希值相同的一组节点的链表或红黑树
HashSet原理: 存储元素不重复的原理
HashSet集合保证添加元素不重复的原理:
        调用 add(E e) 添加元素时, 先调用 hashCode() 获取哈希值, 和当前HashSet集合中的元素比较
                如果哈希值不同, 则认为元素不重复, 添加, 并返回true
                如果哈希值相同, 则可能是哈希冲突, 所以继续调用元素的 equals() 方法和所有哈希值相同的元素比较
                如果 equals() 比较所有元素都没有相同的, 则认为元素不重复, 添加, 并返回true
                如果 equals() 比较出有相同的元素, 则认为元素重复, 不添加, 并返回false
重写hashset和equles方法时,可以自己选择要比较的属性
LinkedHashSet集合
LinkedHashSet特点:
1. 元素存取有序 (存入和取出顺序一致)
2. 元素不可重复
3. 没有索引
LinkedHashSet底层数据结构:
哈希表 + 链表  (也就是: 数组 + 链表或红黑树 + 链表)
其中, 哈希表用于存储数据, 额外的链表用于记录元素添加时的先后顺序, 以便在获取元素时保持顺序一致
可变参数
可变参数的本质就是一个"数组"
格式: 用在方法的参数中
修饰符 返回值类型 方法名(int... 变量名) {
// 可以直接将 变量名 当作 数组名 使用
}
方法名();
注意事项:
1. 可变参数可以传递的参数个数, 可以是 0个, 1个, 多个
2. 一个方法的参数列表中, 只能有一个可变参数
3. 如果方法的参数有多个, 可变参数必须写在参数列表的最后
Collections集合工具类
Collections集合工具类: addAll(), shuffle()
此工具类的静态方法:
static <T> boolean addAll(Collection<? super T> c, T... elements):往集合中添加一些元素
static void shuffle(List<?> list): 打乱集合顺序
static <T> void sort(List<T> list): 将集合中元素按照默认规则排序
static <T> void sort(List<T> list,Comparator<? super T> c):将集合中元素按照指定规则排序

注意:Comparable接口和Comparator接口区别
Comparable: 让JavaBean自身具有可比较性 (自己和其他人比)
Comparator: 定义一个比较器类, 用比较器对象比 (让第三个人来帮两个人比较)

注意:shuffle和sort不能运用到set集合,只能存储list集合

static <T> void sort(List<T> list): 将集合中元素按照默认规则排序
自定义JavaBean对象要想排序, 需要实现 Comparable<E> 接口, 重写 int compareTo(E e) 方法
规则:
this-参数: 升序(从小到大)
参数-this: 降序(从大到小)
例: this.getAge() - o.getAge();  // 按照年龄升序排序
static <T> void sort(List<T> list,Comparator<? super T> c):将集合中元素按照指定规则排序
Comparator使用方式:
1. 定义类实现Comparator<E>接口, 重写 int compare(E o1, E o2) 方法, 泛型为比较元素的类型

规则:
      o1-o2: 升序(从小到大)
      o2-o1: 降序(从大到小)
例:  o1.getAge() - o2.getAge(); // 按照年龄升序
扩展:还可以运用索引增加判断条件
if( o1.getAge() - o2.getAge()==0){     //说明两个人年龄一样,再看其他方面
return  o1.getName().charAt(索引值) - o2.getName().charAt(索引值);
}
2. 在Collections.sort(List<T> list,Comparator<? super T> c)方法中传入自定义比较器对象






0 个回复

您需要登录后才可以回帖 登录 | 加入黑马