黑马程序员技术交流社区

标题: day03---day06笔记 [打印本页]

作者: lc1992    时间: 2018-11-20 15:15
标题: day03---day06笔记
                                                                             day03---day06笔记
day03  数据结构 List/Set集合  Collections集合工具类

一数据结构

栈的特点:         先进后出   

栈内存 (main方法先进栈调用, main方法中的其他方法都调用完毕后, main才能出栈)

队列的特点:        先进先出                队列的适用场景:        秒杀, 抢购        在线售票                处理高并发场景

数组的特点:        查询快:                 增删慢:

链表的特点:        查询慢:                增删快:

红黑树:                 是一种 平衡 二叉 查找 树

哈希表           (也就是: 数组 + 链表或红黑树 + 链表)

元素存储过程中就完成了大小排序                        查询比链表快, 增删比数组快 (数组和链表的折中)

二集合 List 包含1 ArrayList,  2LinkedList,   3 Vector(了解)

                     \

                  Collection(集合)

                    /

            set包含  1HashSet,   子类 LinkedHashSet         2  TreeSet

(1)  List集合体系的特点:

        1. 元素存取有序 (存入和取出元素的顺序一致) 321->321  排序: 从小到大

        2. 元素可以重复                         3. 有索引

  List集合方法

1   list.add(3,"神")                指定位置添加指定元素

2   remove(3)                        移除指定位置的元素,返回被移除的元素

3   list,set(4,"a")                指定元素替换指定位置的元素,返回更新前的元素

4   list.get                                list.get(length+1)容易越界异常

ArrayList底层的数据结构:                数组

LinkedList底层的数据结构:              链表

Vector底层的数据结构:                         数组

LinkedList的方法

        void addFirst(E e): 将指定元素插入此列表的开头

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

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

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

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

        E removeFirst(): 移除并返回此列表的第一个元素

        E removeLast(): 移除并返回此列表的最后一个元素

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


(2)  Set集合体系特点:                1. 元素不可重复              2. 没有索引

HashSet特点:                          1. 元素不可重复          2. 没有索引            

                                                3. 元素存取无序 (存入和取出顺序有可能不一致)   

       4. 底层采用 哈希表 结构. (查询快)                       哈希表 = 数组 + 链表或红黑树

大的数量会出现无序,小数量打印时是倒叙的

HashSet原理:                          哈希值        一个十进制数值   模拟的逻辑地址,不是物理地址

自定义类时要重写下面的两个方法,有快捷键

hashCode()方法:                     用于将对象计算为一个哈希值, 便于根据哈希值比较对象是否"相等"

如果哈希值相同, 则可能是哈希冲突, 所以继续调用元素的 equals() 方法和所有哈希值相同的元素比较

LinkedHashSet特点:                    1. 元素存取有序 (存入和取出顺序一致)

    2. 元素不可重复                3. 没有索引

底层采用 哈希表+链表(保证有序,记录元素顺序)

LinkedHashSet底层数据结构:               

可变参数

数据类型确定,个数不确定时用(0--n个)        一个参数列表只能有一个,写在最后

格式: 用在方法的参数中                修饰符 返回值类型 方法名(int... 变量名) {

Collections集合工具类                   静态方法

        static <T> boolean addAll(Collection<? super T> c, T... elements):往集合中添加一些元素

     例子  Collections.addAll(list, 1, 2, 3, 4, 5);                                                            // 添加多个元素

        static void shuffle(List<?> list): 打乱集合顺序

     例子   Collections.shuffle(list);                                                                                  // 打乱

        static <T> void sort(List<T> list): 将集合中元素按照默认规则排序      this-参数:升序        自己比较

sort方法使用前提:实现Comparble(implements Comparble<自定义的类型>),自动重写Compare To

        static <T> void sort(List<T> list,Comparator<? super T> c):将集合中元素按照指定规则排序

Collections.sort(list,new comparator<>(类型){})   这里会有自动重写     升序 o1.getAge-o2.getAge

五 其他

Collection接口: 单列集合的根接口, 规定了公共的功能

        |

        |_ List接口: 元素存取有序, 可重复, 有索引

        |        |_ Vector类: 底层数组, 有索引, 内存空间连续分配, 查询快, 增删慢, 线程安全, 效率低

        |        |_ ArrayList类: 底层数组, 有索引, 内存空间连续分配, 查询快, 增删慢, 线程不安全, 效率高

        |        |_ LinkedList类: 底层链表, 查询慢, 增删快

        |        |_ 遍历

        |                - toArray(): 可以

        |                - 普通for: 可以

        |                - 增强for: 可以

        |                - 迭代器: 可以

        |

        |_ Set接口: 元素不可重复, 无索引

                |_ HashSet类: 底层哈希表, 元素无序, 元素不可重复(用hashCode()和equals()方法来判断)

                |        |_ LinkedHashSet类: 哈希表+链表, 同时具有HashSet的元素不重复, 链表存取有序的特点

                |

                |_ TreeSet类: 底层红黑树结构(存入元素时就会按照元素自然顺序排序).

                |       

                |_ 遍历

                        - toArray(): 可以

                        - 普通for: 不可以, 没有索引, 不能用!

                        - 增强for: 可以

                        - 迭代器: 可以day04 双列集合Map<k,v>   常用方法 遍历一   Map接口: 双列集合的根接口, 规定了共性的方法
|_ HashMap类: 哈希表=数组+链表+红黑树. key无序不可重复, 可存null键null值, 线程不安全效率高
| |_ LinkedHashMap类: 哈希表+链表. 哈希表实现key不可重复, 链表实现key存取有序
|
|_ Hashtable类: 哈希表. Hash特性针对key, key无序不可重复, 不可存null键null值, 线程安全效率低
|_ TreeMap类: 红黑树结构(存入时就排序). Tree特性针对key, 可以按照key排序, 要求key具备比较性
|_ 遍历
  |_ keySet(): 获取所有key组成的Set集合, 遍历Set集合拿到key, 通过Map的get(key)得到value
  | |_ 对于Set<Key>的遍历
  |  |_ 增强for
  |  |_ 迭代器
  |_ entrySet(): 获取所有的key和value组成的Entry对象的Set集合, 遍历出entry对象, 通过entry对象的getKey()获取对应的key, 通过Entry对象的getValue方法获取对应的value
   |_ 对Set<Entry>的遍历
    |_ toArray()
    |_ 增强for
    |_ 迭代器

遍历Map集合
1使用”键找值”的方式遍历
keySet()
   
Set<键> set = map.keySet();
for (键类型 key: set) {
    值 = map.get(key);
}
2使用"entry”的方式遍历Map集合
entrySet()
   
Set<Map.Entry<键, 值>> set = map.entrySet();
for (Map.Entry<键, 值> entry : set) {
    entry.getKey();
    entry.getValue();
}
3能够使用HashMap存储自定义键值对的数据
自定义JavaBean
作key: 重写hashCode() equals()
    作value: 没有要求
day05 异常和线程
一能够辨别程序中异常和错误的区别错误: 以Error
异常: 以Exception结尾二说出异常的分类编译时异常: Exception及其子类(除了RuntimeException及其子类)
运行时异常: RuntimeException及其子类
三使用try...catch关键字处理异常
场景: 方法内部自己能够处理异常
try {
// 可能发生异常的代码
} catch (异常类型1 变量名) {
// 处理异常的代码
}
...
catch (异常类型n 变量名) {
// 处理异常的代码
} finally {
    // 释放资源(无论如何都会执行)
}
四能够开启新线程第一种: 继承Thread类
1. 定义类, 继承Thread类
2. 重写run()方法, 定义线程要执行的任务
3. 创建子类对象, 调用 start() 启动线程
day06 线程 同步 线程间通信
一Java中多线程运行原理
随机性
抢占式, CPU高速随机切换执行(本质), 多个线程抢夺CPU的执行资源
内存
每个线程都有各自栈, 堆共用

Java中实现接口的方式创建多线1. 定义类, 实现Runnable接口
2. 重写run()方法, 定义任务代码
3. 创建Runnable实现类任务对象
4. 创建Thread类对象, 同时传入任务对象
5. 使用Thread对象调用start()启动线程
三同步方法解决线程安全问题
修饰符 synchronized 返回值类型 方法名(参数) {   
}
// 该类的字节码对象 Class对象
修饰符 static synchronized 返回值类型 方法名(参数) {
}
1. 对象.getClass()
2. 类名.class
3. Class.forName("类全名")
四 其他
对象并指定线程名
// 成员方法
    void run(): 用于让子类重写, 表示该线程要执行的任务.不能直接调用
    void start(): 启动线程, 即让线程开始执行run()方法中的代码
    String getName(): 获取线程的名称
    void setName(String name): 设置线程名称
// 静态方法
    static Thread currentThread(): 返回对当前正在执行的线程对象的引用
    static void sleep(long millis): 让所在线程睡眠指定的毫秒
// 成员方法 (只能通过"锁对象"调用)
void notify(): 随机唤醒在同一个锁对象上的某一个处于等待状态的线程
void notifyAll(): 唤醒所有在同一个锁对象上处于等待状态的线程
void wait(): 让当前线程处于无限等待状态
void wait(long timeout): 让当前线程处于计时等待状态, 时间到或被唤醒后结束此状态
void wait(long timeout, int nanos): 让当前线程处于计时等待状态, 时间到或被唤醒后结束此状态









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2