技术资料查询
一起进步

@EqualsAndHashCode(callSuper = true/false) 作用

shanhubei阅读(326)

首先 @EqualsAndHashCode 标在子类上

1. callSuper = true,根据子类自身的字段值和从父类继承的字段值 来生成hashcode,当两个子类对象比较时,只有子类对象的本身的字段值和继承父类的字段值都相同,equals方法的返回值是true。

2. callSuper = false,根据子类自身的字段值 来生成hashcode, 当两个子类对象比较时,只有子类对象的本身的字段值相同,父类字段值可以不同,equals方法的返回值是true。

    package com.jt.test;
     
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.EqualsAndHashCode;
    import lombok.NoArgsConstructor;
     
    /**
     * @Author: ldj
     * @Date: 2022/03/29/15:39
     * @Description:
     */
    public class HashCodeTest {
        public static void main(String[] args) {
            Cat cat1 = new Cat("黑色", "鲁鲁", 2);
            Cat cat2 = new Cat("白色", "鲁鲁", 2);
     
            System.out.println(cat1.equals(cat2)); //true  callSuper = false
            System.out.println(cat1.equals(cat2)); //false callSuper = true
        }
    }
     
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    class Animal {
        private String color;
    }
     
    @Data
    @EqualsAndHashCode(callSuper = false) //排除父类字段
    class Cat extends Animal {
        private String name;
        private Integer age;
     
        public Cat(String color, String name, Integer age) {
            super(color);
            this.name = name;
            this.age = age;
        }
    }

后续:Lombok 针对特定字段自定义get/set方法 ,排除@Data的覆盖问题

package com.atguli.common.demo;
     
    import lombok.AccessLevel;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.Getter;
     
    /**
     * User: ldj
     * Date: 2022/9/30
     * Time: 21:47
     * Description:
     * 结论:
     * @Getter(AccessLevel.NONE) User1不会生成getAge()方法
     * 即便没有@Getter(AccessLevel.NONE),但手动重写了getAge,
     * 以重写后的为准
     */
    public class GetterDemo {
        public static void main(String[] args) {
            User1 ldj = new User1("ldj", 18);
            System.out.println(ldj);
        }
    }
     
    @Data
    @AllArgsConstructor
    class User1 {
        private String name;
     
        @Getter(AccessLevel.NONE)
        private Integer age;
     
        public Integer getAge() {
            return this.age * 100;
        }
    }

java的long的小l和大L区别

shanhubei阅读(261)

首先几乎在所有位置,long的小写和大写都可以互相替换。其次L本质是对象,不是基础类型,具有Object的特性。

包装类把基本类型转换为对象,每个基本类型在java.lang包中都有一个相应的包装类

包装类型: Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail

基本类型和包装类的异同

在Java中,一切皆对象,但八大基本类型却不是对象。
声明方式的不同,基本类型无需通过new关键字来创建,而封装类型需new关键字。
存储方式及位置的不同,基本类型是直接存储变量的值保存在堆栈中能高效的存取,封装类型需要通过引用指向实例,具体的实例保存在堆中。
初始值的不同,封装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0,boolean类型为false;
使用方式的不同:如与集合类合作使用时只能使用包装类型。
long类型最好以大写L来添加尾缀,因为小写l容易和数字1混淆。 

Java @Data注解

shanhubei阅读(248)

1、@Data注解是lombok.jar包下的注解,该注解通常用在实体bean上,不需要写出set和get方法,但是具备实体bean所具备的方法,简化编程提高变成速度。

 2、@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。
    使用@Data注解前

private String yhz;
     
public String getYhz() {
    return yhz;
}
     
public void setYhz(String yhz) {
   this.yhz = yhz;
}

    使用@Data注解后

@Data
public class Class {
     private String yhz;
}

eclipse导入项目时lombok包(@Data、@Slf4j…)注解无效

shanhubei阅读(314)

1、找到maven仓库lombok的jar包位置,或者在lombok官网(https://www.projectlombok.org/download)下载lombok的jar包

2、打开cmd ,运行javaw -jar lombok.jar (lombok的jar包全称)

3、点击Specify location…

,找到你的eclipse软件所在的目录,选择你的eclipse的exe文件

 4、点击Install / Update即可安装lombok成功。重启eclipse并maven update一下项目。

@RestController

shanhubei阅读(283)

@RestController注解初步理解
一、在Spring中@RestController的作用等同于@Controller + @ResponseBody。

所以想要理解@RestController注解就要先了解@Controller和@ResponseBody注解。

二、@Controller注解

在一个类上添加@Controller注解,表明了这个类是一个控制器类。但想要让这个类成为一个处理请求的处理器光有@Controller注解是不够的,他还需要进一步修炼才能成为一个处理器。

1.在spring容器中创建该类的实例。创建实例的方式有两种:

1

  上述这种方式是在spring容器中注入单个bean,当项目比较大,控制器类比较多时,用这种方式向Spring容器中注入bean非常的让人苦恼,索性有第二种方式。

1

  这种方式会扫描指定包中的所有类,并生成相应的bean注入到spring容器中。使用这种方式当然能够极大提高我们的开发效率,但是有时候我们不想某一类型的类注入到spring容器中。

这个时候第二种方式也可以解决。 

<context:component-scan base-package=“test” >
  <context:include-filter type=“annotation” expression=“org.springframework.stereotype.Service”/>
</context:component-scan>


  上述代码表示扫描test包中除有@Service注解之外的类。

2.将@Controller注解的类注入Spring容器中,只是该类成为处理器的第一步,想要修炼大成,还需要在该类中添加注解@RequestMapping。

@RequestMapping注解是用来映射请求的,即指明处理器可以处理哪些URL请求,该注解既可以用在类上,也可以用在方法上。

当使用@RequestMapping标记控制器类时,方法的请求地址是相对类的请求地址而言的;当没有使用@RequestMapping标记类时,方法的请求地址是绝对路径。

@RequestMapping的地址可以是uri变量,并且通过@PathVariable注解获取作为方法的参数。也可以是通配符来筛选请求地址。具体的使用方法不是本次的重点,有兴趣的可以看

https://www.cnblogs.com/xiepeixing/p/4243288.html

 @Controller
  @RequestMapping("/user")
   public class UserController{

   @RequestMapping("/users")
   public String users() {
   return “users”;
   }

 }



  此时请求users方法的url路径就是:…/user/users。

可以看到上面users方法的返回值是字符串类型的,这个就是处理器在处理完任务后将要跳转的页面。如果想要方法直接返回结果,而不是跳转页面,这就要用到@ResponseBody注解了。

三、@ResponseBody注解

@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。

格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。

如果要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注@RestController,而不用在每个方法中标注@ResponseBody,简化了开发过程。

理解@RestController过程中参考了下面这些博客,非常感谢

https://www.cnblogs.com/daimajun/p/7152970.html

https://blog.csdn.net/l358366885/article/details/79485497

https://blog.csdn.net/sunroyfcb/article/details/81048675


Java保留2位小数(六种方法)

shanhubei阅读(377)

一、使用 java.math.BigDecimal 类

public static String format1(double value) {
            BigDecimal bd = new BigDecimal(value);
            bd = bd.setScale(2, RoundingMode.HALF_UP);
            return bd.toString();
        }

二、使用 java.text.DecimalFormat 类

 public static String format3(double value)  {
            NumberFormat nf = NumberFormat.getNumberInstance();
            nf.setMaximumFractionDigits(2);
            /*
             * setMinimumFractionDigits设置成2
             * 如果不这么做,那么当value的值是100.00的时候返回100
             * 而不是100.00
             */
            nf.setMinimumFractionDigits(2);
            /*
             * 如果想输出的格式用逗号隔开,可以设置成true
             */
            nf.setGroupingUsed(false);
            return nf.format(value);
        }

三、使用 java.text.NumberFormat 类      

 public static String format3(double value)  {
            NumberFormat nf = NumberFormat.getNumberInstance();
            nf.setMaximumFractionDigits(2);
            /*
             * setMinimumFractionDigits设置成2
             * 如果不这么做,那么当value的值是100.00的时候返回100
             * 而不是100.00
             */
            nf.setMinimumFractionDigits(2);
            /*
             * 如果想输出的格式用逗号隔开,可以设置成true
             */
            nf.setGroupingUsed(false);
            return nf.format(value);
        }

四、使用 java.util.Formatter 类 

 public static String format4(double value) {
            /*
             * %.2f % 表示 小数点前任意位数 2 表示两位小数 格式后的结果为 f 表示浮点型
             */
            return new Formatter().format("%.2f", value).toString();
        }

五、使用String的format方法 

        public static String format6(double value) {
            long l =(long)(value*100) ;
            double d = l/100D;
     
            return String.valueOf(d);
        }

六、通过运算

        public static String format6(double value) {
            long l =(long)(value*100) ;
            double d = l/100D;
     
            return String.valueOf(d);
        }

IDEA自动打出对象的所有set方法

shanhubei阅读(381)

首先 IDEA -plugins搜索插件GenerateAllSetter

安装后重启

使用方法

首先写一个 Object A = new Object();
然后 指针放到左边Object上,option + 回车

解决Spring Boot项目后端接口返回数据中文乱码问题

shanhubei阅读(395)

摘要 解决 Spring Boot 项目中,后端返回前端的结果出现中文乱码的问题。

  这几天在使用 Spring Boot 学习AOP原理的时候,通过浏览器访问后端接口的时候,响应报文总是出现中文乱码问题,为了解决这个问题,这里给出两种解决方案。

方案一:properties文件中配置字符编码格式(强烈推荐)

properties文件中加入以下配置,强制指定Servlet编码格式为UTF-8:

server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8

方案二:注解@RequestMapping添加produces属性

  在使用注解@RequestMapping、@GetMapping或者@PostMapping的时候,增加produces属性解决响应报文中文乱码问题:

@GetMapping(value =”/getResultById”, produces = “application/json; charset=utf-8”)

  此方案需要在每个API上都添加说明,麻烦,强烈推荐简单而且方便的方案一。至此,完美解决了中文乱码问题

BufferedReader reader= new BufferedReader(new InputStreamReader(System.in))解读

shanhubei阅读(2635)

System.in的类型可以归结为节点流、字节流、输入流;
InputStreamReader这个对象是处理流,字符流,输入流;
BufferedReader的类型是缓冲处理流、字符流、输入流。

  类 InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。如:GBK 
  每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:  BufferedReader in= new BufferedReader(new InputStreamReader(System.in));

System.in是个字节流

InputStreamReader是个字符流和字节流之间的转换中介

BufferedReader是个字符流
整体意思就是用InputStreamReader这个中介把System.in这个字节流转换成字符流BufferedReader
这样输入的时候就可以不是一个一个字节读,而是一个一个字符读,再加上是个Buffer,效率会高很多。
InputStream is = System.in;//键盘输入流
InputStreamReader isr = new InputStreamReader(is);//字节流转换为字符流
BufferedReader bufr = new BufferedReader(isr);//把字符流添加到缓冲流
用户通过reader对象的readLine方法来进行读取。
————————————————
版权声明:本文为CSDN博主「lzh_86」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lzh_86/article/details/78107597