Java知识点Tip1
xuet
面向对象
面向对象的优点复用、维护、扩展起来比较方便, Java有这样的特点源于它的三个特性继承、封装、多态。
- 继承:当我们想继承就是一个类通过子类使用extends关键字,继承全部父类的属性、方法,不能选择性继承。子类可以拥有自己的属性、方法,同时子类可以对父类的方法进行重写。继承就是一种is a 的关系。java中所有的类都直接间接继承了object类(equals、toString、getClass等)
- 封装:把一个对象的属性私有化,然后给外界提供可以访问的接口。通过访问权限修饰符(private 、default、protected、public)来控制访问权限,然后通过getter、setter、toString、构造函数等来实现与外界数据传输。可以更好的减少耦合、隐藏信息,实现细节,更加的安全。
- 多态:父类的引用指向子类的对象。重写、接口、抽象类抽象方法就是常用的多态。
平台无关性
我们平时写的.java文件,通过JDK中的javac的编译,编译成**.class**(JVM可以理解的字节码文件),然后通过JVM,变成机器可以执行的机器码。所以字节码和不同系统的JVM实现了Java的平台无关性。
JDK JRE的区别
- JDK包含JRE 同时还有编译器javac 等。
- JRE是java的运行环境。
Java和C++的区别
- java有内存管理(GC)机制,不需要手动释放无用内存。
- C++有指针,java中没有,java中有引用。
- java都是单继承 ,C++可以多重继承。
- C++比java执行快,但是java可以跨平台。
重写和重载
- 重写就是子类对父类的方法重新编写,所有的东西相同,返回值、异常小于等于父类。访问权限修饰符大于等于父类。
- 重载就是方法名相同,参数类型、个数、顺序、方法返回值、访问权限修饰符可以不同,它是类的多态性的一种表现,一个类中有多个相同名字的方法,调用方法的时候根据传的参数决定调用到哪个方法。
String、StringBuffer、StringBuilder区别
-
String 有final修饰所以是不可变的。
private final char value[];
-
StringBuffer是线程安全的。StringBuilder是线程不安全的。
-
String有大小限制,单线程大量数据用StringBuilder。
装箱和拆箱
-
装箱:基本数据类型(byte、boolean、char、float、int、short、doule、long)用对应引用数据类型包装起来(Java中的引用数据类型包括类、接口、数组)
Integer a = 127; Integer a = Integer.valueOf(127);//装箱操作等同于 调用了.valueOf方法
这里我们要注意装箱后的范围 Integer.valueOf 我们打开方法可以看到 [-128,127]
注意,Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。
Double、Float的valueOf方法的实现是类似的。
-
拆箱:将包装的数据类型转化成基本数据类型
-
我们可以通过装箱来获取到入参的数据类型 比如传入 A、C两个类型的参数
private void DisposeFunc( object O ) { switch( o.getType().ToString() ) { case "A": //处理A; case "C": //处理C; } }
在一个静态方法中调用一个非静态成员非法
静态方法可以不通过对象调用,因此在静态方法里,也不能调用其他非静态变量,也不可以访问其他非静态成员。
接口(Interface)和抽象类(Abstract Class)的区别
- 抽象类可以有构造方法,接口中不能有构造方法且只有final、static修饰的变量。
- 抽象类和接口不能被实例化。
- 一个类只能实现一个抽象类,但是能实现多个接口。
成员变量和局部变量的区别
- 成员变量在类中方法外面而局部变量在代码块或者方法内。
- 成员变量在堆中,局部变量在栈中。
- 成员变量随对象创建存在,消失消失。局部变量在代码块或方法执行存在,执行完消失。
- 成员变量会有初始默认值,局部变量需要赋值。
==和equals
-
==比较的是两个对象的地址是否相等(基本数据类型比较的是值,引用数据类型比较的是地址)
-
equals 它的作用也是判断两个对象是否相等。
情况1:类没有覆盖equals方法。这时候和== 方法是一样的。
情况2:类覆盖了equals方法。我们常用的String的.equals方法,用来比较它们的内容是否相等。
hashCode和equals
创建对象往往这两个方法和toString() 这三个方法已经成了必写的东西。hashCode的作用之一,我们进行HashSet的插入的时候检查重复的方法是先计算插入对象的hashCode的值来决定加入位置,同时与该位置的值的hashCode进行比较,如果相同,会调用equals,这个时候如果相同就存不进去,如果不同,就重新散列到其他位置。
- hashCode的目的是获取散列码。它在散列表中才有用(HashMap、HashSet)
- 日常比较两个类直接用equal就可以。
线程、进程、程序之间关系
- 一个进程在执行过程中会产生多个线程(初始、运行、阻塞、等待、超时等待、终止六个状态)
- 进程是程序的一次执行过程,是系统运行的基本单位。
- 程序是含有指令和数据的文件,即静态的代码。
final关键字
-
final变量:基础数据类型,初始化之后变量不能被更改。引用数据类型,不能指向其他对象
-
final方法:把方法锁定,以防继承之后被修改。类中的private隐式的制定为final,提高效率。
-
final类:这个类不能被继承,并且它的方法都会被隐式的制定为final方法。
异常的学习
Mybatis中#和$的区别
#在sql传参的部分显示的是字符串,而$显示的是传入的值
使用#有效的防止sql注入的风险。
Java知识点Tip2
IOC AOP 容器 DI
容器:Spring 框架是一个容器可以管理项目中的所有对象
IOC:控制反转,指得是将对象的创建权反转给Spring。作用是实现了程序的解耦合
DI:依赖注入,需要有IOC环境,在Spring创建Bean对象时,动态的将依赖对象注入到Bean对象中去。依赖注入最大的好处就是解耦合。
AOP:面向切面编程。简单来讲就是将纵向重复的代码,横向抽取出来。Servlet中乱码问题,都需要请求之前request.setCharacterEncoding(“UTF-8”),现在只需要加一层Filter中就可以解决全部乱码。拦截器也是
SpringMVC的执行流程
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用处理器映射器HandlerMapping。
- 处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
- DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
- 执行处理器Handler(Controller,也叫页面控制器)。
- Handler执行完成返回ModelAndView
- HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)
- DispatcherServlet响应用户。
SpringMVC组件说明
- DispatcherServlet:前端控制器。用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性,系统扩展性提高。由框架实现
- HandlerMapping:处理器映射器。HandlerMapping负责根据用户请求的url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,根据一定的规则去查找,例如:xml配置方式,实现接口方式,注解方式等。由框架实现
- Handler:处理器。Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
- HandlAdapter:处理器适配器。通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。由框架实现。
- ModelAndView是springmvc的封装对象,将model和view封装在一起。
- ViewResolver:视图解析器。ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
- View:是springmvc的封装对象,是一个接口, springmvc框架提供了很多的View视图类型,包括:jspview,pdfview,jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
MyBatis工作原理
关于MyBatis的工作原理,网上的文章是汗牛充栋,但是站长觉得,要结合JDBC来理解MyBatis的工作原理往往才能更透彻。我们知道,JDBC有四个核心对象:
- DriverManager,用于注册数据库连接
- Connection,与数据库连接对象
- Statement/PrepareStatement,操作数据库SQL语句的对象
- ResultSet,结果集或一张虚拟表
而MyBatis也有四大核心对象:
- SqlSession对象,该对象中包含了执行SQL语句的所有方法。类似于JDBC里面的Connection 。(在JDBC中,Connection不直接执行SQL方法,而是利用Statement或者PrepareStatement来执行方法。而在MyBatis中,SqlSession对象包含了执行SQL语句的所有方法。但是它是委托Executor执行的)从某种意义上来看,MyBatis里面的SqlSession类似于JDBC中的Connection,他们都是委托给其他类去执行
- Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。
- MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
- ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回类型。
数据库优化
-
根据主键进行查询
-
尽量单表查询/不关联查询
-
能用in 不用not in 尽量不用in not in 连续的用between 不用in 了
SELECT * FROM t_order1 WHERE customer IN (SELECT customer FROM t_order2)
子查询可以用exist代替:
SELECT * FROM t_order1 WHERE EXISTS (SELECT * FROM t_order2 WHERE t1.customer = t2.customer)
-
不用* 、or
-
尽量不在where子句中进行表达式操作,尽量不要进行null判断 where 1=1
-
创建索引create index 索引名称 on 表名称,避免索引进行计算
-
like 百分号尽量别前面后面都加 数据库会放弃索引全表扫描
-
redis 提前缓存
-
一句写出来尽量不多次连接数据库
-
使用表的别名,减少语法错误解析时间
-
union all 替换union with as 临时表
-
分库分表