笔试经验(一)

分别写出char,int,float,double 类型分别占多少字节。

转载:c中char int float double long所占字节数
解析:

  1. 所占字节数和机器字长及编译器有关系:

    • 所以,int,long int,short int的宽度都可能随编译器而异。但有几条铁定的原则(ANSI/ISO制订的):
      1 sizeof(short int)<=sizeof(int)
      2 sizeof(int)<=sizeof(long int)
      3 short int至少应为16位(2字节)
      4 long int至少应为32位。
  2. 16位编译器
    char :1个字节
    char*(即指针变量): 2个字节
    short int : 2个字节
    int: 2个字节
    unsigned int : 2个字节
    float: 4个字节
    double: 8个字节
    long: 4个字节
    long long: 8个字节
    unsigned long: 4个字节

  3. 32位编译器
    char :1个字节
    char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
    short int : 2个字节
    int: 4个字节
    unsigned int : 4个字节
    float: 4个字节
    double: 8个字节
    long: 4个字节
    long long: 8个字节
    unsigned long: 4个字节

  4. 64位编译器
    char :1个字节
    char*(即指针变量): 8个字节
    short int : 2个字节
    int: 4个字节
    unsigned int : 4个字节
    float: 4个字节
    double: 8个字节
    long: 8个字节
    long long: 8个字节
    unsigned long: 8个字节

堆和栈的区别是什么?

转载:堆和栈的解释和区别
堆和栈的解释和区别

  1. 栈区:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

  2. 堆区:存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

  3. 堆和栈的区别:

    • 堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存。
    • 栈空间的内存是由系统自动分配,一般存放局部变量,比如对象的地址等值,不需要程序员对这块内存进行管理。
    • 从申请的大小方面讲:
      • 栈空间比较小;
      • 堆空间比较大。
    • 从数据存储方面来说:
      • 栈空间中一般存储基本数据类型,对象的地址;
      • 堆空间一般存放对象本身,block的copy等。
    • 从更新速度来说:栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
    • 栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

面向对象有哪些特征?

转载:面向对象的特征有哪些?
1、封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面;面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

2、继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法;对象的一个新类可以从西现有的类中派生,这个过程称为新类的基类(也就是父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更合适特殊的需要。

3、抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,展示不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

4、多态性:多态性是指允许不用类的对象对同一消息做出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很多的解决了应用程序函数同名问题。

简述一下Java程序的编译和执行过程?

转载:Java程序编译和运行的过程

  1. 第一步(编译): 创建完源文件之后,程序会先被编译为.class文件。
    • Java编译一个类时,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则直接引用,这个有点象make。
    • 如果java编译器在指定目录下找不到该类所其依赖的类的.class文件或者.java源文件的话,编译器话报“cant find symbol”的错误。
  2. 编译后的字节码文件格式主要分为两部分:常量池和方法字节码。
    • 常量池记录的是代码出现过的所有token(类名,成员变量名等等)以及符号引用(方法引用,成员变量引用等等);
    • 方法字节码放的是类中各个方法的字节码。
  3. 第二步(运行):
    • java类运行的过程大概可分为两个过程:
      • 类的加载
      • 类的执行。
    • 需要说明的是:JVM主要在程序第一次主动使用类的时候,才会去加载该类。也就是说,JVM并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。
  4. 详细运行:
    • 在编译好java程序得到MainApp.class文件后,在命令行上敲java MainApp。系统就会启动一个jvm进程,jvm进程从classpath路径中找到一个名为MainApp.class的二进制文件,将MainApp的类信息加载到运行时数据区的方法区内,这个过程叫做MainApp类的加载。
    • 然后JVM找到MainApp的主函数入口,开始执行main函数。
    • main函数的第一条命令是Animal animal = new Animal(“Puppy”);就是让JVM创建一个Animal对象,但是这时候方法区中没有Animal类的信息,所以JVM马上加载Animal类,把Animal类的类型信息放到方法区中。
    • 加载完Animal类之后,Java虚拟机做的第一件事情就是在堆区中为一个新的Animal实例分配内存, 然后调用构造函数初始化Animal实例,这个Animal实例持有着指向方法区的Animal类的类型信息(其中包含有方法表,java动态绑定的底层实现)的引用。
    • 当使用animal.printName()的时候,JVM根据animal引用找到Animal对象,然后根据Animal对象持有的引用定位到方法区中Animal类的类型信息的方法表,获得printName()函数的字节码的地址。
    • 开始运行printName()函数。

笔试经验(一)

tcp/udp协议的区别有哪些?

转载:深入理解TCP、UDP协议及两者的区别

  1. TCP协议:提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段(segment) 为单位的数据包进行管理。 而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易传送大数据才把数据分割, 而且 TCP 协议能够确认数据最终是否送达到对方。所以,TCP连接相当于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是通过字节码传输,传输是有序的,每个字节都是一个一个来传输。
    • 三次握手:
      • 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
      • 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
      • 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,完成三次握手。
    • 四次挥手:由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。先进行关闭的一方将执行主动关闭,而另一方被动关闭。
      • 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
      • 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
      • 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
      • 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
  2. UDP协议:无连接协议,也称透明协议,也位于传输层。
  3. 两者的区别:
    • TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
    • TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
    • TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
    • TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。

总结

没有做准备,发现自己很多基础内容都忘记差不多了,要好好补一下。