java - day015 - 手写双向链表, 异常(续), IO(输入输出)
- 类的内存分配
- 加载到方法区
- 对象在堆内存
- 局部变量在栈内存
- 判断真实类型,在方法区加载的类
- 对象.getClass();
- 类名.class;
- 手写双向链表
- package day1501_手写双向链表;
- // 链表类
- public class SXLianBiao<T> {
- private Node first; // 头部节点, 初始 null
- private Node last; // 尾部节点, 初始 null
- private int size; // 节点数量,初始值 0
- public void add(T value) {
- Node n = new Node();
- n.value = value; // 数据封装到 n
- if (size == ) { // 添加第一个node 对象
- n.prev = n; // n向前引用n
- n.next = n; // n向后引用n
- this.first = n; // n 是头部节点
- this.last = n; // n 也是尾部节点
- }else {
- n.prev = this.last;
- n.next = this.first;
- this.last.next = n;
- this.first.prev = n;
- this.last = n;
- }
- this.size++;
- }
- public T get(int index) {
- Node n = getNode(index);
- return n.value;
- }
- private SXLianBiao<T>.Node getNode(int index) {
- // i越界
- // 取头尾
- // 取中间
- if (index < || index >= this.size) {
- throw new IndexOutOfBoundsException(""+index+"越界");
- }
- if (index == ) {
- return this.first;
- }else if (index == this.size-) {
- return this.last;
- }
- Node n = null;
- if (index < this.size/) { // 前边一半
- // n 引用first
- n = this.first;
- // 从 j 到 index
- for (int j = ; j < index; j++) {
- n = n.next;
- }
- return n;
- }else { // 后面一半
- n = this.last;
- for (int j = this.size-; j >= index ; j--) {
- n = n.prev;
- }
- }
- return n;
- }
- public int size() {
- return size;
- }
- // 内部类, 封装节点数据
- // 节点类,辅助外部双向链表对象
- // 来封装局部数据
- private class Node{
- T value; // 节点中封装的数据
- Node prev; // 引用前一个节点对象
- Node next; // 引用后一个节点对象
- }
- }
- 异常
- 异常信息
- 类型
- 消息
- 行号
- 继承结构
- 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 长度的字节
- // 新建文件输出流
- FileOutputStream outF = new FileOutputStream("/Users/dingzhijie/Desktop/file.txt");
- 不管文件是否存在,都会新建一个空文件
- 文件夹不存在会出现异常
- // 新建文件输出流
- read();
- 读取一个字节值, 补3个0字节,转成 int
- 读取结束,再读取,会返回-1,标识结束
- read();
- write(int b);
java - day015 - 手写双向链表, 异常(续), IO(输入输出)的更多相关文章
- java - day016 - IO续(输入输出), 手写双向链表
课程回顾 对象的创建过程 类加载 加载父类,父类的静态变量分配内存 加载子类,子类的静态变量分配内存 父类静态变量赋值运算, 和静态初始化块 子类静态变量赋值运算, 和子类初始化块 创建对象 创建父类 ...
- java 从零开始手写 RPC (05) reflect 反射实现通用调用之服务端
通用调用 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 java 从零开始手写 RPC (03) 如何 ...
- java 从零开始手写 RPC (07)-timeout 超时处理
<过时不候> 最漫长的莫过于等待 我们不可能永远等一个人 就像请求 永远等待响应 超时处理 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RP ...
- java 从零开始手写 RPC (03) 如何实现客户端调用服务端?
说明 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 写完了客户端和服务端,那么如何实现客户端和服务端的 ...
- java 从零开始手写 RPC (04) -序列化
序列化 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 java 从零开始手写 RPC (03) 如何实 ...
- Java修炼——手写服务器项目
项目工程总览: 1.Dispatcher类(一个请求与响应就是一个Dispatcher) package com.bjsxt.server; import java.io.IOException; i ...
- Java精进-手写持久层框架
前言 本文适合有一定java基础的同学,通过自定义持久层框架,可以更加清楚常用的mybatis等开源框架的原理. JDBC操作回顾及问题分析 学习java的同学一定避免不了接触过jdbc,让我们来回顾 ...
- java笔试手写算法面试题大全含答案
1.统计一篇英文文章单词个数.public class WordCounting {public static void main(String[] args) {try(FileReader fr ...
- java 从零开始手写 RPC (01) 基于 websocket 实现
RPC 解决的问题 RPC 主要是为了解决的两个问题: 解决分布式系统中,服务之间的调用问题. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑. 这一节我们来学习下如何基于 we ...
随机推荐
- gen语言
概率编程语言(PPL)领域正经历着机器学习技术快速发展带来的奇迹般的复兴.在短短的几年里,PPL 已经从一个模糊的统计研究领域发展出十几个活跃的开源方案.最近,麻省理工学院(MIT)的研究人员推出了一 ...
- DB2使用MERGE INTO语句实现西虹市首富的新增及更新操作
首先我们新建一张名为XIHONGSHISHOUFU的表,这张表是评委会初步评选出的西虹市首富的候选人员,下面的SQL语句包含建表和插入数据的部分: CREATE TABLE XIHONGSHISHOU ...
- JS的slice、substring、substr字符串截取
JS中截取一个字符串的三种方法:字符串.slice(开始索引,结束索引)字符串.substring(开始索引,结束索引)字符串.substr(开始索引,截取的长度) 如果需要截取到该字符串的最后,可以 ...
- Js把对象数组列表转换成数组
今天写组件的时候遇到一个问题,就是当我需要对获取到的对象列表进行删减的时候,发现没有合适的方法,比如: //获取图片列表 var imgs = document.getElementsByTagNam ...
- Linux18.04换源等等等配置
root用户 sudo passwd root 安装Tools 文件→其他位置→Vmware Tools→打开终端. 管理员权限→copy→tar -zxvf 文件名解压→打开vmware-tools ...
- git rebase VS git merge
git rebase VS git merge 写在前面 如果你不能很好的应用 Git,那么这里为你提供一个非常棒的 Git 在线练习工具 Git Online(回复公众号「工具」,获取更多内容) , ...
- Mac上Docker的安装
安装 安装包安装 由于历史原因, 本人使用的是安装安装的方式, 这也是很多Windows用户的习惯. 下载地址: https://download.docker.com/mac/stable/Dock ...
- 守护进程daemon
# -*- coding: utf-8 -*- import sys, os, time, atexit from signal import SIGTERM class Daemon: def __ ...
- [.Net] - 生成短 Guid 标识符的方法
产生字符串(例:49f949d735f5c79e) private string GenerateId() { ; foreach (byte b in Guid.NewGuid().ToByteAr ...
- Python-18-类的内置属性
1. __getattr__.set__attr__.__delattr__ class Foo: x=1 def __init__(self,y): self.y=y def __getattr__ ...