1.Java入门
Java语言与C++语言的区别(或Java语言有哪些特点)
- Java有自动内存管理机制,不需要程序员手动释放无用内存。
- Java类是单继承,接口可以多继承。
- Java不提供指针来直接访问内存,程序内存更加安全。
- Java通过虚拟机来实现跨平台性,而C++依赖于特定的平台
- Java是完全面向对象的,所有类都继承于Object类,而C++为了兼容C,即支持面向对象,也支持面向过程。
Java语言编译与解释并存
- 编译型语言是指编译器将源代码一次性翻译成可被平台执行的机器码。
- 解释型语言是指解释器对源程序逐行解释成特定平台的机器码并立即执行。
Java编译与解释并存的特征:Java程序需先经过编译的步骤,生成.class
字节码,该字节码再由Java解释器来解释执行。
2.Java语法
continue、break、return的区别
- continue:跳出当前循环。,继续下一次循环。
- break:跳出整个循环体,继续执行下面的语句。
- return:跳出当前方法
==和equals的区别
==
:对于基本数据类型==比较的是值是否相等,对于引用数据类型比较的是内存地址是否相等。- equals():判断两个对象是否相等,不能用于判断基本数据类型。> 1. 当没有重写写equals()方法时,默认使用Object的equals()方法,使用equals()比较两个对象等价于使用==比较两个对象
- 类覆盖了equals()方法,即认为两个对象的内容相等。
hashcode()与equals()
为什么重写了equals()一定要重写hashcode()
等价的两个对象他们的散列值一定相同,散列值相同的连个对象不一定等价。在覆盖equals()时一定要覆盖hashcode()方法,保证等价的两个对象散列值相同。
3.基本数据类型
自动装箱和拆箱
每个基本类型都有其包装类,把一个基本类型赋给一个基本类型对应的包装类就称为自动装箱。
而把一个包装类赋给一个基本类型就称为自动拆箱。
8种基本类型的常量池
在包装类使用自动装箱或者调用valueOf()方法给该包装对象进行赋值时,会先检查常量池是否缓存了该对象,若存在则直接返回该常量池的对象,否则就new一个该包装类对象。
4.方法
Java中的值传递
Java采用的是按值调用,方法中的参数列表的值为变量的拷贝,在方法内修改变量内容不会影响方法外的变量。但是可以通过传进一个变量的地址值,再通过这个地址值间接的修改方法外的变量,比如说传进去一个数组,在方法内修改通过数组的地址可以修改数组的内容,或者对于一个对象,传进对象的引用,再通过对象的set方法可以修改引用对象的内容。
重载和重写的区别
- 重载:在一个类中:
- 方法名必须相同
- 参数类型不同、个数不同、顺序不同
- 方法返回值和访问修饰符可以不同
注意:不能有两个名字相同、参数类型相同,但是返回不同类型值的方法。
- 重写:子类对父类允许访问的方法的实现过程进行重写编写
- 返回值、参数列表、方法名必须相同,抛出的异常范围小于父类,访问修饰符范围大于等于父类。
- 父类的访问修饰符为
private\final\static
则子类就不能重写方法,但被static修饰的方法能够再次被声明。 - 构造方法无法重写。
浅拷贝和深拷贝
- 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用的传递,原始对象和拷贝对象的引用类型引用同一个变量。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。
Java BIO/NIO/AIO
BIO:同步阻塞IO,数据的读入和写入必须在一个线程内完成,在连接数不大(单机小于1000)的情况下,这种方式是可行的,但对于十万甚至百万级连接时,BIO的问题就是,过多连接所带来的线程切换开销就十分大,CPU会直接拉飞。
- NIO:同步非阻塞IO,相较于BIO提供了selector、channel、buffer等组件,这样可以使得它是面向缓冲池的,基于channel通道的IO传输,并且可以使用单线程处理多个通道,减少线程切换所带来的的开销,因为这些特性NIO适用于高负载高并发的场景。
AIO:异步非阻塞IO,它大概是基于事件和事件回调机制实现的,当后台IO处理完成时,操作系统会通知响应线程继续操作,这一个异步的过程。而NIO是当IO操作准备好之后,通知线程自行处理IO,这个自行的IO操作本身是同步的。
Java NIO的特性
NIO(Non-blocking IO)非阻塞IO
IO流为阻塞的,而NIO为非阻塞- NIO可以让我们进行非阻塞IO操作,比如线程从通道读数据到buffer,同时可以做别的事情,不需要等待其完全读到buffer中,同理写数据也是一样的。
- 而Java IO流为阻塞的,但一个线程调用read()和write()时,该线程被阻塞,直到数据被完全读取或写入。
Buffer(缓冲区)
IO面向流(Stream oriented),而NIO面向缓冲区(Buffer oriented)
Java IO中虽然也有Buffer的扩展类,但只是流的包装类,还是从流读到缓冲区中。而NIO是直接读到Buffer中进行操作的。在NIO库中,所有数据都是用缓冲区处理的。Channel(通道)
NIO通过Channel进行读写,通道是双向的,可读也可写,而流的读写时单向的。Selector(选择器)
选择器用于使用单个线程处理多个通道,以减少线程的数量,从而减少线程切换所带来的的操作系统资源的损耗。