java学习(二)

写在前面

今天是学习的第二天,上午帮老师点忙,下午又偷懒到五点,哎,没得自觉,哭。

今日学习内容

映射Map

  1. 特点
    双列集合(存储的是键值对<key,value>):key不允许重复,value允许重复
  2. 方法
    1. 添加元素(若key不重复,返回null;若key重复,先用新值替换旧值,然后返回被替换的值value):
      public V put(K key, V value);
    2. 通过指定的键移除键值对元素(若key存在,则返回它对应的value;否则,返回null
      public V remove(Object key);
    3. 通过指定的键获取值(若key存在,则返回对应的值;否则,返回null):
      public V get(Object key);
    4. 判断集合中是否包含指定的键:public boolean containsKey(K key);
    5. 获取集合中所有的键,用于遍历(迭代器/增强for循环):Set<T> set = map.keySet();

-------------------------------------------------华丽分割线–2020-05-26 19:26-----------------------------------------------
2.6. 方法
获取集合中所有的键值对:Set<Map.Entry<K,V>> entrySet();
Map接口中含有内部接口Entry,当Map对象一创建,那么就会在Map集合中创建个Entry对象,来记录键值对;
Entry获取键值对的方法:
1. K getKey();获取Entry的键
2. V getValue();获取Entry的值

HashMap

  1. 特点
    1. 无序集合(存储的顺序可能与读取的顺序不一致)
    2. 底层是哈希表—查询很快
    3. 键值可以为空
  2. 存储自定义类型
    因为key不允许重复,所以要重写hashCode();equals();,保证key唯一

LinkedHashMap

  1. 特点
    1. 有序集合
    2. 底层是哈希表+链表—查询很快
    3. 键值可以为空

HashTable

  1. 特点(jdk1.0+
    1. 键和值都不允许为空
    2. 实现为同步—速度慢
    3. 逐渐被HashMap取代

集合添加元素新特性

  1. List/Set/Map可以调用静态方法of(E...e)一次性添加多个元素
  2. 前提
    集合中存储的元素个数已经确定,不再改变
  3. 注意
    1. 只有List/Set/Map接口才可以调用of()方法
    2. of()方法的返回值是一个不可改变的数组,不能使用add()/put()方法
    3. Set/Map接口调用of()方法时不能有重复值,否则会抛出异常

String字符串遍历

  1. String类的toCharArray()方法返回字符数组;
  2. String类的length()charAt(索引)遍历字符串

多线程

并发 VS 并行

  1. 并发
    两个或多个事件在同一时间段内发生(交替执行)
  2. 并行
    两个或多个事件在同一时刻发生(同时执行)
    java学习(二)

进程 VS 线程

  1. 进程
    在内存中运行的应用程序
  2. 线程
    进程的一个执行单元,一个进程可以有多个线程
    java学习(二)

多线程的好处

  1. 效率高
  2. 多个线程之间互不干扰

线程调度

  1. 分时调度
    所有线程轮流占用CPU的使用权
  2. 抢占式调度
    优先让优先级高的线程使用CPU,优先级相同的线程,随机选择
    CPU在多个线程之间告高速切换

主线程

执行主方法(main())的线程

单线程

main()方法开始,从上到下依次执行
java学习(二)

多线程

  1. 原理
    java学习(二)
    方法在栈内存中;对象在堆内存中;
    start()每次调用都会开辟另一新栈空间,执行run()方法
  2. 创建多线程方式一
    1. 步骤:
      1. 创建Thread子类
      2. 在子类中重写run()方法,设置线程任务
      3. 创建Thread子类对象
      4. 调用start()开启新线程,执行run()方法
    2. 注意
      1. 两个线程并发运行(main线程和新线程)
      2. 多次启动一个线程是非法的,当线程已经结束,就不能重新启动了
  3. 创建线程方式二
    …待补充
  4. 获取线程名称(run()中调用输出)
    1. 使用Thread类的getName()
    2. 获取正在执行的线程static Thread currentThread(),然后调用getName()
  5. 设置线程名称
    1. void setName(String name);
    2. 用带参数的构造方法创建对象,调用父类的构造方法,让父类给子类设置线程名称

写在最后

线程明天一定学完,加油,冲鸭!!