面试学习记录-Java基础

99 阅读9分钟

1、数据类型

见图-网上找后自己画,加深记忆。

swith中目前版本种Long型不可以。

Math.round(11.5)=12;Math.round(-11.5)=-11,四舍五入是在参数上加0.5进行向下取整。

float f=3.4不正确,3.4是双精度(double)赋值给浮点型(float)属于下转型(也称窄化)会造成进度损失。因此需要强转 float f=(float)3.4,或者float f=3.4F。

对于short s1=1;s1=s1+1;由于1是int型,因此s1+1运算结果也是int型,需要强转。short s1=1;s1+=1;可以正确编译。

如何创建一个字符串

一般来说有三种:

  • 通过new关键字通过构造方法去创建
  • 通过双引号“”
  • 通过字符串连接符+和其余字符串进行拼接创建

说说这几种的区别

  1. 当通过new关键字调用无参构造时,仅仅在JVM的堆内存中创建了一个对象

  2. 通过""创建对象的时候,如果字符串常量池存在该字符串,直接返回该字符串对象在字符串常量池的地址,否则创建一个新的字符串对象并存储在字符串常量池。

String s = new String("a") 创建了几个对象

当通过new关键字传入双引号字符串参数时,会先去把该双引号的字符串放入字符串常量池,然后遇到new以后会在堆中再次创建一个字符串对象,这里是创建了两个对象。

2、关键字

goto保留字,目前版本java中没有使用

final修饰的类不可以被继承,final修饰的方法不可以被继承,final修饰的变量不可以被改变,是变量的引用不可变。

finalize是一个方法,属于Object类的方法,它由垃圾回收器调用,当调用System.gc()的时候,由JVM调用finalize().

this:指向对象本身的一个指针。

super:它引用当前对象的直接父类中的成员(用来访问直接父类被隐藏的父类中成员数据或者函数,基类与派生类中有相同成员定义是如;super.变量名)

staic:用来形成静态代码块已优化程序性能,因为,只会在类加载的时候执行一次。

3、面向对象

抽象,封装,继承,多态(继承,重写,向上转型)。

4、JDK常用包

java.lang:系统基础类

java.io:所有输入输出有关的类

java.nio:为了提高io包功能,而写的一个新包

java.net:网络有关的类

java.util:系统辅助类,特别是集合类

java.sql:db操作类

5、BIO,NIO,AIO,Netty

BIO:同步并阻塞,服务器实现一个链接一个线程,即客户端有链接请求时服务端就需要启动一个线程进行处理,没有处理完之前此线程不能做其他操作(单线程下文件很大),当然也可以通过线程池机制改善。BIO方式适用于链接数据比较小且固定的架构,这种

方式对服务器资源要求比较高,并发局限于应用中,但是程序只管简单易理解。JDK1.4之前唯一选择

NIO:同步非阻塞,服务器实现一个请求一个线程,即客户端发送的链接请求都会注册到多路复用器上,多路复用器轮询到链接有I/O请求时才启动一个线程进行处理。NIO方式适用于链接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限应用中,

编程比较复杂。JDK1.4之后开始支持。

AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理,AIO方式是用于连接数目比较多且连接比较长(重操作)的架构,比如相册服务器,充分调用操作系统参与并发操作,

编程比较复杂JDK1.7之后开始支持。

AIO属于NIO包中的类实现,其实IO主要分为BIO和NIO,AIO只是附加品,解决IO不能异步的实现。

在以前很少用Linux系统支持AIO,Windows的IOCP就是AIO模型。但是现在服务器一般都支持AIO操作。

Netty:Netty是有JBOSS提供的一个java开源框架。Netty提供异步的,事件驱动的网络应用程序框架和工具,用以快速开发高性能,高可靠的网络服务器和客户端程序。

Netty是一个基于NIO的客户,服务器端编程框架,使用Netty可以确保你快速和简单的开发出一个网络应用,例如实现类某种协议的客户,服务端应用。Netty相当简化和刘宪华了网络应用的编程开发过程,如TCP和UDP的socket服务开发。Netty是有NIO演进二来,

使用过NIO编程的用户就知道NIO编程非常繁重,Nett是能够更好的使用NIO。Netty的原理就是NIO,它是基于NIO的一个完美的封装,并且优化了NIO。

6、BIO,NIO,AIO详细说明

BIO(Blocking I/O):同步阻塞IO模式,数据的读取写入必须阻塞在一线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型比较不错,可以让每一个连接猪猪与自己的I/并且编程模型简单,也不用过多考虑系统的过载,限流等问题。线程池本身就是一个

天然的漏斗,可以缓冲一些系统处理不力的链接或请求。但是当面对十万甚至百万级连接的时候,传统的BIO模型是无能为力的。因此需要更高效的I/O处理模型来应对更高的并发量。

NIO(New I/O NON-Blocking I/O):NIO是一种同步非阻塞的I/O模型,在java1.4中引入了NIO框架,对应java.nio包,提供了Channel,Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道I/O操作方法。

NIO提供了与传统BIO模型中Socket和ServerSocket相对应的SocketChannel和ServerSocketChannel两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用旧好像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好相反。

对于低负载,低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载,高并发的(网络)应用,应使用NIO的非阻塞模式来开发。

NIO客户端发送的链接请求都会注册到多路复用器上

Channel:Channel是一个对象,可以通过它读取和写入数据。通常我们都是将数据写入包含一个或者多个字节的缓冲区,然后再将缓冲区的数据写入到通道中,将数据从通道读入缓冲区,再从缓存区获取数据。

Channel类似于原I/O的流(stream),但是有所区别:流是单向的,通道是双向的,可读可写。流读写都是阻塞的,通道可以一步读写。

Channel只能和Buffer进行交互

Selector:Selector可以称它为通道的集合,每次客户端来了之后会把Channel注册到Selector中并且我们给他一个状态,在用死循环来判断(判断是否做完某个操作,完成某个操作后改变不一样的状态)状态是否变化,知道IO操作完成后在退出循环。

由他选择操作客户端,用户刚刚进来时有个状态,分配好了资源切换状态完成IO操作就是会变成结束状态。

Selector是SelectableChannel的多路复用器Selector可以同时监控多个SelectableChannel的IO状况,也就是说利用Selector可以使得一个单独的线程管理多个Channel。Selector是非阻塞IO的核心。

Buffer:Buffer是一个缓冲数据的对象,一个连续的数组,它包含一些写入或者刚读出的数据。

所有数据都要经过Buffer缓冲区。

AIO(Asychroonous I/O):AIO也就是NIO2。在java7中引入NIO的改进版NIO2,它是异步非阻塞的I/O模型。异步I/O是基于事件和回调机制实现的,也就是应用操作之后,会直接返回,不会堵塞在哪里,当后台处理完成后,操作系统会通知响应的线程进行后续的操作。虽然NIO在网络操作中

提供了非阻塞的方法,但是NIO的I/O行为还是同步的,对于NIO来说,我们的业务线程是在IO操作准备好时,得到通知,接着就由这个线程自行进行IO操作,I/O操作本身是同步的。

7、Netty

Netty是一个高性能、异步事件驱动的NIO框架,基于java NIO提供的API实现。它提供了对TCP,UDP和文件传输的支持,Netty所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或通过通知机制获得IO操作结果。

Netty高性能之道

(1)异步非阻塞通信

(2)高效的Reactor线程模型

(3)无锁化的串行设计。

(4)高效的并发编程

(5)高效的序列化框架

(6)零拷贝

(7)内存池

(8)灵活的TCP参数配置能力

8、反射

可以动态获取任意一个对象方法和属性。

反射三种方式:1.通过new对象实现反射机制,2.通过路径实现反射机制。3.通过类名实现反射机制。

9、常用API

字符串常量池

字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块内存存储相同的字符串,在创建字符串时JVM会首先检查字符串常量池。

String特性

不变性:String是只读字符串,是一个典型的immutable对象,对它进行任何操作,其实都是创建一个新对象,再把引用指向该对象。不变模式的主要作用在于当一个对象需要被多线程共享频繁访问时,可以保证数据的一致性。

常量池优化:String对象创建之后,会在字符串常量池中缓存。

final:使用final来定义String类,表示String类不能被继承。

10、设计模式原则

开闭原则,单一职责,接口隔离原则