• 每日知识记载总结51


    1. static final修饰符

      final修饰类 不能被继承,也没有子类。

      【使用环境】:
      1.不是专门为继承而设计的类,类的本身方法之间有复杂的调用关系。假如随意创建这些类的子类,子类可能会错误的修改父类的实现细节
      2.出于安全原因,类的实现细节不允许有任何改动
      3.在创建对象模型的时候,确信这个类不会再被扩展

      final 不能修饰接口
      final 修饰的方法 不能重写
      final 可以修饰入参

      static 可以修饰类 不能修饰接口 不能修饰入参 不能出现在方法内
      java允许我们在一个类里面定义静态类。比如内部类(nested class)。把nested class封闭起来的类叫外部类。在java中,我们不能用static修饰顶级类(top level class)。只有内部类可以为static。

      静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同。

      (1)内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。

      (2)非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。

      (3)一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。

    2. 接口和抽象类
      抽象类
      使用abstract关键字修饰,并且没有方法体
      抽象类不能直接创建实例可以定义引用变量。

       Shape shape=new Shape();错
       Shape shape=new Circle();对
      

      抽象类只能被继承,一个具体类继承一个抽象类,必须实现所有的抽象方法。
      有抽象的方法类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以是全是具体的方法。
      abstract与final不能同时使用。final阻止重写和继承的。
      abstract与private也不能同时修饰方法,因为private阻止继承,也阻止了重写的事实。

      抽象类与接口的区别
          抽象类不能创建实例
          抽象类的抽象方法不需在具体的子类来实现,不能有抽象的构造方法或者抽象的静态方法。
          接口是抽象类的一种特例,接口中的所有方法都必须是抽象的,接口的方法默认为public abstract类型,接口中的成员变量默认为 public static final类型

        区别如下
          抽象类可以有构造方法,接口中不能有构造方法。
          抽象类可以有普通成员变量,接口中没有。
          抽象类中包含非抽象的方法,接口中的所有方法必须是抽象的。
          抽象类的抽象方法访问的类型可以是public,protected和默认类型(最好不要),接口接口方法只能是public类型的,,并且默认为public abstract类型。
          一个类只能继承一个抽象类,但可以实现多个接口

    3. redis key值还有乱码xacxedx00x05tx00x0cALIYUN_TOKEN

      原因:
      spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化,如下

       private boolean enableDefaultSerializer = true;
       private RedisSerializer<?> defaultSerializer = new JdkSerializationRedisSerializer();
       private RedisSerializer keySerializer = null;
       private RedisSerializer valueSerializer = null;
       private RedisSerializer hashKeySerializer = null;
       private RedisSerializer hashValueSerializer = null;
      

      解决方法:设置序列化方式为StringRedisSerializer

       private RedisTemplate redisTemplate;
      
       @Autowired(required = false)
       public void setRedisTemplate(RedisTemplate redisTemplate) {
           RedisSerializer stringSerializer = new StringRedisSerializer();
           redisTemplate.setKeySerializer(stringSerializer);
           redisTemplate.setValueSerializer(stringSerializer);
           redisTemplate.setHashKeySerializer(stringSerializer);
           redisTemplate.setHashValueSerializer(stringSerializer);
           this.redisTemplate = redisTemplate;
       }
      
    4. 日志级别输出

      Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来,也是说大于等于的级别的日志才输出。

      logback指定某方法打印至某指定目录 以方便观察

       <appender name="CAR_TRACE"
                 class="ch.qos.logback.core.rolling.RollingFileAppender">
           <filter class="ch.qos.logback.classic.filter.LevelFilter">
               <level>INFO</level>
               <onMatch>ACCEPT</onMatch>
               <onMismatch>DENY</onMismatch>
           </filter>
           <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
               <FileNamePattern>/opt/car_log/trace_%d{yyyyMMdd}.log</FileNamePattern>
               <MaxHistory>30</MaxHistory>
           </rollingPolicy>
           <encoder>
               <pattern>%d{HH:mm:ss} [%F:%L] %-5level - %msg%n</pattern>
           </encoder>
       </appender>
      
       <logger name="CAR_TRACE" level="DEBUG">
           <appender-ref ref="CAR_TRACE" />
       </logger>
      

      在java类创建该日志对象

       private static Logger logger_car_trace = LoggerFactory.getLogger("CAR_TRACE");
      
    5. 抓取html后提取并处理文字内容

      1. pom.xml配置jar包

        <dependency>
        	<groupId>org.jsoup</groupId>
        	<artifactId>jsoup</artifactId>
        	<version>1.11.3</version>
        </dependency>
        
      2. java代码

         // 1. Jsoup.parse(html).text() 用jsonP的方法处理成文本
         // 2. replaceAll("\uFEFF", "") 处理bom头
         Jsoup.parse(html).text().replaceAll("\uFEFF", "");
         
         // 3.  	 tab,缩进  
          换行 
         回车  全部替换为,
         text.replaceAll("[\t\n\r]", ",");
         
         // 4. 替换所有的空格为逗号 包含一个或多个
         text.replaceAll("[' ']+", ",")
        

      延展:
      /t相当于键盘的Tab键,/n换行New Line,/r回车Carriage Return,基本的概念应该是回车表示回到最前面,换行表示换一行。

      操作系统的不同,换行符操也不同:

      /r Mac
      /n Unix/Linux
      /r/n Windows

    6. 查看linux是32位还是64位
      使用命令 “getconf LONG_BIT”

      如果返回的是32,那么就是32位

      如果返回的是64,那么就是64位

  • 相关阅读:
    Vue + Element UI 实现权限管理系统 前端篇(十二):用户管理模块
    Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十二):解决跨域问题
    SpringBoot使用CORS解决跨域请求问题
    Vue笔记:生命周期和钩子函数
    Vue + Element UI 实现权限管理系统 前端篇(十一):第三方图标库
    Vue + Element UI 实现权限管理系统 前端篇(十):动态加载菜单
    Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十一):集成 Shiro 框架
    Vue + Element UI 实现权限管理系统 前端篇(九):接口格式定义
    Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十):接口服务整理
    Vue + Element UI 实现权限管理系统 前端篇(八):管理应用状态
  • 原文地址:https://www.cnblogs.com/cuiyf/p/11302034.html
Copyright © 2020-2023  润新知