类的初始化、加载和实例化的过程
一、一个类及对象初始化的过程 什么时候需要初始化一个类首次创建某个对象时 Dog dog = new Dog(); 或是首次访问某个类的静态方法或者是静态字段的时候 Dog.staticFields; 获得类的资源然后JVM就会载入Dog.class,生成一个class对象。这个时候如果有静态的方法或者变量,静态初始化的动作都会被执行。静态初始化在程序运行过程中只会在Class对象首次加载的时候运行一次,这些资源都会放在JVM的方法区。 方法区又叫静态区,和堆一样,被所有的线程共享。 方法区包含的都是在整个程序中永远唯一的元素,包含所有的class和static变量 初始化对象Dog dog = new Dog() 第一次创建Dog对象先执行上面的一二步 在堆上为Dog对象分配足够的存储空间,所有属性和方法都被设置成默认值(数字为0,字符为null,布尔为false,而所有引用被设置成null) 执行构造函数时检查是否有父类,如果有父类就会先调用父类的构造函数,这里假设Dog没有父类,执行默认值字段的赋值即方法的初始化动作 执行构造函数 有父类情况下的初始化假设Dog ...
Java中的锁
1.锁的 7 大分类 偏向锁/轻量级锁/重量级锁 可重入锁/非可重入锁 共享锁/独占锁 公平锁/非公平锁 悲观锁/乐观锁 自旋锁/非自旋锁 可中断锁/不可中断锁 2.偏向锁/轻量级锁/重量级锁 偏向锁如果自始至终,对于这把锁都不存在竞争,那么其实就没必要上锁,只需要打个标记就行了,这就是偏向锁的思想。一个对象被初始化后,还没有任何线程来获取它的锁时,那么它就是可偏向的,当有第一个线程来访问它并尝试获取锁的时候,它就将这个线程记录下来,以后如果尝试获取锁的线程正是偏向锁的拥有者,就可以直接获得锁,开销很小,性能最好。 轻量级锁JVM 开发者发现在很多情况下,synchronized 中的代码是被多个线程交替执行的,而不是同时执行的,也就是说并不存在实际的竞争,或者是只有短时间的锁竞争,用 CAS 就可以解决,这种情况下,用完全互斥的重量级锁是没必要的。轻量级锁是指当锁原来是偏向锁的时候,被另一个线程访问,说明存在竞争,那么偏向锁就会升级为轻量级锁,线程会通过自旋的形式尝试获取锁,而不会陷入阻塞。 重量级锁重量级锁是互斥锁,它是利用操作系统的同步机制实现的,所以开销相对比较...
HTTP请求报文
HTTP请求报文由三部分组成:请求行、请求头和请求体 请求行:包含请求方法,请求的URI和HTTP版本 状态行:包含响应结果的状态码 首部字段:包含请求和响应的各种条件、属性的各类首部 其他:包含未定义的首部比如cookie等
HTTP与HTTPS
一、HTTP和HTTPS的基本概念HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器请求和应答的标准(TCP),用于从Web服务器传输超文本到本地浏览器的传输协议。 HTTPS:是以安全为目标的HTTP通道,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTP开发的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私和完整性 二、HTTP的工作原理 客户端与服务器建立TCP连接(三次握手) 连接成功后,客户端发送请求给服务器 服务器接收到客户端发送的消息后作出响应,并将响应信息发给客户端 服务器发送玩响应信息后,就会断开TCP连接,因此HTTP是无状态的,下一次访问的时候不知道之前访问的过程 客户端收到响应信息,浏览器开始解析,将HTML文档解析后呈现在浏览器上 三、HTTPS的工作原理 客户端发起HTTPS请求 用户在浏览器中输入一个HTTPS网址,连接到server的443端口 传送证书 采用HTTPS协议的服务器必须要有一套数字证书,这套证书其实就是一对公钥和私钥。 服务器将证书发送给客户端,这个...
高频考点:ArrayList和LinkedList
ArrayList和LinkedList的主要区别 1.LinkedList和ArrayList的差别主要来源于其二者的数据结构不同。ArrayList是基于动态数组实现的,LinkedList是基于双链表实现的。另外LinkedList类可以根据索引来随机访问集合中的元素,还实现了Deque接口,Deque接口是Queue接口的子接口,代表了一个双向队列,因此LinkedList可以作为双向队列、栈和List集合使用 2.因为Array是基于索引的数据结构,它使用索引在数组中搜索和读取数据时很快的,可以直接返回数组中index位置的元素,因此在随机访问集合元素上有较好的性能。Array获取数据的时间复杂度是O(1),但是要插入、删除数据时开销会很大,因为需要移动数组中插入/删除位置之后的所有元素。 3.相对于ArrayList,LinkedList的随机访问集合元素时性能较差,因为需要在双向链表中找到index的位置再返回;但在进行插入、删除操作时比前者要快,因为LinkedList不像ArrayList,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一...
从输入URL到网页呈现的过程
1、输入网址 2、DNS解析 3、建立tcp连接 4、客户端发送HTPP请求 5、服务器处理请求 6、服务器响应请求 7、浏览器展示HTML 8、浏览器发送请求获取其他在HTML中的资源。 1.域名解析当我们在浏览器中输入一个URL的时候首先需要解析为IP地址,这一过程叫做DNS解析 DNS解析是一个递归查询的过程,例如我们解析“www.baidu.com” 时过程是这样的: 在本地域名服务器中查询IP地址,未找到域名 本地域名服务器向根域名服务器发送请求,未找到域名 本地服务器向.com顶级域名服务器发送请求,未找到域名 本地域名服务器向.baidu.com域名服务器发送请求,找到该域名,并将对应的IP返回给本地域名服务器 2.TCP连接HTTP协议是使用TCP协议作为其传输层协议的,在拿到服务器的IP地址后,浏览器客户端会与服务器建立TCP连接,该过程包括三次握手 3.浏览器发送HTTP请求浏览器构建http请求报文,并通过TCP协议传送到服务器的指定端口,http请求报文一共包括三个部分: 请求行:指定http请求的方法、url、http协议版本等 请...
TCP和UDP
TCP和UDP的区别 TCP是面向连接的,UDP是面向无连接的。 UDP程序结构较为简单。 TCP是面向字节流的,UDP是基于数据报的。 TCP保证数据正确性,UDP可能丢包。 TCP保证数据顺序,UDP不保证 什么是UDPUDP的包头: 两个十六位的端口号,分别为源端口和目标端口。 整个数据报文的长度。 整个数据报文的校验和,该字段用于发现头部信息和数据中的错误。 UDP的特点 沟通简单,不需要大量的数据结构、处理逻辑和包头字段 不会建立连接,但是会监听这个地方,谁都可以传给它数据,它也可以传给任何人数据,甚至可以同时传给多个人。 不会根据网络的情况进行拥塞控制,无论是否丢包都会一直发送 因此UDP在传输报文时是很高效的 什么是TCPTCP的包头格式: 首先是源端口和目标端口 接下来是包的序号,主要为了解决乱序问题 确认序号,发出去的包应该有确认,这样能知道对方是否收到,如果没收到就应该重新发送,解决丢包的问题 状态位。SYN是发起一个链接,ACK是回复,RST是重新连接,FIN是结束连接。因为TCP是面向连接的,因此需要双方维护连接的状态,这些状态位的包会引...
面向对象和面向过程
什么是面向对象?什么又是面向过程 面向对象:——行为化面向对象就是把整个需求按照特点、功能划分,将这些存在共性的部分封装成类,创建了对象不是为了完成某一步骤,而是描述某个事物在解决问题的步骤中的行为 面向对象的三个基本特征——封装、多态、继承 封装封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行隐藏。 继承继承是指一种能力:它可以使用现有的类的所有功能,并且在无需重新编写原来类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或者是“派生类”,被继承的类称为“基类”、“父类”或者“超类”。 多态性多态性是允许你将父对象设置成为和一个或者更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给他的子对象的特性以及不同的方式运作。 一句话理解:允许将子类类型的指针赋值给父类类型的指针。 实现多态有两种方式:覆盖和重载,两种方式的区别在于:覆盖在运行时决定,重载是在编译时决定,而且覆盖和重载的机制不同。例如在Java中,重载方法的签名必须不同于原来方法的,但是对于覆盖签名必须相同。 面向过程——步骤化...
多益网络面试记录
多益网络一面面试问题记录 什么是面向对象?面向对象和面向过程有什么区别? 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 ArrayList和LinkedList有什么区别? ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构。 当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。 当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。 ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然...
