zoukankan      html  css  js  c++  java
  • java基础-3

    java基础-3

    API

    Application Programming Interfaces --- 应用程序接口

    Object 顶级父类 Bin --- 二进制 Oct --- 八进制 Dec --- 十进制 Hex --- 十六进制 String 最终类-代表字符串 底层以数组存储 StringBuild效率远高于+, 字符拼接较少用+ ---json StringBuilder和StringBuffer中的方法签名一模一样的。StringBuilder是线程不安全的,StringBuffer是线程安全的 字符串中提供了一系列的操作而不改变原字符串的方法,会产生一个新的字符串 正则表达式--pattern Regular expression --- REGEX 用于指定规则的。 匹配器选择匹配对象 数学类---Math BigDecimal:用于精确存储和运算小数的类。要求参数以字符串形式传递 BigInteger:能存储和计算任意大小的整数的类 包装类 基本类型身上没有属性和方法,为了快捷操作产生了包装类 Void:最终类,不能创建对象 int:Integer char:Character 其他基本类型用首字母大写来表示 自动封箱/拆箱都是JDK1.5的特性 将基本类型的变量直接赋值给了对应的引用类型的对象 --- 自动封箱/自动装箱 将引用类型的对象直接赋值给了对应的基本类型的变量 --- 自动拆箱 对于八种包装类型对应的哈希码都是固定的,不随条件改变。 null的哈希码规定为0 NaN --- 非数字 --- 唯一,和任何值都不相等,包括自己本身 字面量的哈希码是固定不变的 --- 所有的字面量都是存储在运行时常量池 常量池存储的字面量以及自定义常量 日期类 Date:代表日期的类。 Calendar:代表日历的类。 从JDK1.8开始,对时间体系进行了新的划分,将日期和时间进行分离,并且详细区分,从而形成了一个新的包---时间包 java.time 异常--exception Throwable:所有异常的父类 Error:错误 。 一旦出现,不能处理 异常出现之后可以处理 捕获 A. 如果多个异常的处理方式各不一样,可以使用多个catch来分别捕获分别处理 B. 如果所有异常的处理方式都一样,可以捕获一个父类异常进行统一的处理 C. 如果多个异常分成了不同的组来进行出来,那么同一组异常之间可以用|隔开,进行分组处理 --- JDK1.7开始 finally --- 之前无论出现异常与否,都会执行一次 抛出 编译时异常:编译的时候就出现。由于在编译的时候就已经出现,所以要求必须处理 运行时异常:运行的时候才出现。可以处理,可以不处理 --- RuntimeException 自定义异常:定义一个类继承某个异常类,如果继承的是Exception或者是其他的异常,那么定义了一个编译时异常;如果继承的是RuntimeException或者是它的子类,那么就是一个运行时异常 项目处于开发阶段,出现了异常,打印异常的栈轨迹,修改代码 项目已经上线,出现了异常,跳转错误页面,记录错误日志 集合---Collection<E> 存储多个元素的容器 --- 大小不固定 Collection<E> --- 集合顶级接口 <E> 泛型 --- 在集合中,泛型用于定义元素类型 --- 由于泛型的限制,集合中只能存储对象 List---列表 元素有序 --- 保证元素的存入顺序 --- List中的元素是存在下标的 ArrayList --- 列表 底层用数组存储数据。默认初始容量是10,每次扩容是在当前的基础上增加一半。10 -> 15 -> 22. 底层的扩容是基于右移来实现 是一个线程不安全的集合。 LinkedList --- 链表 底层是基于节点来进行存储的。内存空间不连续。增删元素的操作相对简单,查询元素的操作相对复杂。是一个线程不安全的集合。 如果增删次数和查询次数在相差不大的情况下,使用顺序表还是使用链表结构? --- 链表结构,原因是链表对内存的要求更小 顺序表和链表在增删操作时的效率如何? --- 整体效率上,链表要高于顺序表。如果增删位置相对靠前,那么链表效率较高;如果增删位置相对靠后,则顺序表效率较高 Vector --- 向量 是Java中最早的集合。底层是基于数组进行存储的。默认初始容量是10,每次扩容默认增加一倍 --- 基于三元表达式。10 -> 20 -> 40。是一个线程安全的集合 Stack --- 栈 继承了Vector。遵循的原则是后进先出/先进后出。最先放入栈中的元素 --- 栈底元素;最后放入栈中的元素 --- 栈顶元素 将元素放入栈中 --- 入栈/压栈 将元素从栈中取出 --- 出栈/弹栈 Set --- 散列集合 Set中的元素不可重复 HashSet;底层基于HashMap存储的 加载因子过小,会导致内存的浪费,也会导致rehash操作越频繁从而降低效率 加载因子过大,会导致每一个桶中的链表过长从而降低效率 从JDK1.8开始,为了减少扩容次数同时也为了保证每一个桶的查询效率,在桶中的元素超过8个的时候,会采取红黑树结构 Collections---操作集合的工具类 sort---用于对列表进行排序。在排序的时候可以默认升序排序,也可以指定比较规则进行排序。在指定规则的时候需要传入一个Comparator(比较器)对象,重写compare方法,根据返回值的正负来对元素进行排序 Iterator:迭代器。在迭代过程中会对每一个元素进行标记。如果标记状态为false说明该元素要被移除。 Iterable : 实现这个接口的类所产生的对象可以被增强for循环进行遍历。 --- 如果一个对象能够使用增强for循环,那么这个对象对应的类药实现Iterable接口 --- 增强for循环本质上是一个迭代遍历 --- 增强for循环是JDK1.5的特性之一。 泛型即参数化类型 --- ParameterizedType --- JDK1.5的特性之一 将泛型替换为具体类型的过程 --- 泛型的擦除 --- 发生在了编译期 ? extends 类/接口 --- 上边界 ? super 类/接口 --- 下边界 ? 表示通配符 Stream JDK1.8出现的,用于操作集合的流式结构,但不是流。利用stream对象对集合进行批量操作 断言 根据已有条件来对结果进行预测断定。 --- 在Java中,断言不是默认开启的,需要手动开启 -ea Map<K, V> --- 映射 映射的顶级接口 --- 顶级父类Dictionary 键 - key, 值 - value --- 键是唯一的,每一个键都对应了一个值 --- 键值对 --- 一个映射中包含了很多的键值对。 将每一个键值对看做一个对象 --- 代表键值对的接口 --- Map.Entry,可以认为一个Map对象是由多个entry对象组成。 遍历映射

    1.keySet() --- 表示将映射中所有的键放入一个set集合中

    2.entrySet() --- 表示将映射中所有的键值对放入一个set集合中 映射不是集合,但是集合框架的一员 --- Java Collections Framework :包含了数组、集合、映射以及一部分操作它们的工具类 HashMap 默认初始容量是16,默认加载因子是0.75f,每次默认增加一倍。键和值允许是null。如果指定初始容量x, 那么x如果在(2n-1,2n],初始容量一定是2n。 本身是一个异步式线程不安全的映射 Hashtable 默认初始容量是11,默认加载因子是0.75f,每次扩容的时候在当前的基础上增加一倍,再+1。11 -> 23。键和值不允许是null。 Hashtable本身是一个同步式线程安全的映射 ConcurrentHashMap 异步式线程安全的映射 JDK1.5的特性 自动封箱/拆箱 增强for循环 静态导入 可变参数 枚举 泛型 反射(JDK1.4出现,1.5增强) 动态代理 内省 注解 静态导入/静态导包 import static 包名.类名.方法名; 表示导入指定包下的指定类中的指定的静态方法而不导入其他方法 --- 理论上能够提高加载速率,这个提高程度可以忽略不计 --- 对于程序的可阅读性大大降低,如果本类或者父类中存在方法签名一致的方法会导致静态导包失效 File 代表文件或者目录(文件夹)的类。 路径 绝对路径:以盘符或者是/开头的路径 D:aa.txt /home/software 和当前所处的路径没有任何关系,直接定位到指定的路径 相对路径:不以盘符或者是/开头的路径 a.txt 需要以当前的位置来计算另一个位置,路径发生改变的时候能够自动计算 IO流 是Java中一套用于数据传输的API。 IO - Input Output - 输入输出流。输入流指数据从外部流向程序;输出流指数据从程序流向外部 四个基本流都是抽象类,不能直接创建对象 字符流 字节流 FileOutputStream --- 字节输出流,可以向文件中写数据 FileInputStream --- 字节输入流,可以从文件中读取数据 向TXT文件中追加数据 - 数据从程序流向文件 - 输出流 向TXT文件中写入一个字符串 --- 字符流、输出流、和文件相关的流 --- FileWriter 读取文件 - 数据从文件流向程序 - 输入流 读取TXT文件 --- 输入流 字符流 和文件相关 FileReader 流中的异常处理

    1. 将流对象放到try之外声明并且赋值为null,放到try之内创建

    2. 关流之前需要判断流对象是否初始化成功 --- 判断流对象是否为null

    3. 关流之后需要将流对象设置为null

    4. 为了防止关流失败导致数据丢失,需要在写外之后手动冲刷一次缓冲区 缓冲流 BufferedReader --- 提供了缓冲区,能够实现按行读取的效果。 利用FileReader来构建了BufferedReader,然后再BufferedReader对读取功能做了增强,这种方式称之为装饰设计模式 --- 利用了同类对象构建自己对象本身,对对象身上的功能做了增强或者改善 BufferedWriter提供了一个更大的缓冲区 Java中的原生的字符流只能操作字符类文件 txt java html等,但是不能读取office组件 系统流/标准流 系统流都是字节流 System.in 标准输入流 System.out 标准输出流 System.err 标准错误流 转换流 字符流和字节流之间用的转换就是转换流 OutputStreamWriter --- 将字符流转化为字节流 FileWriter是它的子类 InputStreamReader --- 将字节流转化为字符流 FileReader是它的子类 合并流 SequenceInputStream --- 创建输入流分别指向对应的文件,然后需要创建一个Vector集合存放这些输入流,利用Vector集合来产生一个Enumeration对象,使用Enumeration对象来构建合并流,最后利用合并流来读取数据进行合并。 序列化/反序列化流 将对象转化为字节之后进行存储 --- 序列化 --- 持久化 将字节转化为对象的过程 --- 反序列化 注意 1.一个对象想要被序列化,那么它所对应的类必须实现接口 --- Serializable --- 这个接口中没有任何的方法和属性,仅仅起标志性作用 2.用static/transient修饰的属性不会被序列化 3.如果一个类产生的对象允许被序列化,那么这个时候这个类在编译的时候会根据当前类中的属性自动计算一个版本号。当反序列化的时候,拿着对象中的版本号和类中版本号做比较,如果相等,则说明这个对象是这个产生的,可以被反序列化。如果没有手动指定版本号,自动计算版本号,那么就意味着类每变动一次,版本号就要重新计算一次。为了让序列化出去的对象反序列化回来,需要手动指定版本号 --- private static final long serialVersionUID Properties 是一个可以被持久化的映射。键和值的类型都是String properties文件的默认编码就是西欧编码 --- 当向properties文件中存放中文的时候变成了对应的Unicode编码 JUnit ---单元测试 导入单独的测试库。 要求测试的方法做到 “三无”:没有参数、没有返回值、非静态方法 线程 进程 --- 计算机中在执行的任务 --- 在CPU上执行和计算。 一个核上往往只能执行一个进程中的一个线程。---计算机看起来像是在运行多个进程,实际上是因为在计算机中任务切换速度非常快,超过人的反应。--- 进程的执行在宏观上并行的,在微观上是串行的。 线程 --- 进程中的小任务 --- 多线程 定义线程

      1. 写一个类继承Thread类,将要执行的逻辑放到run方法中,创建线程对象,调用start方法来启动线程执行任务

      2. 写一个类实现Runnable接口,重写run方法,创建Runnable对象,然后将Runnable对象作为参数传递到Thread对象中,利用Thread对象来启动线程

      3. 写一个类实现Callable接口,重写call方法。 --- 现阶段要求知道就行 多线程的并发安全问题 多个线程同时执行,而多个线程在执行的时候是相互抢占资源导致出现了不合常理的数据的现象---多线程的并发安全问题 多线程在执行的时候是相互抢占,而且抢占是发生在线程执行的每一步过程中 同步锁机制 利用synchronized --- 同步代码块解决多线程并发安全问题 同步 --- 一段逻辑在同一时间只能有一个线程执行 异步 --- 一段逻辑在同一时间能有多个线程执行 同步一定是安全的 安全不一定同步 异步不一定安全 不安全一定是异步的 从微观上而言,同步一定是安全的,安全也一定是同步的。从宏观上,同步一定是安全的,安全不一定是同步的 需要一个锁对象 --- 要求锁对象要被所有的线程都认识:共享对象,类的字节码(方法区是被线程所共享的),this(必须是同一个对象开启了多个线程) 如果同步方法是一个非静态方法,那么以this作为锁对象;如果同步方法是一个静态方法,那么以当前的类作为锁对象 死锁 --- 由于锁之间相互嵌套并且锁对象不同导致线程之间相互锁死,致使代码无法继续往下 --- 避免死锁:统一锁对象,减少锁的嵌套 活锁 --- 这个资源没有被任何的线程持有占用,导致程序无法往下执行 等待唤醒机制 wait------等待 notify------唤醒 等待唤醒机制必须结合锁来使用,而且锁对象是谁就用谁进行等待唤醒。 线程的状态 创建 可以转为就绪 就绪 可以转为运行或者阻塞 运行/活跃 可以转为阻塞或者消亡 阻塞/挂起 可以转为就绪或者消亡 消亡 线程的优先级 线程的优先级:1-10 理论上,数字越大优先级越高,抢占到资源的概率就越大 实际上,相邻的两个优先级的差别非常不明显。如果优先级差到5个单位及以上,则结果会相对明显一点点 守护线程 守护别的线程。只要被守护的线程结束,那么无论守护线程完成与否都会结束。 在线程中,一个线程要么是守护线程,要么是被守护的线程。当最后一个被守护的线程结束才会导致所有的守护线程结束 --- GC 启动线程的情况

      4. 用户请求创建

      5. 系统自启

      6. 被其他线程启动 线程结束的情况

      7. 被其他线程启动

      8. 寿终正寝:线程执行完成之后自然结束

      9. 他杀:线程被其他请求强制结束

      10. 意外事故:线程执行过程中出现了异常或者错误 设计模式:在软件开发工程中使用的常见的解决问题的方式 单例模式 在全局中只存在一个实例的这种现象 饿汉式:会增加类的加载时间,能够避免的并发问题 懒汉式:减少加载时间,会导致多线程的并发安全问题 装饰模式 利用FileReader来构建了BufferedReader,然后再BufferedReader对读取功能做了增强,这种方式称之为装饰设计模式 --- 利用了同类对象构建自己对象本身,对对象身上的功能做了增强或者改善 套接字 进行网络数据传输的一套API --- 本质上是可以在网络上使用流 网络基本概念 七层模型:物理层 数据链路层 网络层 传输层 - UDP/TCP 会话层 应用层 表示层 --- HTTP、FTP、POP3、SMTP ... IP地址:在网络中标记主机。IPv4 --- 四组数表示一个IP地址,每一组数的取值范围是0-255 10.8.33.5 IPv6 --- 六组数表示一个IP地址 IPv9 端口:计算机与外界交互的媒介 --- 端口号 --- 0~65535 --- 0-1024 域名:各个网站提供的便于记忆的标记 --- news.baidu.com .org .edu DNS解析服务器:将域名和IP地址进行对应的 UDP 基于流的。不建立连接,不可靠。 传输速度相对比较快的。需要对数据进行封包,每个包不超过64K大小。 适用于对速度依赖性比较强但是对可靠性依赖性比较低的场景 --- 视频聊天 --- DatagramSocket DatagramPacket 发送端:

      11. 创建套接字对象

      12. 准备数据包,将数据放入数据包中,并且绑定要发往的地址

      13. 发送数据包

      14. 关流 接收端:

      15. 创建套接字对象,并且绑定要接收的端口号

      16. 准备数据包

      17. 接收数据

      18. 关流

      19. 解析数据 TCP 基于流的。建立连接,经历三次握手,可靠。 但是传输速率相对较慢。理论上不限制传输的数据的大小。 适用于对可靠性的依赖性更高对速度依赖性较低的场景 --- 文件传输 注意:receive/connect/accept/write/read都会产生阻塞。 客户端 - Socket

      20. 创建客户端的套接字对象

      21. 发起连接,绑定连接地址

      22. 获取自带的输出流,写出数据,禁用输出流

      23. 如果服务器端有打回的数据,则需要获取输入流读取数据,禁用输入流

      24. 关流 服务器端 - ServerSocket

      25. 创建服务器端的套接字对象,并且绑定监听的端口号

      26. 接受连接,获取到一个Socket对象

      27. 获取输入流,读取消息,禁用输入流

      28. 如果需要向客户端打回消息,则需要获取输出流写出数据,禁用输出流

      29. 关流 可变参数 可变参数允许传入的参数个数随意变化 可变参数本质是数组 一个方法中只能定义一个可变参数 这唯一的一个可变参数必须定义到参数列表的末尾 枚举 取值相对固定并且能够一一列举。 用enum定义枚举 --- 枚举本身是一个类。 枚举类中的构造方法默认私有,枚举常量必须定义在枚举类的首行。 枚举类中定义任意类型的方法和属性,包括抽象方法 在Java中,所有的枚举默认继承java.lang.Enum JDK1.5开始,允许在switch-case中使用枚举常量 反射 反射:在获取这个类的字节码的基础上来解剖这个类。 Field - 代表属性的类 获取Class对象

      30. 通过类名.class的方式来获取指定类的字节码

      31. 通过对象.getClass的方式来获取对象对应的实际类的字节码

      32. 通过Class.forName(类的全路径名);获取指定类的字节码 Method - 代表方法类 Constructor - 代表构造方法的类 Annotation - 代表注解的类 Package - 代表包的类 注解 给程序看的解释 --- 在Java中,所有的注解的父类是Annotation 注解中的属性只能是基本类型、枚举、String、Class、其他注解类型以及他们所对应的一维数组 元注解 --- 修饰注解的注解 @Target --- 限定注解的使用范围 @Retention --- 限定注解的生命周期 @Documented --- 限定这个注解在使用的时候能否产生到文档中 @Inherited --- 限定此注解可以作用在子类上 JVM参数 标准参数:-d -ea等 非标准参数:-X 扩展参数:-XX: 每一个线程都有一个独立的栈,因此栈内存的大小影响线程的个数 --- JVM限定了栈内存总的大小不能超过2G 或者物理内存的1/3 -Xss128K 表示限定栈内存的大小128K -Xmn 限定新生代的大小 -Xms 限定堆内存的初始大小 -Xmx 限定堆内存的最大值 -Xmn6M -Xms10M -Xmx10M -XX:+PrintGCDetails

  • 相关阅读:
    面向对象设计原则
    简单工厂模式和策略模式结合使用php
    lua string
    js.ajax优缺点,工作流程
    深入理解JavaScript是如何实现继承的
    js中哈希表的几种用法总结
    js,indexOf()、lastIndexOf()
    js获取字符串字节数方法小结
    JS(JavaScript)插入节点的方法appendChild与insertBefore
    js中的this关键字详解
  • 原文地址:https://www.cnblogs.com/Striverchen/p/10519534.html
Copyright © 2011-2022 走看看