Java回炉学习(七)

1. 泛型

  1. 泛型的好处:1. 编译时,检查添加元素的类型,提高了安全性 2. 减少了类型转换的次数,提高效率
  2. //泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型, // 或者是某个方法的返回值的类型,或者是参数类型
  3. 在给泛型指定具体类型后,可以传入该类型或者其子类类型泛型使用形式
  4. 给泛型指向数据类型是,要求是引用类型,不能是基本数据类型
  5. 普通成员可以使用泛型(属性、方法),使用泛型的数组,不能初始化静态方法中不能使用类的泛型,泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型),如果在创建对象时,没有指定类型,默认为Object
  6. 接口中,静态成员也不能使用泛型(这个和泛型类规定一样)泛型接口的类型,在继承接口或者实现接口时确定,没有指定类型,默认为Object
  7. 泛型的继承和通配符:1. 泛型的继承和通配符 2. <? extends A>:支持A类以及A类的子类,规定了泛型的上限 3. <? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限

2. JUnit

  1. JUnit是一个Java语言的单元测试框架
  2. 多数Java的开发环境都已经集成了JUnit作为单元测试的工具

3. 多线程基础

  1. 线程由进程创建的,是进程的一个实体一个进程可以拥有多个线程

  2. 单线程:同一个时刻,只允许执行一个线程,多线程:同一个时刻,可以执行多个线程,比如: 一个qq进程,可以同时打开多个聊天窗口,-个迅雷进程,可以同时下载多个文件

  3. 并发:同一个时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单的说,单核cpu实现的多任务就是并发。

  4. 并行:同个时刻,多个任务同时执行。多核cpu可以实现并行。并发和并行

  5. 创建线程的两种方式:

    • 继承Thread类,重写run方法
    • 实现Runnable接口,重写run方法
  6. start0() 是本地方法,是 JVM 调用, 底层是 c/c++实现,真正实现多线程的效果, 是 start0(), 而不是 run

  1. start()方法调用start0()方法后,该线程并不一定会立马执行,只是将线程变成了可运行状态。具体什么时候执行,取决于CPU,由CPU统一调度。

  2. 代理模式(分为静态代理和动态代理,原理大同小异,只是实现方式不同,动态代理使用反射加载类):在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象

    public class Thread02 {public static void main(String[] args) {Dog dog = new Dog();//dog.start(); 这里不能调用start//创建了Thread对象,把 dog对象(实现Runnable),放入ThreadThread thread = new Thread(dog);thread.start();//        Tiger tiger = new Tiger();//实现了 Runnable
    //        ThreadProxy threadProxy = new ThreadProxy(tiger);
    //        threadProxy.start();}
    }class Animal {}class Tiger extends Animal implements Runnable {@Overridepublic void run() {System.out.println("老虎嗷嗷叫....");}
    }//线程代理类 , 模拟了一个极简的Thread类
    class ThreadProxy implements Runnable {//你可以把Proxy类当做 ThreadProxyprivate Runnable target = null;//属性,类型是 Runnable@Overridepublic void run() {if (target != null) {target.run();//动态绑定(运行类型Tiger)}}public ThreadProxy(Runnable target) {this.target = target;}public void start() {start0();//这个方法时真正实现多线程方法}public void start0() {run();}
    }class Dog implements Runnable { //通过实现Runnable接口,开发线程int count = 0;@Overridepublic void run() { //普通方法while (true) {System.out.println("小狗汪汪叫..hi" + (++count) + Thread.currentThread().getName());//休眠1秒try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if (count == 10) {break;}}}
    }

    定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

  3. java是单继承的,在某些情况下一个类可能已经继承了某个父类,这时在用继承Thread类方法来创建线程显然不可能了。java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建线程

  4. 继承 Thread vs 实现 Runnable 的区别:

    • 从java的设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jdk帮助文档我们可以看到Thread类本身就实现了Runnable接口
    • 实现Runnable接口方式更加适合多个线程共享一个资源的情况, 并且避免了单继承的限制,建议使用Runnable
  5. 线程终止: 1. 当线程完成任务后,会自动退出。2. 还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式

  6. start底层会创建新的线程,调用run, run 就是一个简单的方法调用,不会启动新线程

  7. 线程优先级的范围,interrupt,中断线程,但并没有真正的结束线程。所以一般用于中断正在休眠线程

  8. sleep:线程的静态方法,使当前线程休眠

  9. yield:线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功

  10. join:线程的插队。插队的线程旦插队成功, 则肯定先执行完插入的线程所有的任务

  11. 用户线程:也叫工作线程,当线程的任务执行完或通知方式结束

  12. 守护线程:一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束,常见的守护线程:垃圾回收机制

  13. 线程状态转换图

4. 线程的同步

  1. 在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性。也可以这里理解:线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作.

  2. 分析同步原理:

  3. 互斥锁:Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问同步的局限性:导致程序的执行效率要降低同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象)同步方法(静态的)的锁为当前类本身。

  4. 同步方法如果没有使用static修饰:默认锁对象为this如果方法使用static修饰,默认锁对象:当前类.class

  5. 释放锁的情况

    • 当前线程的同步方法、同步代码块执行结束

    • 当前线程在同步代码块、同步方法中遇到break、return。

    • 当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束

    • 当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。

  6. 下面操作不会释放锁:

  • 线程执行同步代码块或同步方法时,程序调用Thread.sleep()、 Thread.yield()方法暂停当前线程的执行,不会释放锁
  • 线程执行同步代码块时,其他线程调用了该线程的suspend(方法将该线程挂起,该线程不会释放锁。 提示:应尽量避免使用suspend()和resume()来控制线程,方法不再推荐使用

5. IO流

  1. 输入流:数据从数据源(文件)到程序(内存)的路径;输出流:数据从程序(内存)到数据源(文件)的路径

  1. 流的分类:1. 按操作数据单位不同分为:字节流(8 bit)二进制文件,字符流(按字符)文本文件 2. 按数据流的流向不同分为:输入流,输出流 3. 按流的角色的不同分为:节点流,处理流/包装流

  1. IO 流体系图-常用的类

  1. FileInputStream的使用,单个字节的读取,效率比较低,使用 read(byte[] b) 读取文件,提高效率

  2. FileOutputStream 介绍:

  1. FileWriter使用后,必须要关闭(close)或刷新(flush),否则写入不到指定的文件!

  2. 节点流和处理流:节点流可以从一个特定的数据源读写数据,如FileReader、 FileWriter

  1. 处理流**(也叫包装流)是"连接”在已存在的流(节点流或处理流)之上**,为程序提供更为强大的读写功能,也更加灵活,如BufferedReader、BufferedWriter

  1. 节点流和处理流一览图

  + 节点流是**底层流/低级流,直接跟数据源相接**。+ 处理流(包装流)包装节点流,**既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出**。+ **处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式**,不会直接与数据源相连[模拟修饰器设计模式=》小伙伴就会非常清楚.]
  1. 处理流的功能主要体现在以下两个方面:

    • 性能的提高:主要以增加缓冲的方式来提高输入输出的效率。
    • 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据, 使用更加灵活方便

6. 装饰器模式

  1. 在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。

  2. 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

  3. 装饰(Decorator)模式的主要优点有:

    • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
    • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
    • 装饰器模式完全遵守开闭原则
    • 其主要缺点是:装饰模式会增加许多子类,过度使用会增加程序得复杂性
  4. 装饰器模式代码示例(节点流和处理流)

    public abstract class Reader_ { //抽象类public void readFile() {}public void readString() {}//在Reader_ 抽象类,使用read方法统一管理.//后面在调用时,利于对象动态绑定机制, 绑定到对应的实现子类即可.//public abstract void read();
    }
    //节点流
    public class StringReader_ extends Reader_ {public void readString() {System.out.println("读取字符串..");}
    }
    //节点流
    public class FileReader_ extends Reader_ {public void readFile() {System.out.println("对文件进行读取...");}
    }
    //包装流
    public class BufferedReader_ extends Reader_{private Reader_ reader_; //属性是 Reader_类型//接收Reader_ 子类对象public BufferedReader_(Reader_ reader_) {this.reader_ = reader_;}public void readFile() { //封装一层reader_.readFile();}//让方法更加灵活, 多次读取文件, 或者加缓冲byte[] ....public void readFiles(int num) {for(int i = 0; i < num; i++) {reader_.readFile();}}//扩展 readString, 批量处理字符串数据public void readStrings(int num) {for(int i = 0; i <num; i++) {reader_.readString();}}
    }
    public class Test_ {public static void main(String[] args) {BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_());bufferedReader_.readFiles(10);//bufferedReader_.readFile();//Serializable//Externalizable//ObjectInputStream//ObjectOutputStream//这次希望通过 BufferedReader_ 多次读取字符串BufferedReader_ bufferedReader_2 = new BufferedReader_(new StringReader_());bufferedReader_2.readStrings(5);}
    }
    

Java回炉学习(七)相关推荐

  1. Java回炉学习(三)

    Java回炉学习(三) 1. 单例模式 构造器私有化 -> 防止直接 new 类的内部创建对象 向外暴露一个静态的公共方法,返回单例对象 一个类有且只有一个适用 2. 饿汉式和懒汉式的区别 二者 ...

  2. Java回炉学习(一)

    Java回炉学习(一) 参考至:韩顺平_循序渐进学java 1. JDK.JRE基本介绍 JDK全称(Java Development Kit,Java开发工具包) JDK=JRE+Java开发工具( ...

  3. Java多线程学习七:线程池的 4 种拒绝策略和 6 种常见的线程池

    以便在必要的时候按照我们的策略来拒绝任务,那么拒绝任务的时机是什么呢?线程池会在以下两种情况下会拒绝新提交的任务. 第一种情况是当我们调用 shutdown 等方法关闭线程池后,即便此时可能线程池内部 ...

  4. [初级]Java命令学习系列(七)——javap

    转载自 [初级]Java命令学习系列(七)--javap javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码. 一般情况下,很少有人使用javap对class文件 ...

  5. JAVA视频学习笔记-马士兵(七)

    `JAVA视频学习笔记-马士兵` 容器_API_Collection1(20200622) 容器_Collection2(20200623) 容器_Iterator(20200624) 容器_Enha ...

  6. Java入门学习注意事项有哪些?

    想要学好java技术,做好学习规划路线和注意事项是非常重要的,尤其是零基础学员,Java涉及到的知识点非常多,我们需要制定合理的Java学习路线图,这样会事半功倍,下面小编和大家总结一下Java入门学 ...

  7. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  8. Java虚拟机学习(3): 类加载机制

    类加载机制 JVM把class文件加载的内存,并对数据进行校验.转换解析和初始化,最终形成JVM可以直接使用的Java类型的过程就是加载机制. 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的生命 ...

  9. 成都两年JAVA工程师_成都Java工程师学习路线

    成都Java工程师学习路线.java分成J2ME(移动应用开发),J2SE(桌面应用开发),J2EE(Web企业级应用),所以java并不是单机版的,只是面向对象语言.建议如果学习java体系的话可以 ...

最新文章

  1. Arduino处理STM32中的多个串口通讯问题
  2. 使用Spring Boot,JHipster和React构建照片库PWA
  3. autohotkey实例+懒人包_懒人福音——GitHub 热点速览 Vol.42
  4. RocketMQ如何保证消息不丢失? 如何快速处理积压消息?
  5. mysql查询优化not in,mysql not in如何优化
  6. xPath(他山之石)
  7. 你发这些什么目的_淘宝客怎么发朋友圈?淘宝客怎么通过朋友圈引流?
  8. Atitit 群控云控资料索引index cyonkon yunkon cyonkonYonkon群控云控方面资料.rar C:\Users\ATI\Documents\cyonkonYonko
  9. 华为nova 2 Plus魔镜版语音助手逗趣玩不停
  10. Forth 常见问题解答
  11. 基于jsp+mysql+Spring+mybatis的SSM健身房管理系统
  12. 怎么注销百度云服务器账号,百度网盘怎么注销账号?账号注销方法一览
  13. 什么是数据库分组查询(详解)
  14. 思科三层交换机不同vlan互通_cisco(三层交换和动态路由,不同vlan间的通信,静态路由实现全网互通)...
  15. Android10.0 Service启动源码解析
  16. 线程安全——strtok VS strtok_r
  17. 蓝桥杯真题:数字三角形
  18. 马云:今天互联网创业还靠免费就是找死
  19. 如何弹出QQ临时对话框,实现不添加好友的在线交谈效果。
  20. 深度理解互联网思维,不可不读的50本书(记录下,后面读)

热门文章

  1. 股票配对交易策略-最小距离法
  2. python爬虫进阶-同城旅游酒店评价(JS逆向)
  3. 阿里云面经之实习二面
  4. 安卓巴士总结了近百个Android优秀开源项目
  5. ##英语文本的单词统计 排序并输出前5%
  6. 有关HTML的学习笔记
  7. Qt客户端套接字QTcpSocket通过bind指定本地ip
  8. android 取消蓝牙配对框 实现自动配对 输入PIN码
  9. Webpack项目中引入Bootstrap4.x
  10. Python飞机大战(究极迫害版)