java学习
1.java
1.字符串判空
- 使用isEmpty判空底层使用的是
public static boolean isEmpty(CharSequence cs) {
return cs == null || cs.length() == 0;
}
2.使用isBlank判空地产是:
public static boolean isBlank(CharSequence cs) {
int strLen = length(cs);
if (strLen == 0) {
return true;
} else {
for(int i = 0; i < strLen; ++i) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}
}
总结:它们的区别主要是字符串中是否区别有null、转义符等类型的字符串
String s = " ";
boolean a = StringUtils.isEmpty(s);
boolean b = StringUtils.isBlank(s);
System.out.println(a); //false
System.out.println(b);//true
2.String 与String
3.hashmap的合并
合并两个hashmap,如果两个map中key有相同的key那么被合并的key会覆盖到之前的key上面
public class HashMapDemo { public static void main(String[] args) { HashMap<Object, Object> map = new HashMap<>(); map.put("name","张三"); HashMap<Object, Object> map1 = new HashMap<>(); map1.put("name","李四"); map.putAll(map1); System.out.println(map); } }
2.SpringBoot
1.@Autowired与@Resource注入
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序:- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
- 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
- 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装 配;
Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。
总结,resource默认使用(name)名称,如果名称不存在,则返回上一级使用(type)类型,可以指定使用name或者type,如果找不到则会出异常。
Autowired使用Type ,找不到就出抛出异常
2. spring循环依赖
什么是循环依赖:
有两个对象,分别是对象A与对象B创建对象A的时候需要对象B,创建对象B的时候需要对象A。
对象A的创建,创建A,将A放入3级缓存中,由于对象A的创建需要对象B;创建对象B,由于对象B的创建需要对象A,去3级缓存中拿到对象A,对象B完成创建,由于对象B创建成功,那么对象A也可以创建成功了。
3.bean的生命周期
1.实例化: 当程序需要JavaBean时,容器会调用默认的构造器实例化一个新对象。
2.属性设置:在实例化后,容器使用setting方法将属性值注入到JavaBean中。
3.初始化: 当所有属性均已设置后,容器将调用init方法初始化JavaBean。如有必要,JavaBean也可以在此时打开数据库链接或者初始化任何资源。
4.活动: 在init方法完成之后,JavaBean进入活动状态,此时应用程序可以调用任何公共方法,读取或修改属性。
5.销毁:当容器接收到信号通知其关闭时,会调用Java的destroy方法终止其运行,并释放它持有的所有资源。
注:并非所有的容器都支持JavaBean的生命周期管理,具体而言,仅仅支持使用sping等框架的web容器可以对JavaBean进行全生命周期的管理。如果你需要完整的JavaBean生命周期管理功能,可以考虑基于spring的web容器,如tomcat、jetty等
3.中间件
1.Rabbitmq
1. rabitmq怎么保证消息不丢失?
让每条消息都带一个唯一id,消费端获取到唯一id将它存储到数据库,每次消费是看数据库中是否有唯一id,有唯一id则不消费,无唯一id可以消费该条消息。