接口与抽象类
类可以实现多个接口,只能继承一个抽象类。1.8的接口可以提供默认实现。
抽象类可用于模板模式,复用主要业务逻辑的实现,将少量差异点开放给子类具体实现。比如解析不同类型的日志,将文件读取、解析、结果保存的逻辑封装起来,子类只需要实现不同类型日志的解析逻辑即可。
&和&&的区别
&:两边都会计算。
&&:第一个为false时,第二就不会计算了。
注:&同时也是位运算符号
位运算
取整
向上取整
Math.ceil(11.3)=12;
Math.ceil(-11.3)=-11。
向下取整
Math.floor(11.6)=11;
Math.floor(-11.6)=-12。
四舍五入
Math.round(11.5)=12;
Math.round(-11.5)=-11;
Math.round(11.3)=11;
Math.round(-11.3)=-11。
字符串
String是不可变的。
StringBuffer:线程安全
StringBuilder:线程不安全
执行速度:StringBuilder > StringBuffer > StringString str = "hello"+"world"+"!" === String str = "helloworld!"
如果指定合适的容量,可以避免SringBuilder和StringBuffer的扩容,这样可以提升append的性能。
扩容的逻辑(注意溢出):初始化如果未指定字符串,则为16,否则为字符串长度+16。
新的容量为目前数据的容量的2倍+2;如果扩容后的长度仍然不足,则新的容量为目前数据的长度+本次append字符串的长度。执行数组的复制,将旧的数据复制到新的数组中。+2,因为0和1的指数没有变化,如果初始化容量为0或1,无法扩容,因此+2.
线程实现方法
继承Thread类,实现Runnable接口,实现Callable接口。
线程状态
弃用stop和suspend原因
创建对象的方式
内部类
Error与Exception
并发与并行的区别
sleep() 和 wait() 区别
锁释放,sleep不释放锁,wait释放锁。
notify和 notifyAll区别
从对象等待队列中唤醒线程,notify随机唤醒一个,notifyAll唤醒所有。
成员变量与局部变量的区别
- 从语法形式上看,成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰;但是,成员变量和局部变量都能被final所修饰;
- 从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存。
- 从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。
- 成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被final修饰但没有被static修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。
Java类加载
类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。
父类到子类,静态到非静态,其中静态和非静态部分按定义顺序执行。
throw 和 throws
throw抛出异常。throws定义方法会抛出的异常。
final、finally、finalize
- final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
- finally:程序进入try块,try块中代码执行完毕后。该代码块会执行,一般用来存放一些关闭资源的代码。
- Note: If the JVM exits while the try or catch code is being executed, then the finally block may not execute. Likewise, if the thread executing the try or catch code is interrupted or killed, the finally block may not execute even though the application as a whole continues.
- If a finally clause is present with a try, its code is executed after all other processing in the try is complete. This happens no matter how completion was achieved, whether normally, through an exception, or through a control flow statement such as return or break.
- finalize:由垃圾回时调用finalize()。
Java finally语句到底是在return之前还是之后执行
- 没出现异常时,执行try块里return前的所有语句(包括return里的语句)->finally语句->try块里return指令。
- 出现异常时,执行try块里异常前的所有语句->catch语句->finally语句->try块外面的语句。
- finally语句里有return时,try块外面不用有return,try块里面可以不用有return(因为会覆盖里面的return)
- catch语句里有return,出现异常时,执行try块里异常前的所有语句->catch语句return指令n前的所有语句->finally语句->catch块里return指令。
- finally语句里有return时,最后返回值以finally语句里的逻辑处理结果返回。
- finally语句里没有return时,最后返回值以try(或catch)语句里的逻辑处理结果返回(finally语句的改变不会影响到那时的结果)(这与java引用传递与值传递相关)。
- 如果finally中有return,会覆盖原有return。
JSP的九个内置对象
- request:封装客户端的请求,其中包含来自GET或POST请求的参数;
- response:封装服务器对客户端的响应;
- pageContext:通过该对象可以获取其他对象;
- session:封装用户会话的对象;
- application:封装服务器运行环境的对象;
- out:输出服务器响应的输出流对象;
- config:Web应用的配置对象;
- page:JSP页面本身(相当于Java程序中的this);
- exception:封装页面抛出异常的对象。
JSP的四种作用域
- page代表与一个页面相关的对象和属性。
- request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
- session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
- application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
OSI 的七层模型都有哪些
- 应用层:网络服务与最终用户的一个接口。
- 表示层:数据的表示、安全、压缩。
- 会话层:建立、管理、终止会话。
- 传输层:定义传输数据的协议端口号,以及流控和差错校验。
- 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。
- 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。
- 物理层:建立、维护、断开物理连接。
get 和 post 的区别
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
spring中bean的作用域
- singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
- prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
- request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
- session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
- globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效