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

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

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与StringBuilder Stringbuffer:线程安全。 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实现KNN算法(附完整源码)
    查看>>
    Objective-C实现koch snowflake科赫雪花算法(附完整源码)
    查看>>
    Objective-C实现KPCA(附完整源码)
    查看>>
    Objective-C实现kth order statistick阶统计量算法(附完整源码)
    查看>>
    Objective-C实现LongestIncreasingSubsequence最长递增子序列算法(附完整源码)
    查看>>
    Objective-C实现LRU 缓存算法(附完整源码)
    查看>>
    Objective-C实现lstm prediction预测算法(附完整源码)
    查看>>
    Objective-C实现Luhn (Mod 10)Algorithm算法(附完整源码)
    查看>>
    Objective-C实现max subarray sum最大子数组和算法(附完整源码)
    查看>>
    Objective-C实现MaximumSubarray最大子阵列(动态规划解决方案)算法(附完整源码)
    查看>>
    Objective-C实现max_heap最大堆算法(附完整源码)
    查看>>
    Objective-C实现md5算法(附完整源码)
    查看>>
    Objective-C实现memoization优化技术算法(附完整源码)
    查看>>
    Objective-C实现memset函数功能(附完整源码)
    查看>>
    Objective-C实现merge insertion sort合并插入排序算法(附完整源码)
    查看>>
    Objective-C实现merge sort归并排序算法(附完整源码)
    查看>>
    Objective-C实现mergesort归并排序算法(附完整源码)
    查看>>
    Objective-C实现miller rabin米勒-拉宾素性检验算法(附完整源码)
    查看>>
    Objective-C实现Miller-Rabin素性测试程序(附完整源码)
    查看>>
    Objective-C实现Miller-Rabin素性测试程序(附完整源码)
    查看>>