LOADING

加载过慢请开启缓存 浏览器默认开启

学习

2023/4/6 学习

java学习

1.java

1.字符串判空
  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装配顺序:

    1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
    2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
    3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
    4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装 配;
  • Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。

    总结,resource默认使用(name)名称,如果名称不存在,则返回上一级使用(type)类型,可以指定使用name或者type,如果找不到则会出异常。

    Autowired使用Type ,找不到就出抛出异常

2. spring循环依赖
  1. 什么是循环依赖:

    有两个对象,分别是对象A与对象B创建对象A的时候需要对象B,创建对象B的时候需要对象A。

  2. 对象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可以消费该条消息。

2.等待中