自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(126)
  • 收藏
  • 关注

原创 传输层协议

传输层的两层协议.一是UDP,二是TCPUDP的特点是无连接,不可靠,面向数据报无连接:拿到对方的端口号和ip就直接进行数据传输,不用建立连接不可靠:没有相关可靠的机制保证数据一定到达,发送后可能对方没收到面向数据报:不能灵活的控制读写数据的次数和数量UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部).然而64K在当今的互联网环境下, 是一个非常小的数字TCP的特点是有连接,可靠传输,面向字节流可靠的意思是不能保证对方100%的收到我

2020-07-10 12:13:06 283

原创 http服务器-第三次实现

此版本的特点:支持返回一个静态的html文件解析处理cookie(把cookie处理成键值对结构)解析处理body(把body中的数据处理成键值对结构)实现一个完整的登陆功能(session的简单实现)

2020-07-01 16:10:55 129

原创 单双向链表的实现

无头单向链表:class Node { public int val; public Node next; public Node (int val) { this.val = val; }}public class SingleLinkedList { Node head; public SingleLinkedList() { this.head = null; } public void addFi

2020-06-30 10:24:35 159

原创 HTML简单认识

标签:开始标签: 结束标签: 这个标签是最顶层的标签,并且大部分的html标签,是开始和结束成对出现的 用来存放html的一些属性信息,或者引用的外部资源(css,js,图片)head一般不会影响到页面的界面显示. 存放界面上要显示的内容html中的标签有很多,不同的标签表示的意义也不同.(也有些标签本质上没啥区别)表示页面的标题 用来表示需要显示的正文 默认独占一行(块级元素) 默认不独占一行(内联元素)但是都可以借助CSS来修改,其他的html标签大多都可以归类到这两类中.

2020-06-29 16:29:22 155

原创 http服务器-第二次实现

请求类import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map;// 表示一个 HTTP 请求, 并负责解析.public class HttpRequest { private String method;

2020-06-29 15:05:40 104

原创 http服务器-第一次实现

import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class HttpServerV1 { // HTTP 底层要基于 TCP 来

2020-06-29 15:03:42 118

原创 TCP 服务器

TCP客户端import java.io.*;import java.net.Socket;import java.util.Scanner;public class TcpEchoClient { // 1. 启动客户端(一定不要绑定端口号) 和服务器建立连接 // 2. 进入主循环 // a) 读取用户输入内容 // b) 构造一个请求发送给服务器 // c) 读取服务器的响应数据 // d) 把响应数据显示到界面上. priva

2020-06-29 15:02:18 154

原创 UDP版本服务器

什么是客户端: 主动发起请求的一方. 客户端给服务器发送的数据是 “请求” (Request)什么是服务器: 被动接受请求的乙方. 服务器给客户端发回的数据"响应" (Response)但是服务器不知道什么时候客户端会发起请求,服务器只能提前准备好,并且一直等待下面介绍两个概念ip地址:用来识别互联网上的一台主机的位置 ip本质上是一个32位的整数,常用3个点把这个数分成四个部分,每个部分一个字节(0-255),这就是"点分十进制"端口号:用来区分一台主机上的哪个应用程序 端口号就是一个整数,取值

2020-06-22 12:27:47 252

原创 网络杂记

协议:协议的意思就是字面的意思,指通信双方达成的一种共识协议就是一种约定,通信双方都认可这样的约定之后,才能进行正确传输协议往上更进一步就是 标准 (大家都达成的协议)那么网络中的协议具体有哪些呢,大佬对这些协议分了层首先为什么要分层,分层带来了什么好处分层能够避免某个协议过于庞大复杂(和写代码是一个道理,如果某个文件太大了,就要拆分多个文件)分层之后,协议之间"解耦合"了,上层协议不需要理解下层协议的细节实现,相当于"封装"分层之后,任何层次的协议,都可以灵活替换.实际网络通信中的协

2020-06-21 08:20:16 165

原创 序列化和反序列化记录下

序列化:把一个结构化数据(对象)变成一个二进制的bit流(可以把这个bit流保存到文件,或者通过网络传输)反序列化:把二进制的bit流还原会原来的对象序列化和反序列化的最大目的:就是为了让对象能通过网络传输/能够在文件中保存序列化和反序列化的过程中要保证"信息不丢失",如果丢失了,就无法还原出一摸一样的对象了java对象序列化1.JSON序列化2.XML3.Protostuff4.Hession5.Dubbo Serialization6.FST7.自定义协议进行序列化 (很简单,也很

2020-06-19 10:35:52 100

原创 字符流操作 FileReader,FileWriter,BufferedReader,BufferedWriter

字符流的用法和字节流对象非常相似,只是有一些细节不一样.比如:字节流读写操作以byte为单位,缓冲区是byte[]字符流读写操作以char为单位,缓冲区是char[]操作:复制test1.txt的内容到test2.txt private static void copyFile() { try(FileReader fileReader = new FileReader("E:/BaiduNetdiskDownload/test.txt"); File

2020-06-19 10:31:55 195

原创 BufferedInputStream,BufferedOutputStream相关操作

BufferedInputStream,BufferedOutputStream 这两个类内置了缓冲区,缓冲区本质上就是一块内存空间,缓冲区存在的意义就是为了提高程序的效率.程序访问内存比程序访问磁盘要快很多IO操作肯定要涉及到磁盘访问,一般认为IO次数越多,整体的效率就越低写磁盘的时候,每次读写一个字节,分100次读写,效率远远低于一次读写完100个字节当文件剩余的内容比较多的时候,一次read就会把缓冲区填满此时返回的len值就是缓冲区的长度当文件剩余内容不足缓冲区长度的时候,就会把剩余的内

2020-06-19 08:14:50 167

原创 字节流的操作后续

续上篇,完成了复制一jpg文件的时候还有一处问题,就是代码运行过程中,可能会抛出异常,程序可能会终止,这样close操作就会运行不到从而可能导致文件资源泄露.那么我们应该使用try{}catch{}语句块来包裹之前的语句.所以对上篇结尾的代码就需要改进得到: private static void copyFile(String srcPath, String destPath) { FileInputStream fileInputStream = null;

2020-06-19 07:28:08 99

原创 字节流的简单操作 (fileInputStream, fileOutputStream)

流上篇中的File能进行一些常规的文件操作,但是没有读写两个核心操作流(Stream)就是Java中针对文件操作,又进行了进一步的抽象流是一组类/一组API,描述了如何来进行文件读写操作不同的类的读写方式都会存在差异图中黄色部分为常用类.所有的IO流相关的类,一共分成两个大的部分字节流 读写数据以字节位基本单位 (byte)字符流 读写数据以字符位基本单位 (char)当我们处理文本文件的时候,使用字符流当我们处理二进制文件的时候,使用字节流区分二进制文件和文本文件的

2020-06-18 12:51:38 465

原创 Java中的IO操作---File相关操作

文件Java中使用File类来描述一个文件内核中需要管理文件:磁盘中有哪些文件以及哪些硬件设备 他的管理方式就是描述+组织应用程序中也需要管理文件(相当于在管理当前进程打开/关联到的文件): 描述+组织描述是使用File类描述,包含了文件的各种属性,以及提供了一些方法进行简单的文件操作组织是用相应的数据结构进行组织操作系统对于硬件设备进行了进一步的抽象: 把硬件设备都视为一个个文件.exe .txt都是狭义上的 普通文件c:windows 这是目录文件快捷方式是链接文件有一类特殊的文

2020-06-18 11:26:32 92

原创 一道类的执行顺序的习题

题目:牛客链接: https://www.nowcoder.com/questionTerminal/af8cf04602e045958d13d16d20a1bf02Test.main() 函数执行后的输出是():public class Test { public static void main(String [] args){ System.out.println(new B().getValue()); } static class A{

2020-06-17 09:47:31 223

原创 Java重载与重写的区别

重载(Overloading)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。多个同名函数同时存在,具有不同的参数个数/类型。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。父类方法被默认修饰时,只能在同一包中,被其子类被重写,如果不在同一包则不能重写。父类的方法被protoeted修饰时,不仅在同一包中

2020-06-15 20:31:16 441

原创 事务详解

MySQL的事务索引也是一种数据结构,目的时为了加快查找效率(会影响到插入,删除,修改的效率)索引适用于一写多读的情况.索引的核心结构:B+树为什么不用hashMap呢因为哈希表只能查找key相等的情况,因为不能按范围查找为啥不用红黑树呢?红黑树只有两个叉,意味着表示数据量大的时候,高度就会比较高,具体操作效率就越慢B树是N叉树B+树把数据存在叶子节点上,叶子节点直接用链表来连接索引结构不包含数据,直接存到内存即可使用链表就更方便进行范围查找不是B树不好,而是B树再M

2020-06-15 15:36:51 126

原创 线程池的代码实现

线程池:已经包含了一些线程,让我们直接去使用.而避免了频繁创建销毁现成的开销线程池的核心操作:1.execute:把一个任务加到线程池中2.shutdown:销毁线程池中的所有线程线程池的组成部分:(需要管理两个内容:要执行的任务,执行任务的线程们) 1.先有一个类,表示工作线程 2.还得有一个类,来描述具体线程要做什么(借助Runnable接口就可以表示) 3.还需要一个数据结构来阻止若干个任务(BlockingQueue 阻塞优先队列) 4.还需要有一个数据结构,来组织若干个线程,

2020-06-15 14:43:42 195

原创 定时器

定时器定时器是多线程编程中的一个重要的常用组件好比一个闹钟,有些逻辑并不像立刻执行,而是要等一定的事件之后,再来执行定时器的应用场景非常广泛,网络编程中特别常见定时器的构成:使用一个Task类来"描述"一段逻辑 (一个要执行的任务),同时也要记录这个任务在啥时候执行使用一个阻塞优先队列,来组织若干个Task,既支持阻塞的特性又支持按优先级的"先进先出" 实质上是一个堆(此处使用优先队列是为了保证队首元素就是那个最早要被执行的任务)判断当前队列中是否有任务时间到了,需要

2020-06-13 23:49:37 140

原创 多线程--阻塞队列

阻塞队列阻塞队列是并发编程的一个重要基础组件.帮助我们实现"生产者-消费者模型"这是一种典型的处理并发编程的模式阻塞队列就可以作为生产者-消费者模型的交易场所重要的特点:如果生产者生产的较快,生产者就要等待,一直等到消费者又消费了一些数据也就是交易场所上有了空位才能进行生产如果消费者消费的过快,那么消费者就要等待,一直等到生产者生产了新的元素,那么消费者才能继续消费阻塞队列的特点也是如此如果入队列操作太快,队列满了,继续入队列,就会阻塞,一直阻塞到有其他线程去消费队列了,才能继续入

2020-06-13 22:26:51 462

原创 Java中Synchronized的用法

https://blog.csdn.net/luoweifu/article/details/46613015

2020-06-13 20:19:51 107

原创 设计模式--单例模式

静态条件问题:还没做好准备却收到了通知notify是唤醒一个线程notifyAll是唤醒所有进程(一般更推荐notify)wait和sleep的对比[????] 这俩完全没有关系 sleep是让当前线程休眠 wait/notify机制一定程度的影响线程调度.多线程的一些案例:单例模式 是一种常见的"设计模式" ????设计模式:软件开发中,涉及到的场景有很多也会有很多变化(软件开发是一件比较复杂的事情)很多新手如果不加限制乱开发此时往往就会陷入到很多很多的问题中于是

2020-06-12 08:11:48 89

原创 对象等待集wait和notify方法

对象等待集 本质上是让程序员有一定的手段来干预线程的调度场景:当线程1上CPU之后,发现执行条件不满足于是线程1就释放锁下CPU了当一个线程释放锁之后,其他线程就要开始竞争这把锁,但是线程1也要参与竞争然后又让线程1竞争上了,他又进行了上锁发现执行条件还是不满足,于是释放锁下CPU然后又重新开始竞争然后线程1又竞争上了…于是线程1就频繁的获取锁释放锁最终导致其他线程就被"饿死"了严格意义上这不算线程不安全,但是这会影响程序的运行效率 这里还是抢占式执行导致的,因为线程运行有优先

2020-06-10 21:38:03 299 1

原创 内存可见性

内存可见性:先看一段代码:public class TestDemo { static class Counter { public int counter = 0; } public static void main(String[] args) { Counter counter = new Counter(); Thread t1 = new Thread(){ @Override

2020-06-10 21:23:13 225

原创 认识线程安全

线程安全▲必须要深刻理解线程安全的相关内容.通过一段代码了解线程不安全static class Counter { private static int count; public static void increse(){ count++; } } public static void main(String[] args) throws InterruptedException { Thread t1 =

2020-06-08 19:11:54 169

原创 Thread属性及相关方法,start,join方法,中断线程

新线程和原线程是并发执行的关系.但是这两线程谁先执行谁后执行是抢占式执行当我们创建了一个Thread实例之后并没有立刻创建线程,显示调用start方法之后才创建了线程[△].start()方法:创建一个新的线程,由新的线程来执行输出run方法:仅仅是调用了方法,并没有创建新线程(代码输出语句是在原线程中实现的).Thread常见构造方法:Thread()创建线程对象Thread(Runnable target)使用Runnable对象创建对象Thread(String name) 创建线

2020-06-08 11:51:33 264

原创 线程的简单认识及实现线程的几种方式

线程(thread):线程其实是包含在进程中的一个进程中可能有多个线程每个线程都有一段自己要执行的指令,每个线程都是一个独立的"执行流"同一个进程中的很多线程之间,是共享了一些资源如果把一个进程想象成是一个工厂,那么线程就是工厂中的若干个流水线,所谓的线程可以理解成是一种轻量级的进程,也是一种实现并发编程的方式创建一个线程比创建一个进程成本低销毁一个线程比销毁一个进程成本也低成本低的原因是,新创建一个线程,不需要给这个县城分配很多资源,如果新创建一个进程那么就需要分配较多的资源实

2020-06-06 18:22:46 435

原创 操作系统的进程

何为操作系统:冯诺依曼体系结构 : 描述了一台计算机是如何构成的. (99%的计算机都是冯诺依曼结构) => 硬件的特点会对软件开发造成直接影响冯诺西曼体系结构是由冯诺依曼提出的,他也被称为计算机领域的祖师爷(计算机之父),他本来是个数学家,也是个物理学家,也是个化学家,还参与过曼哈顿计划.冯诺依曼在火车上遇到了一个普林斯顿大学的研究员,当时这个研究员正在研究用来计算弹道导弹轨迹的机器,可是遇到了难题,于是冯诺依曼说可以让他去看看,他就去了,就为冯诺依曼体系奠定了基础图灵 奠定了计算机工作原理

2020-06-06 17:07:55 347

原创 反射

反射面向对象的三大特性叫“封装继承多态”,而不是说只有三个特性,那么反射(reflect)也是面向对象编程的一个重要特性。反射其实更可以被叫做自省,让一个对象在运行时认清自己,例如,直到自己有哪些属性,哪些方法,以及每个属性叫什么名字,是什么类型,是用public修饰还是private修饰…程序是怎么运行起来的?程序最初是.java文件,然后被编译成.class文件(二进制的字节码文件),程序运行时,JVM会加载对应的类到内存中(也就是加载.class文件),然后可以使用反射获取到对象的更详细的

2020-06-05 18:51:48 79

原创 索引和事务

索引(index):好比书的目录(index) 本质上是为了加快查找的效率如果数据库中没有索引,那么此时查找的时候就需要把整个表遍历一遍如果想找id为8的学生信息,没有索引,此时的查找过程就相当于一个"顺序表查找"如果是针对数据库顺序查找,数据库的数据时在磁盘上,磁盘访问速度慢,并且数据量也可能非常多,这个速度就会很慢索引就是为了避免数据库进行顺序查找,提高查找效率索引可以考虑的数据结构**二叉树(二叉搜索树),如果比较平衡,查找效率就是O(LogN)二叉搜索树内部元素是有序的,中序遍历结

2020-06-01 16:33:21 139

原创 数据库学习 4 (MySQL)

自连接子查询: 在其他SQL中嵌入查询语句单行子查询:1.查询和"不想毕业"同班的同学有哪些select name from student where classes_id = (select classes_id from student where name = '不想毕业');多行子查询查询语文或者英文课程对应的成绩select score from score where course_id in (select id from course where name = '语文' o

2020-06-01 14:30:58 137

原创 Win平台重装IDEA后无法打开可能的解决方法

如题博主先前使用破解的IDEA2018.1,卸载后安装IDEA2020.1.1,安装完成后发现无法打开IDEA,具体表现为 :安装完成后打开IDEA显示一次启动界面后闪退,而后再打开只有鼠标转圈圈,没有任何反应.在参考了网上众多方法之后仍然无解 (如删除 C:\Users\用户名.IntelliJIdeaxxx,或者修改idea64.exe.vmoptions文件),最终通过删除 C:\Documents and Settings\用户名 下的 .IntelliJIdeaxxx 文件夹后可以正常启动

2020-05-30 16:49:36 4263

原创 数据库学习 3 (MySQL)

数据库约束约束类型not nulluniquedefaultprimary keyauto_incrementforeign keycheck综合演示创建班级表和学生表create table class (id int primary key auto_increment,name varchar(20));create table student(id int primary key auto_increment,name varchar(20), classId int,

2020-05-29 17:34:05 270

原创 数据库学习 2 (MySQL)

CURD插入数据insert into[表名] values (对应的字段内容);插入的字段的数目和表结构的类型要求一致先创建一个表 create table exam_result( id int, name varchar(20), chinese decimal(3,1), math decimal(3,1), english decimal(3,1) );插入数据//单个数据insert into exam_r

2020-05-26 18:33:27 579

原创 数据库学习1(MySQL)

前言概述数据库就是保存数据的仓库,我们常说的数据库是xx数据库管理软件,是组织并存储数据的软件,一般是存储在硬盘上,也有些是存储在内存中。分类数据库主要可以分成两类:名称特点关系型数据库数据的组织形式使用“表”作为结构,首先得有一个表头,表头里约定有很多列,以及每一列的类型,插入的数据就是表中的一行,这一行里的每一列都要和表头对应非关系型数据库数据的组织形式是使用“键值对”作为结构,类似于Map,存储的时候需要指定Key和Value,每组数据的value中需要包含哪些

2020-05-26 16:54:05 203

原创 Java中的哈希表

概念哈希表是一种高效的数据结构,它的特点是可以不经过任何比较,直接从表中取出想要的元素,这种存储结构是按照某种函数将元素的存储地址和其关键字建立一一映射的关系,查找的时候就可以通过该函数很快的查找到该元素,同时这个转换函数一般被称为哈希函数 ( f(key) )。当我们进行插入操作时:根据待插入元素的关键字,通过哈希函数计算出该元素的存放位置,并放入这位置。当我们进行查找操作时:根据待查找元素的关键字,通过哈希函数计算出该元素的存放地址,在结构中按此位置取元素进行比较,如果关键

2020-05-16 17:44:32 176

原创 Java中的二叉搜索树

二叉搜索树概念:二叉搜索树又称二叉排序树,他或是一颗空树,或是具有以下性质的一颗树若它的左子树不为空,则左子树上所有节点的值都小于根结点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也都分别是二叉搜索树二叉搜索树中不存在值相同的两个节点接下来完成二叉搜索树的常见操作相关操作的完成过程写在代码的注释中。...

2020-05-14 17:46:03 104

原创 实现Comparator的匿名内部类

有时我们只需要一次用到自定义比较规则的compare方法,此时又想利用Comparator实现,所以可以直接使用匿名内部类完成相关操作。用一道例题梳理匿名内部类的使用方法前K个高频单词给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。题目链接:https://leetcode-cn.com/problems/top-k-frequent-words/代码即解题思路:class Solution {

2020-05-14 09:07:15 2773 1

原创 Java对象的比较

对象值的比较“==” 与 “equals()”p == q 表示的是p 和 q 身份是否相同,意思是 p 和 q 两个引用是否指向相同的对象。p.equals(q) 表示的是 p 指向的对象 和 q 指向的对象的值是否相等但是equals默认是实例先间一个Card类:static class Card{ public int rank ; public String suit; public Card(int rank, String suit

2020-05-13 23:13:45 104

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除