计算机网络
一、网络模型OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。五层协议 (5层):物理层、数据链路层、网络层、运输层、 应用层。
物理层:
该层为上层协议提供了一个传输数据的可靠物理媒介
数据的单位称为比特(bit)。
物理层的主要设备:中继器、集线器、适配器。
主要协议:IEEE802.3
数据链路层
实现两个主机系统之间的数据传输透明
数据的单位称为帧(frame)。
数据链路层主要设备:二层交换机、网桥。
主要协议:以太网协议ppp、MAC
网络层
实现两个主机系统之间的数据传输透明,路由选择,连接的建立与终止等,它提供的服务使传输层不需要了解网络层的数据传输和交换技术
数据包
网络层主要设备:路由器
网络层协议的代表包括:IP、IPX、RIP、ARP、RARP、OSPF等。
传输层
进程之间的通信。提供端到端的可靠报文传递和错误恢复
TCP的叫段、UDP的叫数据报
TCP/UDP
会话层
建立、管理和终止会话
会话协议数据单元SPDU
表示层 ...
leetcode-数组
1.两数之和1.
两遍哈希表
一个简单的实现使用了两次迭代。在第一次迭代中,我们将每个元素的值和它的索引添加到表中。然后,在第二次迭代中,我们将检查每个元素所对应的目标元素(target - nums[i]target−nums[i])是否存在于表中。注意,该目标元素不能是 nums[i]nums[i] 本身!
123456789101112131415public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < nums.length; i++){ map.put(nums[i],i); } for(int i = 0; i < nums.length; i++){ int complement = target - nums[i]; if (map.containsKey(complem ...
java基础
1.JDK 和 JRE 有什么区别?
JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。
2.== 和 equals 的区别是什么?==:
对于基本类型和引用类型 == 的作用效果是不同的,如下所示:
基本类型:比较的是值是否相同;
引用类型:比较的是引用是否相同;
1234567String x = "string";String y = "string";String z = new String("string");System.out.println(x==y); / ...
leetcode-栈队列
1. 用栈实现队列使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空。
https://leetcode-cn.com/problems/implement-queue-using-stacks
栈的顺序为后进先出,而队列的顺序为先进先出。使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序。
1234567891011121314151617181920212223242526272829303132333435363738394041424344package com.lq.leetcode.stack;import java.util.Stack;public class MyQueue { private Stack<Integer> in = new Stack<>(); private Stack<Integer ...
数据结构
线性结构和非线性结构
线性结构常见的有:数组、队列、链表和栈
非线性结构包括:二维数组,多维数组,广义表,树结构,图结构
稀疏数组当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)把稀疏数组存盘,并且可以从新恢复原来的二维数组数
队列循环队列
rear = (rear+1)%maxSize ;front = (front+1)%maxSize ;公式进行指针计算。
队空状态的条件为:front = rear。而如果整个队列全部存满数据那么,队满的条件也是front = rear;所以循环队列需要损失一个存储空间
队列内个数(rear+maxSize-front)%maxSize;
链表12345678910public class Node { public Object data; public Node next; publi ...
leetcode-链表
1.归并两个有序的链表
Merge Two Sorted Lists
1234567891011public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; if (l1.val < l2.val) { l1.next = mergeTwoLists(l1.next, l2); return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; }}
2.从有序链表中删除重复节点83. 删除排序链表中的重复元素
1234567891011public ListNode deleteDuplicates(ListNode head) { ListNode current = hea ...
设计模式-单例模式
单例模式
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
比如Hibernate的SessionFactory,它充当数据存储源的代理,并负责创建Session对象。SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory就够,这是就会使用到单例模式。
1) 饿汉式(静态常量)
2) 饿汉式(静态代码块)
3) 懒汉式(线程不安全)
4) 懒汉式(线程安全,同步方法)
5) 懒汉式(线程安全,同步代码块)
6) 双重检查
7) 静态内部类
8) 枚举
饿汉式1) 构造器私有化 (防止 new )
2) 类的内部创建对象
3) 向外暴露一个静态的公共方法。getInstance
123456789101112class Singleton{ //构造器私有化 private Singleton(){ } //静态变量 private final static Singleton ins ...
设计模式
设计模式面向对象(Object Oriented)) ->功能模块[设计模式+算法(数据结构] ->框架(使用多种设计模式) ->架构[服务器集群]
代码重用性、可扩展性,可读性、可靠性、高内聚低耦合
七大原则单一职责一个类只负责一项职责,如A类负责两个不同职责,职责1需要改变A时,可能造成职责2错误,需要把A分为A1,A2 。 如UserDao应该仅仅操作user一张表。
接口隔离原则客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上
将接口Interface1拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则
依赖倒转原则1) 高层模块不应该依赖低层模块,二者都应该依赖其抽象
2) 抽象不应该依赖细节,细节应该依赖抽象
3) 依赖倒转(倒置)的中心思想是面向接口编程
4) 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类
依赖关系传 ...
jvm(8)--垃圾回收2
垃圾回收相关概念
System.gc()会显式触发FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。
然而system.gc() )调用附带一个免责声明,无法保证对垃圾收集器的调用。(不能确保立即生效)
无须手动触发。在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()
如果调用System.runFinalization()会强制调用,并打印运行结果,但是不一定会触发销毁的方法,调用System.runFinalization()会强制调用 失去引用对象的finalize()
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657/** * 局部变量回收 */public class LocalVarGC { /** * 触发Minor GC没有回收对象,然后在触发Full GC将该对象存入old区 */ public voi ...
jvm(7)--垃圾回收
垃圾回收概述
什么是垃圾
什么是垃圾?垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。
如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序的结束,被保留的空间无法被其它对象使用,甚至可能导致内存溢出。
为什么需要GC
内存迟早都会被消耗完
垃圾回收可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便JVM将整理出的内存分配给新的对象。
随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序的正常进行
Java垃圾回收机制优点自动内存管理,无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险
可以更专心地专注于业务开发
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html
担忧弱化Java开发人员在程序出现内存溢出时定位问题和解决问题的能力。
GC主要关注的区域 方法区 和堆
Java堆是垃圾收集器的工作重点
频繁收集Young区
较少收集Old区
基本不收集Pe ...