资讯详情

我的随笔3

50.mysql 中表与行的区别

1.表级锁:成本小,锁快;没有死锁;锁粒度大,锁冲突概率高,并发度最低。 2.行级锁:成本大,锁慢;会有死锁;锁定粒度最小,锁冲突概率低,并发度最高。 3.页面锁:费用和加锁时间在表锁和行锁之间;会出现死锁;锁定粒度在表锁和行锁之间,并发度一般

51.sql 锁类型:乐观、悲观、排他、共享、意向锁

悲观锁: 总是假设最糟糕的情况,每次去拿数据都认为别人会修改,所以每次

拿数据的时候会上锁,这样别人想拿这个数据就会被堵住,直到拿到锁。一般情况下,用悲观锁写更合适 乐观锁:总是假设最好的情况,每次去拿数据都认为别人不会修改,所以不会锁,但在更新时会判断别人是否在此期间更新数据。乐观锁适用于多读的应用类型,可以增加吞吐量 共享锁:又称读锁(S),对于某一资源加共享锁,可以自己读资源,别人也可以读资源(也可以继续加共享锁) 共享锁可以共存多个),但不能修改。要修改,必须等到所有共享锁释放。 排他锁:又称写锁(X),对某一资源加排他锁,可自行增删改查,其他人不能进行任何操作。

52.设计数据库连接池所需的参数。

初始化连接数量 initialSize 最大连接数 maxActive最大空闲连接数 maxIdle最小空闲链接数 minIdle空闲时间 maxWait

53.jvm、jdk、jre

jvm:java 负责虚拟机.class 将二进制文件翻译成不同系统的机器操作指令。 jre:java 它包含了运行环境 java 虚拟机和 java 项目运行所需 java 类库, java.util,java.sql,java.long,java.net 等

jdk:java 包括开发工具包 jre 开发编译等 java 项目所需的一些工具,如 javac.exe,java.exe,jar.exe 等,均放在 jdk 安装目录的 bin 目录下

54.Java 强引用、软引用、弱引用、虚引用有什么用?

强引用:最常见的引用,如 Object obj = new Object() 即时抛出 OutOfMemoryError 终止程序不会通过将对象设置为强引用对象来回收对象 null 弱化引用,使其回收利用 软引用:对象处于有用但不必要的状态 只有当内存空间不足时,GC 可用对象的内存可用于实现高速缓存 弱引用:非必须的对象,比软引用更弱一些 GC 无论内存是否足够,它都会被回收 适用于引用偶尔适用且不影响垃圾收集的对象 虚假引用:垃圾收集器可以随时回收,不会决定物体的生命周期 跟踪对象被垃圾收集器回收的活动必须作为哨兵和引用队列 ReferenceQueue 联合使用

示例代码链接

55.GC

GC 即 java 垃圾自动回收机制是对内存中未引用或超过作用域的对象进行的 回收。GC 垃圾回收的主要场所是堆放 Java 虚拟机分块处理堆内存。一般来说,堆内垃圾回收分为三个区域:新一代、老一代和持久一代;从细节上看,新一代分为三个独立区域:Eden 区、From Survivor 区以及 To Survivor, 这三区域默认内存分配比例为 8(Eden):1(Survivor):1,每次使用 Eden 和其中一块 Survivor。 新一代主要采用复制和标记-复制算法,老年人主要采用标记-垃圾回收算法。 在大多数情况下,对象在新一代 Eden 区内分配,当 Eden 区没有足够空间进行分配时,

虚拟机将启动一次 Minor GC [?ma?n?r];这时会把 Eden 区和 Sruvivor 还活着的对象复 制到另一块 Survivor 当对象在区内 Survivor 一定次数的区域(默认配置是 15)的 Minor GC之后,它将被提升到老年 同样,当老年人没有足够的内存空间存储物体时,虚拟机会就会启动 Major GC/Full GC,全面回收年轻、年老、持久垃圾 ,过多的 GC 和 Full GC 占用大量系统资源(主要是 CPU),影响系统吞吐量。特别是 Full GC,因为它会整理整个堆,我们应该尽量避免 Full GC 持久介绍:主要存储: java 类信息,或通过 import 在这个空间中引入的类信息 代码运行时,存储对象通常会存在很长时间

56.GC 的触发

(1) 老年人写满了 (2) 持久代写满了 (3) 显式调用程序员 System.gc()方法 (4) 我们可以通过 java 如果上次虚拟机监控道路上次设置虚拟机监控道的比例,命令分配堆空间的运行策略 GC 之后,这种操作策略的变化也会触发 GC

57.判断对象可回收的依据

在 jdk 在早期版本中,使用引用计数法来判断对象的引用值 1,反之则减 1.如果没有引用指向 1.它的引用计值是 0,在下次 gc 当对象内存被回收时, 引用计数法的优点是简单,但不能回收循环引用的对象,如 a 引用指向 b,b 指向 c,c 又指向 a,在这种情况下,即使程序不再使用它们,它们的引用计值也是 一、永远无法回收 因此,在后续版本中,引入了根搜索算法,即从根节点中找到相应的引用节点,然后继续找到节点的引用节点,其余的是未引用的节点,即可回收的节点 可作为根节点的对象如下 4 个: (1) 虚拟机栈中引用的对象 (2) 本地方法栈引用的对象 (3) 方法区静态属性引用的对象 (4) 方法区常量引用的对象

58.ArrayList 和 Vector 有什区别?

ArrayList 当其初始容量不足时,线程是不安全的 动态扩容50%, Vector 它是线程安全的,它 100%的规模进行动态扩容。所以在单线程环境下,出于性能和内存使用量这两方面的考虑,建议使用 ArrayList 知识点:他们的初始容量在 jdk1.8 中是 经过第一次 add 后为 10.在之前的版本中,默认容量是 10.list 扩容是 (oldCapacity*3)/2 1

59.ArrayList 和 LinkedList 有什么区别?

ArrayList 它使用数组存储数据,内存中分配连续空间,可以直接按序列号索引元素,因此搜索和修改效率高,但插入和删除元素涉及数组元素移动的操作效率低 而 LinkedList 存储采用双向链表, 根据序列号索引数据,需要进行前向或后向遍历,但在插入和删除数据时,只需记录项目的前后项。因此,在添加和删除更多元素的场景中,LinkedList 比较优势。

60.List、Set、Map 是否继承自 Collection 接口?

List、Set 是,Map 不是。Map 是键值对映射容器 List 和 Set 有明显的显的区别 Set存储无序和不可重复的元素,List 存储有序元素(确保每个元素的插入顺序)和可重复元素。

61.告诉我你对设计模式了解多少?

设计模式是反复使用代码设计经验的总结,每种设计模式都提供适用的场景和解决方案,通过应用设计模式及其背后的思想可以优化系统结构,从而以相对较小的成本增加新的需求或修改现有功能,设计模式可以节省人力和时间成本,这就是价值 Java 中一般有 23 设计模式可分为创建模式、结构模式、行为模式三类。常用的设计模式有:工厂模式、代理模式、适配器模式、单例模式等 单例模式:单例模式 实现:一个班只有一个班主任 工厂模式:工厂类可以根据条件生成不同的子类实例。这些子类有一个公共抽象的父类,并实现了相同的方法。然而,这些方法对不同的数据进行了不同的操作(多态)。当得到子类实例时,开发人员可以调用基类方法,而无需担心返回哪个子类实例 实现:例如,我们有一种动物,它有一种行为!我们创造了鸟类、小狗和鱼类 根据给定的不同信息,建立一个工厂类,创建不同的子类。 适配器模式:将一类接口转换为客户期望的另一类接口,使原接口不兼容 可以一起工作 实现:1。美国的电压是 110v,而中国的为 220v,那么美国的电器插头就不能插在中间了 在国家插座上工作,适配器应该在中间链接 再比如耳机 typeC 接口,手机是圆孔接口,必须使用适配器 观察者模式:当一个对象的状态发生变化时,所有依赖它的对象都被通知并自动更新。 实现:比如用户关注的讲师发布视频,所有关注的用户都可以收到通知。 代理模式:为其他对象提供代理,以控制对该对象的访问:windows 里面的快捷方式,SpringAop 注:简单总结一下你能否解释你在项目中使用的场景设计模式:

https://mp.weixin.qq.com/s?__biz=MzIwMTY0NDU3Nw==&mid=2651938221&idx=1&sn= 9cb29d1eb0fdbdb5f976306b08d5bdcc&chksm=8d0f32e3ba78bbf547c6039038682706a2 eaf83002158c58060d5eb57bdd83eb966a1e223ef6&scene=21

62.spring 使用的设计模式。

1、工厂模式:Spring 中的 BeanFactory 它是简单工厂模式的体现,根据传入唯一的标志获得 Bean 对象 2、代理模式:AOP 底层是动态代理模式的实现 3.单例模式:Spring 依赖注入发生在 AbtractBeanFactory 的 getBean 里。getBean的 doGetBean 方法调用 getSingleton 进行 bean 的创建。

63.单例模式

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象常被设计成单例 单例模式有以下特点: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例 java 中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。 饿汉式和懒汉式区别 饿汉就是类一旦加载,就把单例初始化完成,保证 getInstance 的时候,单例是已经存在的了, 而懒汉只有当调用 getInstance 的时候,才回去初始化这个单例。另外从以下两点再区分以下这两种方式: 1、线程安全: 饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题, 懒汉式本身是非线程安全的, 2、资源加载和性能: 饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都 会占据一定的内存 而懒汉式在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化, 如果要做的工作比较多,性能上会有些延迟 3、实例代码:写一个单例模式

64.六原则一法则

  • 单一职责原则:一个类只做它该做的事情。

  • 开闭原则:软件实体应当对扩展开放,对修改关闭。- 依赖倒转原则:面向接口编程。

  • 里氏替换原则:任何时候都可以用子类型替换掉父类型。

  • 接口隔离原则:接口要小而专,绝不能大而全。

  • 合成聚合复用原则:优先使用聚合或合成关系复用代码。

  • 迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。

65.String 和 StringBuilder、StringBuffer 的区别?

String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象, 而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字 符串内容的情况下最好不要使用 String。 StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

66.HashMap(散列表)、HashTable、ConcurrentHashMap的介绍与区别

HashMap:底层数组+链表实现(JDK1.8+红黑树),可以存储 null 键和 null 值,线 程不安全 HashTable:底层数组+链表实现,key value 不能为空,线程安全,实现线程安全的方式是在修改数据时锁住整个 HashTable,效率低,ConcurrentHashMap 做了相关优化 ConcurrentHashMap:底层采用分段的数组+链表实现,线程安全通过把整个 Map分为 N 个 Segment[ˈsɛɡmənt],可以提供相同的线程安全,但是效率提升 N 倍,默认提升 16 倍。(读操作不加锁,由于 HashEntry 的 value 变量是 volatile 的,也能保证读取到最新的值。),ConcurrentHashMap 允许多个修改操作并发进行,其关键在于使用了锁分段技术 总结:HashMap 几乎可以等价于 Hashtable,除了 HashMap 是非 synchronized 的,并可以接受 null,而 ConcurrentHashMap 则是对 HashTable 做了相关优化

67.hashMap 工作原理

HashMa 使用 put(key, value)存储对象到 HashMap 中,使用 get(key)从 HashMap 中获取对象。 当我们往 Hashmap 中 put 元素时,首先会调用 key 的 hashcode 进行计算 hash值,再运用散列法得到这个元素在数组中的位置(下标), 如果该位置没有元素,就直接将该元素放到数组的该位置上。如果该位置上存放了其他元素,它会通过 equals 来比较他们的键值对是否相同,如果不同,则在这个位置上的元素将以链表的形式存放,新加入的放在链头,如果相同,则覆盖原来的值

需要注意 Jdk 1.8 中对 HashMap 的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率

68.concurrenthashMap 源码解析

ConcurrentHashMap 它也是 map 接口的实现者,是并发的,它是线程安全的。Hashtable 也是线程安全的 map 接口实现类,区别在于 Hashtable 使用 synchronized 关键字实现线程安全的,在线程竞争激烈的情况下 HashTable 的效率非常低下,而 ConcurrentHashMap 则开创性的使用了锁分段技术(假如容器里有多把锁,每一把锁用于锁容器其中的一部分数据,那么当线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率) ConcurrentHashMap 是由 Segment 数组结构和 HashEntry[hæʃˈɛntri]]数组结构组成。Segment 继承可重入锁 ReentrantLock [rɪ’entrənt ],在 ConcurrentHashMap 里扮演锁的角色,HashEntry 则用于存储键值对数据类似于 HashMap。一个ConcurrentHashMap 里包含一个 Segment 数组,Segment 的结构和 HashMap 类似,是一种数组和链表结构, 一个 Segment 里包含一个 HashEntry 数组,每个 HashEntry是一个链表结构的元素, 每个 Segment 守护者一个 HashEntry 数组里的元素,当对HashEntry 数组的数据进行修改时,必须首先获得它对应的 Segment 锁。 ConcurrentHashMap 把实际 map 划分成若干部分来实现它的可扩展性和线程安全。这种划分是使用并发度获得的,它是 ConcurrentHashMap 类构造函数的一个可选参数,默认值为 16,这样在多线程情况下就能避免争用。

69.HashCode 和 equals 的区别

hashCode()方法和 equals()方法的作用其实是差不多的,都是用来对比两个对象是否相 等。 区别在于 equals()一般比较的比较全面比较复杂,但效率就比较低,而利用 hashCode() 进行对比,则只要生成一个 hash 值进行比较就可以了,效率比较高。 但 hashCode()并不是完全可靠,有时候不同的对象他们生成的 hashcode 也会一样如果两个对象的 equals 比较为 true,那么他们的 HashCode 一定相同,反之,两个对象

HashCode 比较为 true,但 equals 比较的结果不一定为 true 场景设想:Set 存储的是无序且不重复的值,那 Java 是如何判断他们不重复的呢? 如果使用 equals,那么里面有多少个元素就得比较多少次 equals,效率大大降低,于是就采用了 hash 表原理,当集合添加一个元素时,先调用它的 hashcode 方法,可以理解为定位到它所在的位置,如果该位置没有元素,则直接存放在该元素,如果该位置有元素,则使用equals 方法进行比较,相同的话就不存储了,不同的话散列到其他地址,这样调用 equals 的次数就大大降低了

70.装箱和拆箱在哪个环节转换

装箱:基本类型转变为包装器类型的过程。 拆箱:包装器类型转变为基本类型的过程。 它们在编译时转换的,我们可以反编译.class 文件得到具体内容 如装箱语句 Integer total = 99,class 文件则为 Integer total = Integer.valueOf(99)而拆箱时语句 int totalprim = total,class 文件则为 int totalprim = total.intValue()

71.类加载过程

1.装载:查找和导入 class 文件; 2.连接: (1)检查:检查载入的 class 文件数据的正确性; (2)准备:为类的静态变量分配存储空间; (3)解析:将符号引用转换成直接引用(这一步是可选的) 这句话的意思是:符号引用只是一个字面量,在预编译阶段虚拟机并不知道所引用类的地址,所以用符号引用来代替,而这个阶段就是将符号引用转换成直接引用 3.初始化:初始化静态变量,静态代码块。 这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法 main()才会成为一般程序的入口方法。类的构造器也会引发该动作。 解说详细过程: 装载过程分为三步骤: 1、获取定义此类的二进制字节流,通过包名类名定位到 class 文件流,也可以自定义通过网络或者其他方式获取,通过这个性质,可以自定义类加载器实现热加载等等。 2、二进制字节流代表的静态存储结构转化成运行时方法区的数据结构,static 修饰的变 量 3、内存中生成 java.lang.Class 对象代表此类,作为方法区这个类的各种数据访问接口(java.lang.Class 也是对象但存储在方法区,不存储在堆) 检查(连接) 检查过程大致分为四大类,当然验证的逻辑不仅仅这些,详细过程方式不细讲。 1、文件格式验证:字节流是否符合 Class 文件规范 2、元数据验证:类描述是否符合规范 3、字节码验证:语义定义是否符合规范 4、符合引用验证:根据全限名是否能找到类等等

准备(连接) 正式为类变量分配内存和初始化(类变量可以理解为 static 修饰的变量),初始化是把变量赋值为数据类型的零值(java 中基本类型的默认值是 0,引用类型会默认为 null),除非被 final 修饰的类变量,会直接初始化为指定值。 解析(连接) 将常量池内的符号引用替换成直接引用的过程 初始化 类加载过程的最后步骤,根据程序员的主观计划去初始化类变量和其他资源,执行 clinit方法过程,根据编写的代码对类变量进行赋值等操作,执行父类、子类的 static 变量和 static静态块,注意如果是接口,不用执行父类的 static 变量和 static 静态块,除非子类用到父类的 static 变量和 static 静态块。

72.解释 JVM 加载 class 文件的原理机制

Java 中的所有类,都需要由类加载器装载到 JVM 中才能运行。类加载器本身也是一个类,而它的工作就是把 class 文件从硬盘读取到内存中。这些都是隐式装载的,我们不需要关心,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。 Java 类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到 jvm 中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。 Java 的类加载器有三个,对应 Java 的三种类: Bootstrap ClassLoader // 负责加载系统类 (指的是内置类,像是 String,对应于 C# 中的 System 类和 C/C++标准库中的类) Extension [ˌɪkˈstɛn(t) ʃ(ə)n] ClassLoader //负责加载扩展类(就是继承类和实现类) Application ClassLoader //负责加载应用类(程序员自定义的类) 三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类 加载器完成呢?为了解决这个问题,Java 采用了委托模型机制。 委托模型机制(双亲委派模型)的工作原理很简单:如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。这样可以避免重复加载。它还有一个安全上的考虑:如果某人将一个恶意的基础类加载到 jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,因为针对 java.*开头的类,jvm的实现中已经保证了这种类必须由 bootstrap 来加载,自然就不会将该类加载进来。 我们可以通过这样的代码来获取类加载器: ClassLoader loader = ClassName.class.getClassLoader(); ClassLoader ParentLoader = loader.getParent(); 注意一个很重要的问题,就是 Java 在逻辑上并不存在 BootstrapKLoader 的实体!因为它是用 C++编写的,所以打印其内容将会得到 null。

73.JVM(Java 虚拟机)运行时内存模型。

Java 虚拟机把它所管理的内存划分为不同的数据区域,分别是方法区、堆区、程序

计数器、虚拟机栈、本地方法栈 堆区也是被所有线程共享的一块内存区域,一般来说它是 Java 虚拟机所管理的内存中最大的一块。此内存区域用来存放对象实例。也是垃圾收集器管理的主要区域。为了更好地回收或更快地分配内存,将堆区分为了新生代和老年代;新生代中又细分为Eden 空间、From Survivor 空间、To Survivor 空间等 方法区是被所有线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池是方法区的一部分,用于存放编译期间生成的各种字面常量和符号引用。平时通过反射获取到的类型、方法名、字段名称等信息就是从方法区获取到的 虚拟机栈是线程私有的,它的生命周期与线程相同,它描述的是 Java 方法执行的内存模型。每个方法执行的同时会创建一个栈帧,用于存储局部变量表、操作数栈(用于计算的临时数据存储区)、动态链接(符号引用在运行期间转化为直接引用)、方法返回地址等信息,每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程 本地方法栈与虚拟机栈类似,区别在于虚拟机栈执行的是 java 方法(也就是字节码服务),而本地方法栈则为执行虚拟机中的 native 本地方法(通过这些可以调用 Java以外的程序,例如 c 语言写的程序)。 程序计数器可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、线程恢复等基础功能都需要依赖这个计数器来完成。

74.各种数据的存储位置

类型 示例 存储位置 静态变量 static int val = 1 方法区 New 出来的对象 String a = new String(“123”) new 出的对象在堆区,指向堆 区的引用 a 放在栈区 基本数据类型 int iVal = 100 值 100 在栈区, iVal 的引用 也在栈区 常量类数据 String a = “abc” 常量池在方法区中

总之记住: (1) new 出来的对象存在于堆区,而这些 new 出来对象的引用则在栈区 (2) 类似于 String a = “abc”;之类的常量存在于常量池中,而常量池存在于方法区中

75.为什么 TCP 连接时是三次握手,而关闭时却是四次挥手

三次握手: 第一握:首先客户端发送一个 syn,请求连接 第二握:服务器收到之后确认,并发送一个 syn ack 应答 第三握:客户端接收到服务器发来的应答之后再给服务器发送建立连接的确定,至 此连接完成。

用比喻来说就是: C:约么? S:约? C:好的 这样就可以约会了

四次挥手:

第一挥:客户端发送断开连接的 FIN 报文,表示要断开 TCP 连接 第二挥:服务器收到客户端发来的请求后,回复 ACK 报文,表示已经收到消息第三挥:服务器回复完成后,先确认数据是否传输完毕,完毕后再发送 FIN 给客 户端 第四挥:客户端关闭连接 因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK报文。 但是关闭连接时,当 Server 端收到 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以只能先回复一个 ACK报文,告诉 Client 端,“你发的 FIN 报文我收到了”。只有等到我 Server 端所有的报文都发送完了,再发送 FIN 报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN一般都会分开发送,从而导致需要四次握手

字段 含义

ACK 确认号是否有效,一般置为 1。

SYN 请求建立连接

FIN 希望断开连接。

76.关于 token 的理解

Token 是在服务端产生的。 如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会 返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。 一般是我们在进行登录和请求数据的时候,都需要 token 值,在请求拦截器里,把token 值写入 header 里面,这样的话,我们每次在进行数据获取的时候,也就带有 token值了。而且 token 值也是在我们进行页面鉴权的时候必须要有的。。

77.BIO,NIO 和 AIO

NIO 是同步非阻塞 IO(JDK1.4 以上版本提供),跟 IO(也称 BIO)的区别是: 它是面向缓存的,可以跳跃性和重复读取,而 IO 是面向流的,只能顺序的从流中获取数据 它是非阻塞性的,而 IO 是同步阻塞性的,如调用 InputStream.read()中,IO 得等到读取到数据(或超时)时,才会继续往下执行 示例:NIO 的简单使用

78.什么是反射

反射是指在程序运行时动态获取和操作当前程序,比如获取类(class)的名称、实例化一个类实体、操作属性、调用方法等。

79.http 协议介绍

HTTP 超文本传输协议,不依赖于任何特定语言,,它构建于 TCP/IP 协议之上, 是一个应用层协议,默认端口号是 80 HTTP 的应用价值在于传输,它是无状态协议基于请求/响应模型 服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求服务器会认为新的客户端, 规范把 HTTP 请求分为三个部分:请求行、请求头、消息主体 HTTP 响应也由 3 个部分构成,分别是:响应行、响应头、响应正文

HTTP 请求信息(浏览器信息) 1、 请求行:请求方式 + 请求 URL + 请求协议/版本号

Get /login.html HTTP/1.1

2、请求头:客户段浏览器告诉服务器的一些信息 User-Agent:浏览器信息 Accept:客户端能接收的数据类型Accept-encoding:是否支持压缩的流Accept-charset:客户端字符编码集 3、空行:分割请求头和消息体 4、消息主体:封装 POST 的请求参数 HTTP 响应信息(服务器发给客户端的数据) 1、 响应行:请求协议/版本+ 响应状态码 + 描述信息

HTTP/1.1 404 请求路径没有对应的资源

2、响应头(格式: 头名称:值):content-text:服务器发送信息的类型date:发送时间 server:服务器类型 3、响应空行 4、消息体:服务器发送给客户端的页面内容

标签: 21sn插头连接器sn针插座连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台