java中级内容总结

java中的总结

一、GC垃圾回收java

一、GC是负责回收全部无任何引用对象的内存空间。 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象自己
二、GC回收机制的两种算法,a、引用计数法  b、可达性分析算法

二、HashMap的存储原理web

HashMap是由数组+链表的一个结构组成;

三、事务redis

Spring可使用编程式实现事务,声明式实现事务以及注解式实现事务;
注解实现事务@Transanctional:
该注解只能放在public方法上,且该方法里不能捕获异常,只能抛出异常;

四、多线程
若是一个任务可能会耗时,为了避免影响走后边的流程,则须要将该任务放在新开的线程里(下边是jdk8的新建线程的语法)算法

new Thread(()->{
            if(StringUtils.isBlank(sendValue)){
                System.out.println("调用发短信接口去发送短信;用户下单失败,请立刻处理;");
                //此时调用发短信接口去发送短信,略过

                /**
                 * 在Redis里放入数据,防止一直不停的发短信
                 * 间隔时间20秒(正常比这个数据久,这里为了测试先设置20秒)
                 */
                redisTemplate.opsForValue().set(saveOrderKey,"save-order-fail",20, TimeUnit.SECONDS);
            }else{
                System.out.println("已经发生太短信了,20秒内不要发了");
            }
        }).start();

五、反射数据库

JAVA反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
通俗地说,反射机制就是能够把一个类,类的成员(函数,属性),当成一个对象来操做,也就是说,类,类的成员,咱们在运行的时候还能够动态地去操做他们.
java的反射机制就是增长程序的灵活性,避免将程序写死到代码里,例如:实例化一个person()对象,不使用反射,new person();若是想变成实例化其余类,那么必须修改源代码,并从新编译。使用反射:class.forName("person").newInstance();并且这个类描述能够写到配置文件中,如**.xml,这样若是想实例化其余类,只要修改配置文件的"类描述"就能够了,不须要从新修改代码并编译。

反射缺点编程

一、反射包括了一些动态类型,因此JVM没法对这些代码进行优化。所以,反射操做的效率要比那些非反射操做低得多。咱们应该避免在常常被执行的代码或对性能要求很高的程序中使用反射。
二、因为反射容许代码执行一些在正常状况下不被容许的操做(好比访问私有的属性和方法),因此使用反射可能会致使意料以外的反作用;

六、AOP面向切面编程后端

面向切面编程:是指在程序运行期间将某段代码,动态的切入到某个类的指定方法的指定位置的这种编程思想叫作面向切面编程
实现AOP的程序:https://blog.csdn.net/liangshilin/article/details/81408916
优势:
一、每一个事物逻辑位于一个位置,代码不分散,便于维护和升级;
二、业务模块更简洁,只包含核心业务代码;

七、IOCapi

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。 
在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
传统Java SE程序设计,咱们直接在对象内部经过new进行建立对象,是程序主动去建立依赖对象;而IoC是有专门一个容器来建立这些对象,即由Ioc容器来控制对象的建立;
谁控制谁?固然是IoC 容器控制了对象;
控制什么?那就是主要控制了外部资源获取(不仅是对象,还有文件等)。

八、tomcat部署web项目内存溢出
    首先打开tomcat目录下bin目录里的catalina.bat文件,在最上边添加以下内容:数组

set CATALINA_OPTS=-Xmx300M -Xms256M

在这里插入图片描述
    而后在在 echo Using CATALINA_BASE: “%CATALINA_BASE%” 前加入以下代码:浏览器

set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

在这里插入图片描述
idea设置tomcat内存:

-server
-XX:PermSize=512M
-XX:MaxPermSize=1024m

在这里插入图片描述
九、token
    seesion简介:

浏览器第一次访问服务器,服务器会建立一个session,而后同时为该session生成一个惟一的会话的key,也就是sessionid,而后,将sessionid及对应的session分别做为key和value保存到缓存中,也能够持久化到数据库中,而后服务器再把sessionid,以cookie的形式发送给客户端。这样浏览器下次再访问时,会直接带着cookie中的sessionid。而后服务器根据sessionid找到对应的session进行匹配;
还有一种是浏览器禁用了cookie或不支持cookie,这种状况能够经过URL重写的方式发到服务器;
   简单来说,用户访问的时候说他本身是李四,他骗你怎么办? 那就当他第一次访问时在服务器端保存李四的信息,给他一个sessionid,让他下次访问时带上sessionid值,而后进行判断便可。

    为何出现了token:

首先,session的存储是须要空间的;其次,session的传递通常都是经过cookie来传递的,或者url重写的方式;而token在服务器是能够不须要存储用户的信息的,且token的传递方式也不限于cookie传递,固然,token也是能够保存起来的;

    token的生成方式:

浏览器第一次访问服务器,根据传过来的惟一标识userId,服务端会经过一些算法(如经常使用的HMAC-SHA256算法),
而后加一个密钥,生成一个token,而后经过BASE64编码一下以后将这个token发送给客户端;
客户端将token保存起来,下次请求时,带着token,服务器收到请求后,而后会用相同的算法和密钥去验证token,若是经过,执行业务操做,不经过,返回不经过信息;

    token和session的区别:

token和session其实都是为了身份验证,session通常翻译为会话,而token更多的时候是翻译为令牌;
session服务器会保存一份,可能保存到缓存,文件,数据库;token是能够不保存的;
一样,session和token都是有过时时间一说,都须要去管理过时时间;

虽然确实都是“客户端记录,每次访问携带”,但 token 很容易设计为自包含的,也就是说,
后端不须要记录什么东西,每次一个无状态请求,每次解密验证,每次当场得出合法 /非法的结论。这一切判断依据,
除了固化在 CS 两端的一些逻辑以外,整个信息是自包含的。这才是真正的无状态。 
而 sessionid ,通常都是一段随机字符串,须要到后端去检索 id 的有效性。万一服务器重启致使内存里的 session 没了呢?万一 redis 服务器挂了呢?

十、Rest接口与RestFul风格:
    简介:

在设计web接口的时候,REST主要是用于定义接口名,接口名通常是用名词写,不用动词,那怎么
表达“获取”或者“删除”或者“更新”这样的操做呢——用请求类型来区分。
好比,咱们有一个friends接口,对于“朋友”咱们有增删改查四种操做,怎么定义REST接口?

增长一个朋友,uri: generalcode.cn/va/friends 接口类型:POST
删除一个朋友,uri: generalcode.cn/va/friends 接口类型:DELETE
修改一个朋友,uri: generalcode.cn/va/friends 接口类型:PUT
查找朋友,   uri: generalcode.cn/va/friends 接口类型:GET

举个反例:generalcode.cn/va/deleteFriends 该接口用来表示删除朋友,这就是不符
合REST协议的接口。

符合下边5条约束的系统就能够说是restFul风格的系统:

一、使用客户/服务器模型。客户和服务器之间经过一个统一的接口来互相通信。
二、层次化的系统。在一个REST系统中,客户端并不会固定地与一个服务器打交道。
三、无状态。在一个REST系统中,服务端并不会保存有关客户的任何状态。也就是说,客户端自身负责用户状态的维持,并在每次发送请求时都须要提供足够的信息。
四、可缓存。REST系统须要可以恰当地缓存请求,以尽可能减小服务端和客户端之间的信息传输,以提升性能。
五、统一的接口。一个REST系统须要使用一个统一的接口来完成子系统之间以及服务与用户之间的交互。这使得REST系统中的各个子系统能够独自完成演化。

十一、JVM总结
JVM介绍

JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
空余堆内存大于70%时,JVM会减小堆直到-Xms的最小限制。所以服务器通常设置-Xms、-Xmx 相等以免在每次GC 后调整堆的大小。
说明:若是-Xmx 不指定或者指定偏小,应用可能会致使java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,没法用try...catch捕捉。

设置JVM

set JAVA_OPTS=-Xms512m -Xmx1024m -XX:PermSize=1024M -XX:MaxNewSize=2048m -XX:MaxPermSize=2048m

十二、模拟当前线程睡眠

//TimeUnit包:import java.util.concurrent.TimeUnit;
  TimeUnit.SECONDS.sleep(10);

1三、String.format拼接字符串

//拼接地址,instance.getHost()放在第一个%s上,instance.getPort()放在第二个%s上
 String url=String.format("http://%s:%s/api/v1/product/find?id="+product_id,instance.getHost(),instance.getPort());

1四、for循环括号里不要写list.letgth

将list.letgth这个值提早拿出去,写在for循环里会每次查数据库,影响效率;

1五、处理Double数据
①、四舍五入,且保留两位小数

double d = 987.125;
String.format("%.2f", d);

②、直接去掉后边的小数,保留两位小数,不进行四舍五入

double d = 123.125;
DecimalFormat df = new DecimalFormat("#.00");
String str = df.format(d);
System.out.println(str);

③、 BigDecimal.ROUND_HALF_UP表示四舍五入,BigDecimal.ROUND_HALF_DOWN也是五舍六入,BigDecimal.ROUND_UP表示进位处理(就是直接加1),BigDecimal.ROUND_DOWN表示直接去掉尾数:

double d = 131.125;
BigDecimal b = new BigDecimal(d);
d = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();        
System.out.println(d);

数据库总结

一、当数据表中A、B字段作了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)

看A、B两字段作组合索引的时候,谁在前面,谁在后面,若是A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。
  同理,使用like模糊查询时,若是只是使用前面%,那么有索引效果,若是使用双%号匹配,那么则无索引效果