1.new 一个对象的过程
SubClass sub = new SubClass();
这句话到底做了什么事情呢?
1.javac编译.java源文件形成.class字节码文件;
2.new SubClass()对象时,先检查有没有父类,有父类,类加载器(ClassLoader)先将父类的Class文件读入内存,创建一个java.lang.Class对象,然后加载子类,类加载器将子类的Class文件读入内存,创建一个java.lang.Class对象;
3.先初始化父类的静态属性,再初始化父类的静态代码块;
4.再初始化子类的静态属性,再初始化子类的静态代码;
5.在堆内存中分配内存空间,分配内存地址,此时是因为父类的特有属性才在堆内存中为父类对象分配空间。
6.初始化父类的特有属性。
7.初始化父类的构造代码块。
8.初始化父类对象相应的构造方法。
9.在堆内存中分配内存空间,分配内存地址,此时是因为子类的特有属性才在堆内存中为子类对象分配空间的。
10.初始化子类的特有属性。
10.初始化子类的特有属性。
11.初始化子类的构造代码块。
12.初始化子类相应的构造方法。
13.将子类的内存地址赋值给栈中的引用对象。
package com.zhangyike.staticExcise;
// 静态变量
public static String staticField = "父类--静态变量";
public String field = "父类--普通变量";
// 静态块
static {
System.out.println(staticField);
System.out.println("父类--静态块");
}
// 初始化块
{
System.out.println(field);
System.out.println("父类--普通块");
}
// 构造器
public ParentClass() {
System.out.println("父类--构造器");
}
}
public class SubClass extends ParentClass {
// 静态变量
public static String sstaticField = "子类--静态变量";
// 变量
public String sField = "子类--变量";
// 静态块
static {
System.out.println(sstaticField);
System.out.println("子类--静态块");
}
// 初始化块
{
System.out.println(sField);
System.out.println("子类--普通块");
}
// 构造器
public SubClass() {
System.out.println("子类--构造器");
}
public static void main(String[] args) {
System.out.println("顺序:" + "第一次new SubClass");
SubClass sub = new SubClass();
System.out.println("顺序:" + "第二次new SubClass");
new SubClass();
}
}
程序执行的结果为:
父类–静态变量
父类–静态块
子类–静态变量
子类–静态块
顺序:第一次new SubClass
父类–普通变量
父类–普通块
父类–构造器
子类–变量
子类–普通块
子类–构造器
顺序:第二次new SubClass
父类–普通变量
父类–普通块
父类–构造器
子类–变量
子类–普通块
子类–构造器
2.socket粘包
接触Socket通信的过程中,遇到了各种有关数据包的问题。这里做一下记录。
1)Socket粘包
什么是粘包?
答:顾名思义,其实就是多个独立的数据包连到一块儿。
什么情况下需要考虑粘包?
答:实际情况如下:
1、如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题。
2、如果发送的数据无结构,比如文件传输,这样发送方只管发送,接收方只管接收存储就ok,也不用考虑粘包。
3、如果双方建立连接,需要在连接后一段时间内发送不同结构数据,如连接后,有好几种结构:
1)”good good study”
2)”day day up”
那这样的话,如果发送方连续发送这个两个包出去,接收方一次接收可能会是”good good studyday day up” 这样接收方 就傻了,因为协议没有规定这么奇怪的字符串,所以要把它分包处理,至于怎么分也需要双方组织一个比较好的包结构,所 以一般可能会在头加一个数据长度之类的包,以确保接收。
所以说:Tcp连续发送消息的时候,会出现消息一起发送过来的问题,这时候需要考虑粘包的问题。
粘包出现的原因 (在流传输中,UDP不会出现粘包,因为它有消息边界。)
1、发送端需要等缓冲区满才发送出去,造成粘包 (发送端出现粘包)
2、接收端没有及时接收缓冲区包数据,造成一次性接收多个包,出现粘包 (接收端出现粘包)
解决粘包
1、缓冲区过大造成了粘包,所以在发送/接收消息时先将消息的长度作为消息的一部分发出去,这样接收方就可以根据接收到的消息长度来动态定义缓冲区的大小。(这种方法就是所谓的自定义协议,这种方法是最常用的)
2、对发送的数据进行处理,每条消息的首尾加上特殊字符,然后再把要发送的所有消息放入一个字符串中,最后将这个字符串发送出去,接收方接收到这个字符串之后,再通过特殊标记操作字符串,把每条消息截出来。(这种方法只适合数据量较小的情况)
注:要记住这一点:TCP对上层来说是一个流协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连成一片的,其间是没有分界线的,也就是没有包的概念。所以我们必须自己定义包长或者分隔符来区分每一条消息。
2)Socket的封包、拆包
1、为什么基于TCP的通信程序需要封包、拆包?
答:TCP是流协议,所谓流,就是没有界限的一串数据。但是程序中却有多种不同的数据包,那就很可能会出现如上所说的粘包问题,所以就需要在发送端封包,在接收端拆包。
2、那么如何封包、拆包?
答:封包就是给一段数据加上包头或者包尾。比如说我们上面为解决粘包所使用的两种方法,其实就是封包与拆包的具体实现。
3.socket传输有什么优势?
1)Socket传输的定义和其特点
所谓socket通常也称作"套接字",实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议。Socket处于网络协议的传输层
UDP协议:广播式数据传输,不进行数据验证
TCP协议:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流
Socket 传输的特点:
优点:
1) 传输数据为字节级,传输数据可自定义,数据量小(对于手机应用讲:费用低)
2) 传输数据时间短,性能高
3) 适合于客户端和服务器端之间信息实时交互
4) 可以加密,数据安全性强
缺点:
1) 需对传输的数据进行解析,转化成应用级的数据
2) 对开发人员的开发水平要求高
3) 相对于Http协议传输,增加了开发量
2) 基于Http协议传输的定义和其特点
目前基于http协议传输的主要有http协议 和基于http协议的Soap协议(web service),常见的方式是 http 的post 和get 请求,web 服务。
基于http协议的传输特点
优点:
1) 基于应用级的接口使用方便
2) 程序员开发水平要求不高,容错性强
缺点:
1) 传输速度慢,数据包大(Http协议中包含辅助应用信息)
2) 如实时交互,服务器性能压力大
3) 数据传输安全性差
2 各数据传输方式的适用范围
2.1 Socket传输适用范围
基于Socket传输的特点:Socket 传输方式适合于对传输速度,安全性,实时交互,费用等要求高的应用中,如网络游戏,手机应用,银行内部交互等
2.2 基于Http协议传输的适用范围
基于http协议传输的特点:基于http协议传输方式适合于对传输速度,安全性 要求不是很高,且需要快速开发的应用。如公司OA系统,互联网服务等。
4.行级锁的性能问题
-
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
-
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
-
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
5.sql查询什么时候会忽略索引
1)条件中用or,即使其中有条件带索引,也不会使用索引查询(这就是查询尽量不要用or的原因,用in吧)
注意,使用or,又想索引生效,只能将or条件中的每个列都加上索引
2)对于多列索引,不是使用第一部分,则不会使用索引
3)like的模糊查询以%开头,索引失效
4)如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引
5.如果MySQL预计使用全表扫描要比使用索引快,则不使用索引