• 类的内存分配
    • 加载到方法区
    • 对象在堆内存
    • 局部变量在栈内存
  • 判断真实类型,在方法区加载的类
    • 对象.getClass();
    • 类名.class;
  • 手写双向链表
    1. package day1501_手写双向链表;
    2.  
    3. // 链表类
    4. public class SXLianBiao<T> {
    5.  
    6. private Node first; // 头部节点, 初始 null
    7. private Node last; // 尾部节点, 初始 null
    8.  
    9. private int size; // 节点数量,初始值 0
    10.  
    11. public void add(T value) {
    12.  
    13. Node n = new Node();
    14. n.value = value; // 数据封装到 n
    15.  
    16. if (size == ) { // 添加第一个node 对象
    17. n.prev = n; // n向前引用n
    18. n.next = n; // n向后引用n
    19.  
    20. this.first = n; // n 是头部节点
    21. this.last = n; // n 也是尾部节点
    22.  
    23. }else {
    24. n.prev = this.last;
    25. n.next = this.first;
    26. this.last.next = n;
    27. this.first.prev = n;
    28. this.last = n;
    29.  
    30. }
    31.  
    32. this.size++;
    33. }
    34.  
    35. public T get(int index) {
    36.  
    37. Node n = getNode(index);
    38.  
    39. return n.value;
    40. }
    41.  
    42. private SXLianBiao<T>.Node getNode(int index) {
    43. // i越界
    44. // 取头尾
    45. // 取中间
    46.  
    47. if (index < || index >= this.size) {
    48. throw new IndexOutOfBoundsException(""+index+"越界");
    49. }
    50.  
    51. if (index == ) {
    52. return this.first;
    53. }else if (index == this.size-) {
    54. return this.last;
    55. }
    56.  
    57. Node n = null;
    58.  
    59. if (index < this.size/) { // 前边一半
    60. // n 引用first
    61. n = this.first;
    62. // 从 j 到 index
    63. for (int j = ; j < index; j++) {
    64. n = n.next;
    65. }
    66.  
    67. return n;
    68.  
    69. }else { // 后面一半
    70. n = this.last;
    71. for (int j = this.size-; j >= index ; j--) {
    72. n = n.prev;
    73. }
    74. }
    75.  
    76. return n;
    77. }
    78.  
    79. public int size() {
    80. return size;
    81. }
    82.  
    83. // 内部类, 封装节点数据
    84. // 节点类,辅助外部双向链表对象
    85. // 来封装局部数据
    86. private class Node{
    87. T value; // 节点中封装的数据
    88. Node prev; // 引用前一个节点对象
    89. Node next; // 引用后一个节点对象
    90. }
    91. }
  • 异常
    • 异常信息
      • 类型
      • 消息
      • 行号
    • 继承结构
      • Throwable
        • Error
        • Exception
          • 其他Exception
          • RuntimeException
    • 异常的捕获
      • try-catch-finally
    • throws
      • 设置异常的抛出管道
    • throw
      • 手动抛出异常
    • RuntimeException
      • 默认抛出管道
      • 不强制处理,称为非检查异常
    • 其他异常
      • 强制处理
      • 必须二选一
        • try-catch捕获
        • 或者添加异常管道 throws
      • 也叫做检查异常
  • 异常的包装
    • 捕获的异常,包装成另一种类型,再抛出
    • 使用场景
      • 不能抛出的异常,包装成可以抛出的异常再抛出
      • 异常简化- 把多种类型的异常,简化成一种
    • 重写方法时, 异常管道不能比父类方法多
  • 自定义异常
    • 现有的异常类型, 不能标识业务中遇到的所有的错误情况
  • IO
    • 程序内存数据的输入输出
    • 内存数据导出到磁盘文件 是输出; output
    • 磁盘文件数据导入内存,   是输入; input
    • java.io包
      • File
      • InputStream / OutputStream
      • FileInputStream / FileOutputStream
      • ObjectInputStream / ObjectOutputStream
      • Reader / Writer
      • InputStreamReader / OutputStreamWriter
      • FileReader / FileWriter
      • BuffereadReader
      • PrintStream / PrintWriter
    • File
      • 封装一个磁盘路径字符串

        • 文件路径
        • 文件夹路径
        • 不存在的路径 
      • 提供对文件或文件夹的一下操作方法
      • 创建对象
        • new File("磁盘路径");
        • new File("d:/abc", "a.txt"); 
      • 方法
        • 文件或文件夹属性
          • length();

            • 文件字节量 / 1024 = Kb / 1024 = Mb
            • 对文件夹无效
          • getName();
            • 文件名
          • getParent();
            • 父目录
          • getLastModified();
            • 最后修改时间,毫秒值
          • isFile(); // 是否是文件
          • isDirectory(); // 是否是文件夹
          • exists(); // 是否存在
        • 创建/删除文件或文件夹
          • createNewFile();

            • 新建文件

              • 文件已存在,返回 false
              • 文件夹不存在, 会出现异常
          • mkdirs();
            • 创建多层目录
          • mkdir();
            • 创建单层目录
          • delete();
            • 删除文件, 或删除空目录
            • 不是空目录删除会失败
        • 目录列表
          • list();

            • 对目录列表的String[]数组, 存放文件 ,目录名
          • listFiles();
            • 获得file[]数组,存放文件,目录的封装对象
            • 对文件, 不存在的路径,无权进入的目录,列表方法返回 null
  • 流 stream
    • 字节数据的读写, 抽象成数据在管道中流动
    • 流是单方向的
      • 输入流,只能用来读取数据
      • 输出流,从内存输出数据
    • 数据只能从头到尾流动一次
  • InputStream / OutputStream 抽象类
    • 子类, FileInputStream / OutputStream
    • 文件流, 直接插在文件上,直接读写文件数据
    • 方法
      • write(int b);

        • int的四个字节,只输出末尾的一个字节
        • [1][2][3][4]  ---> [4]
        • 所以只能读取0~255 范围内的值
      • write(byte[] , from, length);
        • 输出数组中, from 开始 length 长度的字节
        1. // 新建文件输出流
        2. FileOutputStream outF = new FileOutputStream("/Users/dingzhijie/Desktop/file.txt");
        3. 不管文件是否存在,都会新建一个空文件
        4. 文件夹不存在会出现异常
      • read();
        • 读取一个字节值, 补3个0字节,转成 int 
        • 读取结束,再读取,会返回-1,标识结束
      • read();

java - day015 - 手写双向链表, 异常(续), IO(输入输出)的更多相关文章

  1. java - day016 - IO续(输入输出), 手写双向链表

    课程回顾 对象的创建过程 类加载 加载父类,父类的静态变量分配内存 加载子类,子类的静态变量分配内存 父类静态变量赋值运算, 和静态初始化块 子类静态变量赋值运算, 和子类初始化块 创建对象 创建父类 ...

  2. java 从零开始手写 RPC (05) reflect 反射实现通用调用之服务端

    通用调用 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 java 从零开始手写 RPC (03) 如何 ...

  3. java 从零开始手写 RPC (07)-timeout 超时处理

    <过时不候> 最漫长的莫过于等待 我们不可能永远等一个人 就像请求 永远等待响应 超时处理 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RP ...

  4. java 从零开始手写 RPC (03) 如何实现客户端调用服务端?

    说明 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 写完了客户端和服务端,那么如何实现客户端和服务端的 ...

  5. java 从零开始手写 RPC (04) -序列化

    序列化 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 java 从零开始手写 RPC (03) 如何实 ...

  6. Java修炼——手写服务器项目

    项目工程总览: 1.Dispatcher类(一个请求与响应就是一个Dispatcher) package com.bjsxt.server; import java.io.IOException; i ...

  7. Java精进-手写持久层框架

    前言 本文适合有一定java基础的同学,通过自定义持久层框架,可以更加清楚常用的mybatis等开源框架的原理. JDBC操作回顾及问题分析 学习java的同学一定避免不了接触过jdbc,让我们来回顾 ...

  8. java笔试手写算法面试题大全含答案

    1.统计一篇英文文章单词个数.public class WordCounting {public static void main(String[] args) {try(FileReader fr ...

  9. java 从零开始手写 RPC (01) 基于 websocket 实现

    RPC 解决的问题 RPC 主要是为了解决的两个问题: 解决分布式系统中,服务之间的调用问题. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑. 这一节我们来学习下如何基于 we ...

随机推荐

  1. gen语言

    概率编程语言(PPL)领域正经历着机器学习技术快速发展带来的奇迹般的复兴.在短短的几年里,PPL 已经从一个模糊的统计研究领域发展出十几个活跃的开源方案.最近,麻省理工学院(MIT)的研究人员推出了一 ...

  2. DB2使用MERGE INTO语句实现西虹市首富的新增及更新操作

    首先我们新建一张名为XIHONGSHISHOUFU的表,这张表是评委会初步评选出的西虹市首富的候选人员,下面的SQL语句包含建表和插入数据的部分: CREATE TABLE XIHONGSHISHOU ...

  3. JS的slice、substring、substr字符串截取

    JS中截取一个字符串的三种方法:字符串.slice(开始索引,结束索引)字符串.substring(开始索引,结束索引)字符串.substr(开始索引,截取的长度) 如果需要截取到该字符串的最后,可以 ...

  4. Js把对象数组列表转换成数组

    今天写组件的时候遇到一个问题,就是当我需要对获取到的对象列表进行删减的时候,发现没有合适的方法,比如: //获取图片列表 var imgs = document.getElementsByTagNam ...

  5. Linux18.04换源等等等配置

    root用户 sudo passwd root 安装Tools 文件→其他位置→Vmware Tools→打开终端. 管理员权限→copy→tar -zxvf 文件名解压→打开vmware-tools ...

  6. git rebase VS git merge

    git rebase VS git merge 写在前面 如果你不能很好的应用 Git,那么这里为你提供一个非常棒的 Git 在线练习工具 Git Online(回复公众号「工具」,获取更多内容) , ...

  7. Mac上Docker的安装

    安装 安装包安装 由于历史原因, 本人使用的是安装安装的方式, 这也是很多Windows用户的习惯. 下载地址: https://download.docker.com/mac/stable/Dock ...

  8. 守护进程daemon

    # -*- coding: utf-8 -*- import sys, os, time, atexit from signal import SIGTERM class Daemon: def __ ...

  9. [.Net] - 生成短 Guid 标识符的方法

    产生字符串(例:49f949d735f5c79e) private string GenerateId() { ; foreach (byte b in Guid.NewGuid().ToByteAr ...

  10. Python-18-类的内置属性

    1. __getattr__.set__attr__.__delattr__ class Foo: x=1 def __init__(self,y): self.y=y def __getattr__ ...