java面试总结

本文深入探讨Java中对象创建的详细过程,包括类加载、内存分配及初始化等阶段。同时,全面解析Socket通信中的粘包问题,讨论其原因、影响及解决方案,如自定义协议和特殊字符分隔。

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.行级锁的性能问题

  1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

  2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

  3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

5.sql查询什么时候会忽略索引

    1)条件中用or,即使其中有条件带索引,也不会使用索引查询(这就是查询尽量不要用or的原因,用in吧)

      

    注意,使用or,又想索引生效,只能将or条件中的每个列都加上索引

   2)对于多列索引,不是使用第一部分,则不会使用索引

   3)like的模糊查询以%开头,索引失效

    

    4)如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引

     

5.如果MySQL预计使用全表扫描要比使用索引快,则不使用索引

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值