A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 木木鱼 中级黑马   /  2018-12-2 15:24  /  760 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

day11

网络编程: 在一定的"协议"下, 实现两台计算机的通信的程序

C/S结构:
全称为Client/Server结构, 是指 客户端 和 服务器 结构
B/S结构:
全称为Client/Server结构, 是指 客户端 和 服务器 结构

网络通信协议:
        通信协议是对计算机必须遵守的规则, 只有遵守这些规则, 计算机之间才能进行通信.
        协议中对数据的传输格式, 传输速率, 传输步骤等做了统一规定, 通信双方必须同时遵守, 最终完成数据交换
分类
TCP/IP协议:
        Transmission Control Protocol/Internet Protocol, 传输控制协议/因特网互联协议.
UDP: User Datagram Protocol, 用户数据报协议
        特点:
                1. 无连接的不可靠协议
                2. 数据按包发送, 64K一个包
                3. 速度快效率高, 容易丢包
        用于视频直播, 网络电话

TCP: Transmission Control Protocol, 传输控制协议
        特点:
                1. 需要建立连接的可靠协议
                2. 数据传输无大小限制
                3. 速度慢效率低
        用于文件下载, 浏览网页
TCP通信的三次握手: TCP协议中, 在发送数据的准备阶段, 客户端与服务器之间的三次交互, 以保证连接的可

         客户端向服务端发送验证信息, 等待服务器确认
         服务端收到验证信息后, 回复客户端验证信息, 同时发送自己的一条验证信息
         客户端收到服务端回复的信息, 确认自己之前发的信息无误, 并再次向服务器发回服务端的验证信息

网络编程三要素:
        1. 通信协议
        2. IP地址
        3. 端口号
网络三要素: 端口号
端口号: 计算机中进程的唯一标识
        端口号的取值范围: 0~65535的整数, 其中0~1024不建议使用
注意:
        通信的两端是2个计算机中的2个程序在相互通信, 所以2个程序都要有端口号. 端口号可以相同, 也可以不同, 相互之间能识别就行
API
java.net.ServerSocket类: TCP服务端
        // 构造方法
        ServerSocket(int port): 创建一个TCP服务端, 并监听指定端口
        // 成员方法
        Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
        void close(): 关闭服务端ServerSocket

java.net.Socket类: TCP客户端
        // 构造方法
        Socket(String ip, int port): 创建TCP客户端对象
        // 成员方法
        OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
        InputStream getInputStream(): 获取输入流, 用于接收数据
        void shutdownOutput(): 关闭输出流, 告知服务端数据发送完毕
        void close(): 关闭客户端Socket

day12
函数式接口概念, 自定义函数式接口
函数式接口: JDK 8 新特性
    有且仅有一个抽象方法的接口, 适用于函数式编程场景的接口
    (默认方法, 静态方法, 私有方法, 与java.lang.Object类中定义相同的抽象方法, 都不算作抽象方法)
自定义函数式接口:
        接口中有且只有一个抽象方法
@FunctionalInterface的作用:
        在接口上使用, 检测当前的接口是否为函数式接口

函数式接口的使用: 代替匿名内部类方式
函数式编程性能浪费的日志案例
日志: 就是存储程序运行信息的文本文件.
    我们平时打印输出一些信息是在控制台上, 如果将这些信息写入文本文件, 这些文件就是日志

Lambda具有延迟执行的特点: 传递Lambda对象, 只有当符合执行条件时, 才会执行代码

API
java.util.function.Supplier<T>函数式接口: 生产型函数式接口
        // 抽象方法
         T get(): 用于获取一个对象或值. 至于获取什么值, 怎么获取, 需要我们根据应用场景编写Lambda来实现

java.util.function.Consumer<T>函数式接口: 消费型函数式接口
        // 抽象方法
        void accept(T t): 用于消费(使用)一个对象或值. 至于怎么消费, 需要我们根据应用场景编写Lambda来实现
        // 默认方法
        default Consumer<T> andThen(Consumer<? super T> after): 拼接两个Consumer接口的Lambda对象实现连续操作. 谁写前面, 谁先消费

java.util.function.Predicate<T>函数式接口: 条件接口, 用于判断
        // 抽象方法
        boolean test(T t): 判断参数传递的对象. 至于怎么判断, 要判断什么, 需要我们编写Lambda表达式来实现
        // 默认方法 (用于连接多个判断条件)
        default Predicate<T> and(Predicate<? super T> other): 与
        default Predicate<T> or(Predicate<? super T> other): 或
        default Predicate<T> negate(): 非, 取相反结果

java.util.function.Function<T,R>: 根据一个T类型的数据得到另一个R类型的数据
        T称为前置条件, 也就是输入(input)的类型
        R称为后置条件, 也就是返回结果(result)的类型
        有进有出, 所以称为"函数Function"
        // 抽象方法
        R apply(T t): 将T转换为R
        // 默认方法
        default <V> Function<T, V> andThen(Function<? super R, ? extends V> after): 拼接多个Function转换

day13

Stream流:
传统方式遍历集合进行过滤传统方式过滤集合中的元素, 要写很多次for循环, 代码重复冗余

Stream流式思想处理数据的方式:
        让代码像流水线一样, 一步一步的对数据进行处理, 得到最终的结果
        流也可以看作是一个容器, 里面可以装很多元素, 形成元素流

流相比于集合的2个优点:
         Pipelining(管道特性)
                Stream流对象的一些方法调用完毕后, 会返回新的Stream流对象, 类型相同, 可链式调用, 类似于"管道"
         内部迭代特性:
                集合遍历通过 Iterator 或者 增强for, 显式的在集合外部进行迭代, 这叫做外部迭代
                Stream提供了内部迭代的方法 forEach(), 可以直接调用遍历方法
使用Stream流的3个步骤:
        获取数据源 (集合, 数组)
        数据转换
        获得结果

API
java.util.Collection<E>接口:
        // 默认方法
        default Stream<E> stream(): 将"集合"转换为Stream对象

java.util.stream.Stream<T>接口: 管道接口, 泛型为流中元素的类型
        // 静态方法
        static<T> Stream<T> of(T... values): 将"数组"转换为Stream对象
        static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b): 合并两个流为新流
        // 抽象方法
        void forEach(Consumer<? super T> action): 遍历流中的元素进行逐一消费 (终结方法)
        long count(): 获取流中的元素个数 (终结方法)
        Stream<T> filter(Predicate<? super T> predicate): 过滤符合条件的结果. 返回过滤后的流
        <R> Stream<R> map(Function<? super T, ? extends R> mapper): 将T元素转换为R元素, 返回新的流
    Stream<T> limit(long maxSize): 从流中获取前maxSize个
    Stream<T> skip(long n): 从流中跳过n个元素, 获取后面的元素


方法引用能简化以下场景: (方法名后不要写小括号)
        1. 通过对象名引用成员方法       对象名::成员方法名
        2. 通过类名引用静态方法         类名::静态方法名
        3. 通过super引用父类成员方法    super::父类方法名
        4. 通过this引用本类成员方法     this::本类方法名
        5. 引用某个类的构造方法         类名::new
        6. 引用创建数组的方法           数据类型[]::new


day14


如何根据颜色判断JUnit测试成功还是失败
如何通过 assert断言 来判断结果
判定结果:
        红色:失败
        绿色:成功.(测试通过)

测试分类:
        黑盒测试:不需要写代码, 给输入值, 看程序是否能够输出期望的值

        白盒测试:需要写代码的. 关注程序具体的执行流程


@Before: 修饰的方法会"在每个测试方法执行 之前"被执行
@After:  修饰的方法会"在每个测试方法执行 之后"被执行

注意:
        @Before, @After 修饰的方法可以有多个, 但是谁先执行是由JUnit内部来决定的, 没有明显的规律
        所以不要写多个@Before, @After 修饰的方法

框架:
        半成品软件. 可以在框架的基础上进行软件开发, 简化编码

反射: 将类的各个组成部分, 封装为其他对象, 这就是反射机制
        成员变量(字段): Field类的对象
        构造方法: Constructor类的对象
        成员方法: Method类的对象
        好处:
                可以在程序运行过程中, 操作这些对象
                 可以解耦, 提高程序的可扩展性

Java代码在计算机中的3个阶段:
        SOURCE: 源代码阶段
        CLASS:     类对象阶段
        RUNTIME: 运行时阶段

注解: Annotation
        JDK 1.5 引入. 也叫元数据, 是一种代码级别的说明
        它可以声明在包, 类, 字段(成员变量), 方法, 局部变量, 方法参数等的前面, 用来对这些元素进行说明

注解: 说明程序的。给计算机看的
注释: 用文字描述程序的。给程序员看的

使用注解: @注解名称
注解的本质:
        注解本质上就是一个接口,该接口默认继承Annotation接口
        public interface MyAnno extends java.lang.annotation.Annotation {}

java.lang.Class<T>类: 表示一个类的字节码对象, 其中包含该类中定义的内容

API
// 获取功能
// 1. 获取成员变量们
        Field[] getFields(): 获取所有 public 的成员变量
        Field getField(String name): 获取指定名称的 public 的成员变量
        Field[] getDeclaredFields(): 获取所有的成员变量, 不考虑权限修饰符
        Field getDeclaredField(String name): 获取指定名称的成员变量, 不考虑权限修饰符
// 2. 获取构造方法们
        Constructor<?>[] getConstructors(): 获取所有 public 的构造方法
        Constructor<T> getConstructor(Class<?>... parameterTypes): 获取指定的 public 构造方法
        Constructor<?>[] getDeclaredConstructors(): 获取所有的构造方法, 不考虑权限修饰符
        Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 获取指定的构造方法, 不考虑权限修饰符
// 3. 获取成员方法们:
        Method[] getMethods(): 获取所有 public 的成员方法
        Method getMethod(String name, Class<?>... parameterTypes) : 获取指定的 public 成员方法
        Method[] getDeclaredMethods(): 获取所有的成员方法, 不考虑权限修饰符
        Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取指定的成员方法, 不考虑权限修饰符
// 4. 获取Class对象代表的类的全类名
        String getName(): 获取当前Class对象代表的类的全类名
// 其他
        T newInstance(): 使用当前类的空参构造创建一个对象
        A getAnnotation(Class<A> annotationClass): 获取当前类的注解对象
        ClassLoader getClassLoader(): 返回该类的类加载器

java.lang.reflect.Field: 表示一个成员变量
        // 成员方法
        void set(Object obj, Object value): 设置指定对象的成员变量的值
        Object get(Object obj): 获取指定对象的成员变量的值
        void setAccessible(boolean flag): 传true时忽略访问权限修饰符的安全检查. 暴力反射

java.lang.reflect.Constructor<T>: 表示一个构造方法
        // 成员方法
        T newInstance(Object... initargs): 使用当前构造方法传入参数, 创建对象
        void setAccessible(boolean flag): 注意: 构造方法不能利用此方法忽略权限, 会抛异常

java.lang.reflect.Method类: 表示一个成员方法
        // 成员方法
        Object invoke(Object obj, Object... args): 使用指定对象和指定参数值调用此方法
        String getName(): 获取方法名
        void setAccessible(boolean flag): 传true时忽略访问权限修饰符的安全检查. 暴力反射

java.lang.ClassLoader: 类加载器
        // 成员方法
        InputStream getResourceAsStream(String name): 读取相对于bin目录中的文件, 返回一个字节流

常用元注解:
        @Target: 描述注解能够作用的位置
                ElementType枚举的常用取值:
                        TYPE:可以作用于类上
                        METHOD:可以作用于方法上
                        FIELD:可以作用于成员变量上
                示例: @Target(value = {ElementType.TYPE, ElementType.METHOD})
        @Retention: 描述注解被保留的阶段
                RetentionPolicy枚举的取值:
                        SOURCE: 保留到源代码阶段
                        CLASS: 保留到类对象阶段
                        RUNTIME: 保留到运行时阶段
                示例: @Retention(RetentionPolicy.RUNTIME):保留注解到class字节码文件中并被JVM读取到
        @Documented: 加上后, 当前注解会被抽取到api文档中
        @Inherited: 加上后, 当前注解会被子类继承

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马