递归:递归算法的运行效率较低, 无论是耗费的计算时间还是占用的存储空间都比非递归算法要多,自己调用自己,每次都会分配内存来保存参数值。导致时间和内存消耗。从而降低效率。
构造方法不能被继承,不能被重写,可以被重载
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,可以扩容
异常
用最简单的一句话就是:父类型的引用指向子类型的对象。用一句比较通俗的话:同一操作作用于不同的对象,可以产生不同的效果。这就是多态。
这句话很好理解: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
选择题
接口可以继承接口,抽象类可实现接口。抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数,
抽象类中可以有静态的main方法
同步:是在A要用到资源时,B正在使用资源,A等待。
异步:不够关心其它线程。
一个字节占8位,一个中文字占16位。
JNDI用于数据库链接池查找。
顺序表:内存地址相邻,常用于存取第i个元素和它的前趋值。
简答题:
缓存:把数据库中查询出来的使用过的数据存储在内存中,以便后期使用。
hibernate一级缓存:由session管理。生存周期短,线程不安全,效率提升不高。
二级缓存:sessionfactory管理(可有可无)全局缓存可以实现多线程与事务共享。独立于hibernate(三方产品)
适用于:数据量较小,数据修改较小,不会被大量共享,不是重要的数据
clone的作用:返回一个object类
jsp优点:解决servlet的缺点,用jsp来维护html的显示。实现业务逻辑和视图实现的分离。
get方法用来获取服务器段资源信息
post:既可以获取又可以向服务器传送数据,url没有明文显示,更安全。
如果HTTP请求的方法是get Servelet就用doget,post用dopost(),
什么是反射机制:得到一个对象所属的类,可以运行时自我检查,获取一个类的成员变量和方法在运行时调用对象。
静态变量:内存中只有一份,存在栈(s)中,地址对应常量区(a) string s=a;
非静态变量:两份,堆,栈都有。地址对应堆区,堆区对应常量区(a),string s ,new String(“a”) ,a
什么是序列化:把对象以一串字节表示的过程,用于解决对象进行读取操作时的问题。
堆和栈的区别:
栈:由操作系统释放,存放函数的参数值,局部变量的值等,大小固定,存取更快。
堆:存储运行时产生的变量,由程序员释放。,每一个实列对应一个jvm,更灵活(生存周期)
在栈中定义一个变量,变量指向堆中的地址,这个变量叫做引用变量。
是否有内存泄漏问题:
存在
概念:不再被程序使用的对像,变量还在内存中。
java有垃圾回收机制,回收标准:1:在堆中申请的空间没有被释放。可以保证
2:对象不再使用,内存还保留。不可保证
情况:静态集合类,各种链接,网络链接,io链接等,监听器,变量不合理的作用域。
Socket是什么:套接字,用于两个程序之间实现通讯
生命周期:打开socket,使用,关闭。
NIO是什么:实现反应器模式,采用了非阻塞的方式,在处理大量并发要求时,nio比socket的效率高很多。
为什么说java是平台独立性语言:不同的机器会有不同的jvm,jvm可以把java生成的中间码翻译成可以执行的代码
jion的作用:让调用该方法的线程执行完run后再执行jion后面的代码。用于两个线程的合并
把字符串右移:
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文件。
volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
Servlet
7:Servlet采用java语言编写的服务器端程序,它运行于web服务器中的servlet容器中,提供请求响应的web服务模式,动态的生成web内容,
servlet 乱码:response乱码,requset乱码
response.setCharacterEncoding("UTF-8");response对象中的数据以UTF-8解码后的字节流发向浏览器;
response.setContentType("text/html;charset=utf-8")
或者 response.setHeader("content-type","text/html;charset=UTF-8");告诉浏览器用utf-8解析
request.setCharacterEncoding("utf-8");
<%@ page language="java" pageEncoding="utf-8"%>
/my.ini中的default-character-set=gbk
character-set-server=utf-8;
重新启动mysql的服务
tring url = "jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF8";
Servlet 通过调用 init () 方法进行初始化。
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。
Servlet 调用 service() 方法来处理客户端的请求。
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
Servlet 通过调用 destroy() 方法终止(结束)。
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
采用JSP来表现页面,采用Servlet来完成大量的处理,Servlet扮演一个控制者的角色,并负责响应客户请求。Servlet创建JSP需要的Bean和对象,根据用户的行为,决定将哪个JSP页面发送给用户。
特别要注意 的是,JSP页面中没有任何商业处理逻辑,它只是简单的检索Servlet先前创建的Beans或者对象,再将动态 内容插入预定义的模板。
多线程
多线程有两种实现方法:
方法一:继承Thread类,重写方法run();
方法二:实现Runnable接口,实现方法run();
方法三:实现callable接口。
实现同步有几种方法:例如:synchronized,wait,notify都可以实现同步。
终止线程:stop释放所有的锁,suspend不会释放锁,会造成死锁。
sleep:如同打印机每隔一秒钟打印一次;将机会让给其它线程。不会释放锁。必须捕获异常。
yiled:给更高优先级得到运行机会。
synchronized:可以用在方法,特定代码块中,在竞争激烈时性能下降的很快。必须以相反的顺序释放锁,自动解锁。
sock:性能不变,手动释放(fianlly),都可以用来实现多线程,多了锁投票,定时锁,等候,中断等。
JDBC
9:JDBC(Java数据库连接,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,JDBC实现了所有这些面向标准的目标并且具有简单,严格类型定义且高性能实现的接口。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。
DAO是Data Access Object数据访问接口,数据访问:故名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间
Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录!
10;struts
它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔WebFramework〕,是MVC经典设计模式中的一个经典产品
truts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发。
由JSP建立,struts包含扩展自定义标签库,可以简化创建完全国际化用户界面的过程。
struts中,基本的控制器组件是ActionServlet类中的实例servlet,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。
Action,这个类通常由用户提供,该控制器负责接收来自ActionServlet的请求,并根据该请求调用模型的业务逻辑方法处理请求,并将处理结果返回给JSP页面显示。
Model部分
由JavaBean组成,ActionForm用于封装用户的请求参数,封装成ActionForm对象,该对象被ActionServlet转发给Action,Action根据ActionForm里面的请求参数处理用户的请求。
JavaBean则封装了底层的业务逻辑,包括数据库访问等。
View部分
该部分采用JSP实现。
Struts提供了丰富的标签库,通过标签库可以减少脚本的使用,自定义的标签库可以实现与Model的有效交互,并增加了现实功能。
Controller组件有两个部分组成——系统核心控制器,业务逻辑控制器。
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框
ioc:
IOC其实是一个容器,至于什么控制反转依赖注入只不过是IOC这个容器这个spring核心在创造的过程中的指导思想,更多的简化很多复杂繁琐的重复性工作,将以前只能在代码层做更改的东西,全部放在配置文件层面来解决。以前对象与对象之间在代码层产生的耦合关系,通过配置文件来产生耦合关系,而通过配置文件来产生耦合关系的对象与对象又可以轻易的解耦。
所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。
DI:IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。
aop:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
如果说OOP的出现是把编码问题进行模块化,那么AOP就是把涉及到众多模块的某一类问题进行统一管理
aop就是把众多模块功能模块的某一类问题进行统一管理