Java笔试

递归:递归算法的运行效率较低, 无论是耗费的计算时间还是占用的存储空间都比非递归算法要多,自己调用自己,每次都会分配内存来保存参数值。导致时间和内存消耗。从而降低效率。

 构造方法不能被继承,不能被重写,可以被重载

offer,add 区别:

一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。

这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

poll,remove 区别:

remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

peek,element区别:

element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

hashmap的初始值是16,可以扩容

异常

1.java.lang.NullpointerException(空指针异常)原因:这个异常...
2.java.lang.ClassNotFoundException(指定的类不存在)原...
3.java.lang.ClassNotFoundExceptio(指定的类不存在)...
4.java.lang.IndexOutOfBoundsException(数组下标越界异常)...
5.java.lang.IllegalArgumentException(方法的参数错误)
 
 
官方定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
接口:是一系列方法的声明
 
抽象:是将相同类的共同特征总结出来,构造类的过程,包括数据抽象和行为抽象,数据抽象变成类的成员变量,行为抽象变成类的成员函数。抽象类之关心成员变量和成员函数
 

用最简单的一句话就是:父类型的引用指向子类型的对象。用一句比较通俗的话:同一操作作用于不同的对象,可以产生不同的效果。这就是多态。

这句话很好理解:Person person = new Student("张三");但是这个多态有什么作用呢?而我们又为什么要是有多态呢?

首先讲下封装和继承:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面,他把实现的细节影藏起来了,比如你在java中去实现一个类,这个类中提供了一些功能方法,你只需要知道你需要传递什么样的参数,会达到什么样的效果,实现细节在类中定义好了。从而使得代码模块化;而继承可以扩展已存在的代码模块,而目的就是为了代码重用。
————————————————
版权声明:本文为CSDN博主「疯狂1024」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28081081/article/details/80413186

AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

Stream:

流只是提供一个视图,并不修改数据源。

流是尽可能惰性的( 性能)

在计算时流可以是并发的

 

javac 就是把.java编译成.class语言的编译器。jvm执行.class文件

java大小写敏感

一个.java可以有多个类,只能有一个public

dir  windows下查看当前目录

注释不会出现在字节码中

类名首字母大写 第二个单词首字母大写

方法,变量 第一个小写

数字不能作为开头

 

静态方法里不能调用非静态方法和成员变量

public class StaticAccessNonStatic
{
public void info()
{
System.out.println("简单的info方法");
}
public static void main(String[] args)
{
info();
}
}

异常

 

Throwable是Java错误处理的父类,有两个子类:Error和Exception。

 

Error:无法预期的严重错误,导致JVM虚拟机无法继续执行,几乎无法恢复捕捉的

Exception:可恢复捕捉的。java健壮程序的手段。

 

Java提供了两类主要的异常:runtime exception和checked exception (编译时被检查的异常)。

checked exception (编译时被检查的异常):JAVA编译器强制要求我们必需对出现的这些异常进行catch或throws。所以,面对这种异常不管我们是否愿意,只能写一大堆catch块或throws去处理可能的异常。

如IO异常,以及SQL异常等。

runtime exception:编译通过,但运行通不过,出现RuntimeException,通常是程序员出错。虚拟机接管会终止线程或主程序。如错误的类型转换、数组越界访问和访问空指针等

       String:适用于少量的字符串操作的情况

  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况,不安全

      StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

 

   super用来访问父类的方法和属性

1:用最有效率的方法算出2乘以8

    将一个数左移n位,就相当于乘以了2的n次方

2:&和&&的区别

    &判断两个表达式,&&第一个为false时则不会判断第二个。

3:==  和  equals的区别

   ==是判断两个字符串在内存中的首地址

   equals 判断两个字符的区别;

4:堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意栈:后进先出(Last-In/First-Out);队列是一种特殊的线性表,特殊之处在于它只允许

在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,先进先出。

 

集合

5:Java主要集合

 位于Java.util包中

 只能存放引用类型的数据,不能存放基本数据类型

集合是由数组来实现的,对数组做的封装

一:数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。  

二:一个数组实例具有固定的大小,不能伸缩。集合则可根据需要动态改变大小。  

三:数组是一种可读/可写数据结构---没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方法,以只读方式来使用集合。该方法将返回一个集合的只读版本。  
集合分类:

Collection:List、Set
Map:
HashMap:非线程不安全 允许一个空值key
HashTable:安全
treemap:实现了sortmap接口,用到排序最好
linkedHashmap:输出和输入的顺序相同
weakhashmap:弱引用方式,key再被引用则被回收。
Arraylist 1.5倍 不同步 线性
vector 2倍 同步
linkedlist 从头开始遍历,随机访问效率低,插入效率高 链表 不安全

三个都可以改变大小, Collection接口 Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List 都继承了Conllection,Map。

        set                                    list                                          map

      不能重复                           可扩展                                 键对象和值对象映射的集合                    

       随即储存,插入,删除      线性存储                             没有继承collection                                                              

       遍历效率低           

Collection 和 Map 的区别
容器内每个为之所存储的元素个数不同。
Collection类型者,每个位置只有一个元素。
Map类型者,持有 key-value pair,像个小型数据库
Collection、List、Set、Map都是接口,不能实例化。
    继承自它们的 ArrayList, Vector, HashTable, HashMap是具象class,这些才可被实例化
链接:https://wenwen.sogou.com/z/q799124796.html

九大内置对象


通过解析后的 jsp 文件查看即可
1.request 对象
request 对象是 javax.servlet.httpServletRequest 类型的对象。 该对 象代表了客户端的请求信息,主要用于接受通过 HTTP 协议传送到服务器的数据。
(包括头信息. 系统信息. 请求方式以及请求参数等)。request 对象的作用 域为一次请求。


2.response 对象
response 代表的是对客户端的响应,主要是将 JSP 容器处理过的对象传回 到客户端。response 对象也具有作用域,它只在 JSP 页面内有效。


3.session 对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个 用户都生成一个 session 对象,用于保存该用户的信息,跟踪用户的操作状态。
session 对象内部使用 Map 类来保存数据,因此保存数据的格式为 “Key/value”。 session 对象的 value 可以是复杂的对象类型,而不仅仅局限于字 符串类型。


4.application 对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则 application 对象中保存的信息会在整个应用中都有效。
与 session 对象相比,application 对象生命周期更长,类似于系统的“全局 变量”。


5.out 对象
out 对象用于在 Web 浏览器内输出信息,并且管理应用服务器上的输出缓 冲区。
在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲 区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输 出流。


6.pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP 页面的 out. request. reponse. session. application 等对象。
pageContext 对象的创建和初始化都是由容器来完成的,在 JSP 页面中可 以直接使用 pageContext 对象。


7.config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext 对象 的 getServletConfig() 方法可以获取一个 config 对象。
当一个 Servlet 初始化时,容器把某些信息通过 config 对象传递给这个 Servlet。
开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页 面提供初始化参数。


8.page 对象
page 对象代表 JSP 本身,只有在 JSP 页面内才是合法的。 page 隐含对 象本质上包含当前 Servlet 接口引用的变量,类似于 Java 编程中的 this 指针。


9.exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的 JSP 页面中使用该对象将无法编译 JSP 文件。
excepation 对象和 Java 的所有对象一样,都具有系统提供的继承结构。 exception 对象几乎定义了所有异常情况。
如果在 JSP 页面中出现没有捕获到的异常,就会生成 exception 对象,并 把 exception 对象传送到在 page 指令中设定的错误页面中,然后在错误页面中 处理相应的 exception 对象。




堆和栈的区别:
栈:由操作系统释放,存放函数的参数值,局部变量的值等,大小固定,存取更快。

堆:存储运行时产生的变量,由程序员释放。,每一个实列对应一个jvm,更灵活(生存周期)
在栈中定义一个变量,变量指向堆中的地址,这个变量叫做引用变量。

是否有内存泄漏问题:
存在
概念:不再被程序使用的对像,变量还在内存中。
java有垃圾回收机制,回收标准:1:在堆中申请的空间没有被释放。可以保证
2:对象不再使用,内存还保留。不可保证
情况:静态集合类,各种链接,网络链接,io链接等,监听器,变量不合理的作用域。

Socket是什么:套接字,用于两个程序之间实现通讯
生命周期:打开socket,使用,关闭。

把字符串右移:
private static String moveToRight(String str,int position) {
            String str1=str.substring(str.length()-position);
            String str2=str.substring(0, str.length()-position);
            return str1+str2;
//返回左移n位字符串方法
    private static String moveToLeft(String str,int position) {
        String str1=str.substring(position);
        String str2=str.substring(0, position);
        return str1+str2;

设计模式:是设计经验的总结,代码重用,避免修改。

                   单列模式:保证在应用程序的生命周期中任何一个时刻,单列类的实例都只有一个。构造函数必须私有,提供一个全局访问                                            点。

                   


实现一:立即加载 / “饿汉模式”


立即加载就是使用类的时候已经将对象创建完毕(不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故又被称为“饿汉模式”),常见的实现办法就是直接new实例化


//
饿汉式单例 public class Singleton1 { // 私有构造 private Singleton1() {} private static Singleton1 single = new Singleton1(); // 静态工厂方法 public static Singleton1 getInstance() { return single; } }

 


实现二:延迟加载 / “懒汉模式”


延迟加载就是调用get()方法时实例才被创建(先不急着实例化出对象,等要用的时候才给你创建出来。不着急,故又称为“懒汉模式”),常见的实现方法就是在get方法中进行new实例化。


public
class Singleton { // 将自身实例化对象设置为一个属性,并用static修饰 private static Singleton instance; // 构造方法私有化 private Singleton() {} // 静态方法返回该实例 _加一个synchronized变成安全的懒汉模式。 public static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }
DCL双检查锁机制
public
class Singleton { // 将自身实例化对象设置为一个属性,并用static修饰 private static Singleton instance; // 构造方法私有化 private Singleton() {} // 静态方法返回该实例 public static Singleton getInstance() { // 第一次检查instance是否被实例化出来,如果没有进入if块 if(instance == null) { synchronized (Singleton.class) { // 某个线程取得了类锁,实例化对象前第二次检查instance是否已经被实例化出来,如果没有,才最终实例出对象 if (instance == null) { instance = new Singleton(); } } } return instance; } }

设计四个线程,其中共两个线程每次对j增加1,另外两个线程每次对j减少1。循环100次,写出程序。
    https://blog.csdn.net/ankeyuan/article/details/39671979

 

                    工厂模式:负责实列化有大量公共接口的类,工厂模式可以动态的决定将哪一个类实列化。

https://www.cnblogs.com/zhi-hao/p/4028169.html

                                    简单工厂:用户不去直接new一个对象,创建对象都在factory中。

                                   方法工厂:定义一个工厂接口,分别实现不同产品的实现类。客户端知道创建什么类,实现类在实现工厂中创建。在添加产品时不需要修改以前的代码。

                                   抽象工厂:他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个                                                      产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。一个产品需要很多部件,如汽车(跑车,                                      赛车,轿车,不同产品的跑车是一个产品族),还有需要送的礼物,添加礼物工厂接口,实现接口。两个工厂接口在                                     同一接口下。

 

                   适配器模式:把一个类的接口转换成客户端所期望的另一个接口,从而使原本因接口不匹配而无法一起工作的两个类一起工                                              作。

                  观察者模式:一个对象通过添加一个方法(该方法允许一个对象,即观察者注册自己)使自己变得可观察当可观察对象更改                                             时,会将消息发送到已经注册的观察者。

 

    JDK:(Java Development Kit):Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。
    JRE:(Java Runtime Environment)即为Java运行环境,提供了运行Java应用程序所必须的软件环境,包含有Java虚拟机(JVM)
    和丰富的系统类库。
    
    JVM:(Java Virtual Machines)即为Java虚拟机,提供了字节码文件(.class)的运行环境支持。 
    
    关系:JDK包含JRE包含JVM

   javac:是java语言编程编译器。
    全称java compiler。将java文件编译成字节代码的class文件。


7:Servlet采用java语言编写的服务器端程序,它运行于web服务器中的servlet容器中,提供请求响应的web服务模式,动态的生成web内容,
 
实列化:收到请求

 

     

Servlet 通过调用 init () 方法进行初始化。

init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。

 

Servlet 调用 service() 方法来处理客户端的请求。

service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

 

Servlet 通过调用 destroy() 方法终止(结束)。

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

 

最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

 

      
      网络三层结构的角度看 JSP 和 Servlet 的区别,一个网络项目最少分三层:data layer(数据层),business layer(业务层),presentation layer(表现层)。当然也可以更复杂。Servlet 用来写 business layer
是很强大的,但是对于写 presentation layer 就很不方便。JSP 则主要是为了方便写 presentation layer 而设计的。当然也可以写 business layer。
 
     一个 Servlet 在一个时刻可能被多个用户同时访问
     是从Servlet继承而来。只不过它在Servlet当中又添加/修改了一些方法,作了新的封装。

      采用JSP来表现页面,采用Servlet来完成大量的处理,Servlet扮演一个控制者的角色,并负责响应客户请求。Servlet创建JSP需要的Bean和对象,根据用户的行为,决定将哪个JSP页面发送给用户。

特别要注意        的是,JSP页面中没有任何商业处理逻辑,它只是简单的检索Servlet先前创建的Beans或者对象,再将动态       内容插入预定义的模板。

Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框

ioc:

 IOC其实是一个容器,至于什么控制反转依赖注入只不过是IOC这个容器这个spring核心在创造的过程中的指导思想,更多的简化很多复杂繁琐的重复性工作,将以前只能在代码层做更改的东西,全部放在配置文件层面来解决。以前对象与对象之间在代码层产生的耦合关系,通过配置文件来产生耦合关系,而通过配置文件来产生耦合关系的对象与对象又可以轻易的解耦。

 所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

DI:IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。

 aop:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

如果说OOP的出现是把编码问题进行模块化,那么AOP就是把涉及到众多模块的某一类问题进行统一管理

aop就是把众多模块功能模块的某一类问题进行统一管理

 

posted @ 2019-02-21 20:55  w'c's  阅读(228)  评论(0编辑  收藏  举报