博客
关于我
Java学习知识小总结①
阅读量:653 次
发布时间:2019-03-15

本文共 4409 字,大约阅读时间需要 14 分钟。

Java知识点复习

多线程

多线程概念

程序是由一组指令组成的静态代码集合。一个进程是指运行中执行的程序的一次执行过程,系统为每个进程分配独立的内存区域。线程是进程的一部分,作为程序的执行路径,每个线程具有独立的运行栈和程序计数器。

并行与并发

并行:多个CPU同时处理多个任务。例如:多个人同时做不同的事。并发:同一CPU通过时间片轮流处理多个任务。例如:秒杀、多个人做同一件事。

多线程的创建方式

方式一:继承 Thread类

  • 创建继承于 Thread类的子类
  • 重写 run() 方法
  • 创建子类实例
  • 调用 start() 如:new Thread(threadClass).start()
  • 方式二:实现 Runnable接口

  • 创建实现 Runnable 的类
  • 实现 run() 方法
  • 创建实例:new Thread(threadRunnable).start()
  • 两者对比:

    • 优先选择实现 Runnable 接口的方式
    • 原因:没有类的单继承性局限性,更适合处理多线程共享数据

    Thread类常用方法

    start(): 启动当前线程run(): 内部逻辑currentThread(): 获取当前线程getName(): 获取线程名称setName(): 设置线程名称yield(): 释放 CPU执行权join(): 等待线程完成sleep(): 线程睡眠

    线程优先级:MAX_PRIORITY: 10(最高优先级)MIN_PRIORITY: 1(最低优先级)NORM_PRIORITY: 5(默认优先级)

    线程生命周期线程在运行过程中会经历多个状态,常见状态有:未启动、运行、阻塞、等待、终止。线程可以通过 currentState 判断当前状态。

    线程同步解决线程共享数据问题。方式一:同步代码块synchronized(锁){// 共享数据操作}

    方式二:同步方法public synchronized void doSomeThing(){} // 可能是 instance lock,或者 class lock

    线程通信wait()、notify()、notifyAll()方法只能在同步代码块中调用,否则会抛出 IllegalMonitorStateException。sleep()与wait()的区别:sleep(): 可以在任何地方调用,不释放锁。wait(): 只能在同步代码块中调用,并释放锁。

    线程安全单例模式懒汉式实现:public class Bank {private static Bank instance = null;public static Bank getInstance() {if (instance == null) {synchronized (Bank.class) {if (instance == null) {instance = new Bank();}}}return instance;}}

    常见面试问题:如何判断线程的死锁?

    Stringbuffer与StringBuilder

    String不可变,StringBuffer和StringBuilder可变。StringBuffer线程安全,效率低;StringBuilder线程不安全,效率高。建议在单线程环境下使用StringBuilder。

    常用方法:append()delete()setCharAt()replace()charAt()StringBuilder的效率优于 StringBuffer。

    集合

    集合框架提供了静态集合如 singletonSet、singletonList等,不是 thread-safe。具有动态、有序等特性。

    List接口实现类:ArrayList:效率高,线程不安全LinkedList:效率高,线程不安全Vector:反向兼容旧代码,效率低Deque:队列结构

    Map接口-hashmap:哈希表实现-hashset:哈希集合-linkedhashmap:有序哈希表-linkedlist:双向链表

    Map工具类Collections工具类提供:reverse() 调转列表shuffle()随机排序sort()按照自然顺序排序swap()交换元素位置max()、min()获取最大或最小元素

    集合与数组数组的优缺点:

    • 长度固定
    • 字符串复用率高
    • 不能添加元素
    • 遍历效率高

    集合的优点:灵活、高效,支持重复元素、有序/无序,类型安全。

    泛型

    泛型:定义在类、接口、方法中的类型参数。用于高度抽象化,解决类型复杂性。使用场景:

    • 需要存储不同类型数据的集合
    • 传递不确定类型的对象

    示例:List<?>ёр устанmdpante(Collection collection).

    Stringbuffer与StringBuilderStringbuffer:线程安全。 StringBuilder:线程不安全,但效率更高。

    IO流

    FileInputStream和FileOutputStream用于操作文件流。File类用于管理文件路径、目录等操作,常用于文件的创建、删除、读写。

    缓冲流:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter 提高读写效率。

    读写示例:String文件读取:BufferedReader reader = new BufferedReader(new FileReader(new File("test.txt")));String line = reader.readLine();

    多线程示例

    class NumberThread implements Runnable {    @Override    public void run() {        for (int i = 0; i <= 100; i++) {            if (i % 2 == 0) {                System.out.println(Thread.currentThread().getName() + ": " + i);            }        }    }}class NumberThread1 implements Runnable {    @Override    public void run() {        for (int i = 0; i <= 100; i++) {            if (i % 2 != 0) {                System.out.println(Thread.currentThread().getName() + ": " + i);            }        }    }}public class ThreadPool {    public static void main(String[] args) {        ExecutorService service = Executors.newFixedThreadPool(10);        service.execute(new NumberThread());        service.execute(new NumberThread1());        try {            service.shutdown();            service.awaitTermination(100, TimeUnit.MILLISECONDS);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

    三点总结:

  • thread-safe吗?不是
  • 是否正确实现了 Runnable 接口?是
  • 是否正确传递了 Runnable 实例?是
  • 反射机制

    反射机制允许在程序运行时对类进行目光操作,如获取类信息、创建对象、调用方法、访问私有成员等。反射机制的常用场景有:

  • 动态方法调用
  • 生成动态代理
  • 远程调用(RMI)
  • 反射类:Class:类信息Method:方法操作Object:基本反射操作Constructor:构造函数Field:字段操作

    反射示例:

    class BaseService {    protected void doSomething() {}}public class BaseServlet extends HttpService {    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ...    {        try {            String action = req.getParameter("action");            Method method = getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);            method.invoke(this, req, res);        } catch (Exception e) {            e.printStackTrace();        }    }}

    反射机制注意事项:

  • 反射操作增加了方法调用开销
  • 反射可能穿透 Jess superclass
  • 需要处理异常,包含 InvocationTargetException、NoSuchMethodException、IllegalAccessException 等
  • File类

    File类操作文件和目录,常见操作包括:

    • 创建文件/目录
    • 读取/写取文件内容(需使用IO流)
    • 获取文件大小
    • 检查文件存在性
    • 操作文件属性(创建时间、修改时间、文件长度等)

    File构造方式:File(String filePath)File(String parentPath, String childPath)File(File parentFile, String childPath)

    路径分类:

    • 相对路径:相对于当前工作目录
    • 绝对路径:包括盘符

    路径分隔符依赖操作系统:

    • Windows和DOS:“\”
    • UNIX:“/”

    转载地址:http://emymz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现Euclidean GCD欧几里得最大公约数算法(附完整源码)
    查看>>
    Objective-C实现euclideanDistance欧氏距离算法(附完整源码)
    查看>>
    Objective-C实现euler method欧拉法算法(附完整源码)
    查看>>
    Objective-C实现eulerianPath欧拉路径算法(附完整源码)
    查看>>
    Objective-C实现eval函数功能(附完整源码)
    查看>>
    Objective-C实现Exceeding words超词(差距是ascii码的距离) 算法(附完整源码)
    查看>>
    Objective-C实现extended euclidean algorithm扩展欧几里得算法(附完整源码)
    查看>>
    Objective-C实现Factorial digit sum阶乘数字和算法(附完整源码)
    查看>>
    Objective-C实现factorial iterative阶乘迭代算法(附完整源码)
    查看>>
    Objective-C实现factorial recursive阶乘递归算法(附完整源码)
    查看>>
    Objective-C实现FigurateNumber垛积数算法(附完整源码)
    查看>>
    Objective-C实现Gale-Shapley盖尔-沙普利算法(附完整源码)
    查看>>
    Objective-C实现hamiltonianCycle哈密尔顿图算法(附完整源码)
    查看>>
    Objective-C实现hamming numbers汉明数算法(附完整源码)
    查看>>
    Objective-C实现hanning 窗(附完整源码)
    查看>>
    Objective-C实现hanoiTower汉诺塔算法(附完整源码)
    查看>>
    Objective-C实现hardy ramanujana定理算法(附完整源码)
    查看>>
    Objective-C实现highest response ratio next高响应比优先调度算法(附完整源码)
    查看>>
    Objective-C实现hill climbing爬山法用来寻找函数的最大值算法(附完整源码)
    查看>>
    Objective-C实现hornerMethod霍纳法算法(附完整源码)
    查看>>