计算机网络
1、奈奎斯特定理:
理想低通信道下的最高码元传输速率 = 2W Baud;
理想带通信道的最高码元传输速率 =1 W Baud ;
2、五层协议中每个层文件名
物理层:比特(bit)
数据链路层:帧(frame)
网络层:IP数据报 or 数据报 or 分组(datagram)
传输层:TCP——报文段(segment),UDP——用户数据报
应用层:报文(message)
3、VLAN技术用来隔离广播域,题目说的是冲突域,是不对的。没有VLAN之前冲交换机各个端口已经将大的冲突域划分为小冲突域了。
冲突域:在同一个冲突域中的每一个节点都能收到所有被发送的帧。
广播域:网络中能接收任一设备发出的广播帧的所有设备的集合。
JAVA基础知识
1、Java和C++的区别:
- Java是解释型语言,所谓的解释型语言,就是源码会先经过一次编译,成为中间码,中间码再被解释器解释成机器码。对于Java而言,中间码就是字节码(.class),而解释器在JVM中内置了。
- C++是编译型语言,所谓编译型语言,就是源码一次编译,直接在编译的过程中链接了,形成了机器码。
- C++比Java执行速度快,但是Java可以利用JVM跨平台。
- Java是纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。而C++中还有面向过程的东西,比如是全局变量和全局函数。
- C++中有指针,Java中没有,但是有引用。
- C++支持多继承,Java中类都是单继承的。但是继承都有传递性,同时Java中的接口是多继承,类对接口的实现也是多实现。
- C++中,开发需要自己去管理内存,但是Java中JVM有自己的GC机制,虽然有自己的GC机制,但是也会出现OOM和内存泄漏的问题。C++中有析构函数,Java中Object的finalize方法
- C++运算符可以重载,但是Java中不可以。同时C++中支持强制自动转型,Java中不行,会出现ClassCastException(类型不匹配)。
2、JAVA的抽象类和final类
- abstract类不能用来创建abstract类的对象;
- final类不能用来派生子类,因为用final修饰的类不能被继承;
- final不能与abstract同时修饰一个类,abstract类就是被用来继承的;
- 类中有abstract方法必须用abstract修饰,但abstract类中可以没有抽象方法,接口中也可以有abstract方法。
注意:abstract是用来修饰类和方法的:- 修饰方法:abstract不能和private、final、static共用。
- 修饰外部类:abstract不能和final、static共用。(外部类的访问修饰符只能是默认和public)
- 修饰内部类:abstract不能和final共用。(内部类四种访问修饰符都可以修饰)
jdk1.8之前
接口
1.多实现
2.变量类型默认且只能为为public static final
3.函数类型默认且只能为public,只能有public类型的静态成员函数
4.非静态成员函数没有方法体,静态成员函数有方法体
5.子类必须实现所有接口函数
6.可以有main方法;可以new一个接口,需要在方法体中实现所有接口函数
7.没有构造器
抽象类
1.单继承
2.变量类型不限(静态变量+非静态变量)
3.函数类型不限(静态函数+非静态函数)
4.非静态函数包含没有方法体的抽象函数. 有方法体的普通函数
5.子类可以不覆写父类的抽象方法,但子类也要申明为抽象类;子类可以选择覆写父类的非抽象方法
6.可以有main方法;不可以new一个抽象类
7.可以有构造器
Jdk1.8
接口中可以有default类型的方法,实现类可以选择实现该方法
意义:默认方法的主要优势是提供一种拓展接口的方法,而不破坏现有代码。另一个优势为该方法是可选的,子类可以根据不同的需求Override或默认实现。
final 变量:final变量能被显式地初始化并且只能初始化一次。被声明为 final 的对象的引用不能指向不同的对象。但是final 对象里的数据可以被改变。也就是说 final 对象的引用不能改变,但是里面的值可以改变。
final 修饰符通常和 static 修饰符一起使用来创建类常量。
final 方法:类中的 final 方法可以被子类继承,但是不能被子类修改。声明 final 方法的主要目的是防止该方法的内容被修改。
3、JAVA的局部变量和全局变量
public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用 -
private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × ×
4、Applet
Applet是一种在Web环境下,运行于客户端的Java程序组件。Applet 必须运行于某个特定的“容器”,这个容器可以是浏览器本身,也可以是通过各种插件,或者包括支持 Applet 的移动设备在内的其他各种程序来运行。与一般的Java应用程序不同,Applet不是通过main方法来运行的。Applet运行之前,先调用Init() 方法,然后调用start()方法,最后调用paint()方法。
5、JAVA的异常
编译时异常必须显示处理,运行时异常交给虚拟机。
运行时异常可以不处理。当出现这样的异常时,总是由虚拟机接管。比如我们从来没有人去处理过Null Pointer Exception异常,它就是运行时异常,并且这种异常还是最常见的异常之一。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往不对它处理罢了。也就是说,如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。捕获到的异常不仅可以在当前方法中处理,还可以将异常抛给调用它的上一级方法来处理。
6、JAVA垃圾回收
解析:这是一个关于java的垃圾回收机制的题目。垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。
年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。
年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收
永久代:存储的是final常量,static变量,常量池。
str3,str4都是直接new的对象,而substring的源代码其实也是new一个string对象返回,如下图:
经过fullgc之后,年老区的内存回收,则年轻区的占了15个,不算PermGen。所以答案选C
面向对象方法的多态性是指相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态
序列化:将数据结构转换称为二进制数据流或者文本流的过程。序列化后的数据方便在网络上传输和在硬盘上存储。
反序列化:与序列化相反,是将二进制数据流或者文本流转换称为易于处理和阅读的数据结构的过程。
本质其实还是一种协议,一种数据格式,方便数据的存储和传输。
6、synchronized和volatile
synchronized保证三大性,原子性,有序性,可见性,volatile保证有序性,可见性,不能保证原子性
关于volatile:有序性,可见性,
volatile用与修饰实例变量和类变量,是一种维护线程安全的手段,作用是实现共享资源的可见性
可见性的意思:
进程中的内存分为工作内存(线程内存)和主内存,普通变量的读写依赖于当前工作内存,直到线程结束,才会把值更新到主内存,
当有多线程存在时,就无法保证数据的真实性(可见性),其他线程读到的数据可能旧的.
volatile修饰的变量每次获取的值都是从主内存中直接读的,写完之后也会直接更新到主内存,实现方式以机器指令(硬编码)的方式实现
jkd之后的版本在设计线程安全上都是基于volition和显示锁的方式,很少有用同步块和同步方法的方式,因为同步块方法的来讲,线程以串行的方式经过,效率太低.容易阻塞,而且保持原子性,只要线程进去就无法被打断,而volatile不会阻塞.不保证原子性.
有序性的意思:
jvm和处理器在编译Java代码的时候,出于性能考虑,会对原有的代码进行重排序,(也就是指令重排)我们写好的代码都有顺序,在我们执行的时候由JVM内存模型里的程序计数器标记的,保证线程安全的时候,一般都会禁止指令重排即保证有序性.说是并发环境下指令重排会有很多问题.
但是volatile和synchronized的有序是不同的:
volatile关键字禁止JVM编译器已及处理器对其进行重排序,
synchronized保证顺序性是串行化的结果,但同步块里的语句是会发生指令从排。
深入volatile关键字的介绍
1)被volatile关键字修饰的实例变量或者类变量具备两层语义:
保证了不同线程之间对共享变量的可见性,
禁止对volatile变量进行重排序。
2)volatile和synchronized区别
使用上区别:
volatile关键字只能用来修饰实例变量或者类变量,不能修饰方法已及方法参数和局部变量和常量。
synchronized关键字不能用来修饰变量,只能用于修饰方法和语句块。
volatile修饰的变量可以为空,同步块的monitor不能为空。
对原子性的保证
volatile无法保证原子性
synchronizde能够保证。因为无法被中途打断。
对可见性的保证
都可以实现共享资源的可见性,但是实现的机制不同,synchronized借助于JVM指令monitor enter 和monitor exit ,通过排他的机制使线程串行通过同步块,在monitor退出后所共享的内存会被刷新到主内存中。volatile使用机器指令(硬编码)的方式,“lock”迫使其他线程工作内存中的数据失效,不得不主内存继续加载。
对有序性的保证
volatile关键字禁止JVM编译器已及处理器对其进行重排序,能够保证有序性。
synchronized保证顺序性是串行化的结果,但同步块里的语句是会发生指令从排。
其他:
volatile不会使线程陷入阻塞
synchronized会会使线程进入阻塞。
8、java接口与继承
A:Java只能单继承。所以A选项错误
B:Java中一个类可以实现多个接口,所以B错误
C:Java中一个类只能实现继承一个父类但是可以同时实现多个接口,所以C错误
D:Java的单一继承使代码更可靠,是正确的。
Servlet的生命周期可以分为初始化阶段,运行阶段和销毁阶段三个阶段,以下过程属于初始化阶段是
- 加载Servlet类及.class对应的数据
- 创建ServletConfig对象
- 创建Servlet对象
每一次请求来到容器时,会产生HttpServletRequest与HttpServlceResponse对象,并在调用service()方法时当做参数传入。
在WEB容器启动后,会读取Servlet设置信息,将Servlet类加载并实例化,并为每个Servlet设置信息产生一个ServletConfig对象,而后调用Servlet接口的init()方法,并将产生的ServletConfig对象当作参数传入。