Jav基础不好搞出笑话的问题

1 equals(eq日)和==的不同

equals方法是java.lang.Object类的方法

有两种用法说明:

一、对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。 1、“==”比较两个变量本身的值,即两个对象在内存中的首地址。 (java中,对象的首地址是它在内存中存放的起始地址,它后面的地址是用来存放它所包含的各个属性的地址,所以内存中会用多个内存块来存放对象的各个参数,而通过这个首地址就可以找到该对象,进而可以找到该对象的各个属性)

这个是他们的定义

前几天遇到一个奇葩的事情,同事说的,我刚开始以为是我菜,不知道这个

前几天同事不是写一个枚举吗

public enum DeliveryStatusEnum {

    cancel(1,"取消"),
    noPay(2,"待付款"),
    noDelivery(3,"待提货"),
    close(4,"已关闭"),
    finish(5,"已完成"),
    RefoundIng(7,"售后中"),
    RefoundFinsh(8,"售后完成"),
    fill(8,"填充状态");

    public Integer code;
    public String msg;

    private DeliveryStatusEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

奇葩来了 他写一个

tradeCoreOrderServerRemoteFacade.orderNoSend(detailByDeliveryNo.getOrderNo()).equals(1)

我当场迷了,这个是什么,为什么可以这样,他回答,假设他传递是long,只有 Integer(应的解)才能==,这样可以比较2个数字的地址

那真实的情况是什么

 public class Test11 {
    public static void main(String[] args) {
       Long  j=1L;
       Integer k=1;
       int l=1;
       long o=1;
       long p=1L;

       if (j==1){
           System.out.println("1111111");
       }
       if (k == 1){
           System.out.println("2222222222222222");
       }
       if (l==1){
           System.out.println("333333333333");
       }
       if (o==1){
           System.out.println("4444444444444444444444");
       }
       if (p==1){
           System.out.println("5555555555555555555555555");
       }
       if (j.equals(1)){
           System.out.println("66666666666666666666666666666");
       }
       if (j.equals("1")){
           System.out.println("77777777777777777777");
       }
       if (k.equals("1")){
           System.out.println("88888888888888888888888888");
       }
       if (k.equals(1)){
           System.out.println("9999999999999999999999999999999999999");
       }
    }
}

测试一下 没有错误equals("1")和equals(1) 不会出现问题

看结果


1111111
2222222222222222
333333333333
4444444444444444444444
5555555555555555555555555
9999999999999999999999999999999999999

所有说,他说的不对

对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其,对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。 再测试一个小数

public class Test11 {
    public static void main(String[] args) {
Double  gs=0.98;
double  kk=0.098;
Float jj=0.98f;
           if (jj.equals("0.98")){
              System.out.println("111111111111");
    }
       if (jj.equals(0.98)){
           System.out.println("2222222222222222222222");
       }
       if (gs==0.98){
           System.out.println("3333333333333");
       }
    }
}

2222222222222222222222
3333333333333

所有建议数字还是==,字符串才比较地址

至于为什么去看我以前写过的字符串源码分析

== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。

注意

对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。 大家要分清,不要说出来要别人感觉你比较搞笑,你以为正确,但是别人最后发现你乱七八糟说的

奇葩问题2

public class Test11 {
    public static void main(String[] args) {
        List<User> list=new ArrayList();
       
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getPassword());
        }
        for (User i:list) {
            System.out.println(i.toString());
        }
    }
}

假设集合都没有值的时候不会出现问题的,但是 测试

@RestController
class UserCotroller111 {

    @Autowired
    private UserService userService;
    @GetMapping("/cc")
    public String getMap(){
     return userService.select();
    }
    @GetMapping("/kk")
    public String getkk(){
        return userService.insert();
    }
}

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhuzhumail.dao.Userdao">
    <select id="select" parameterType="com.zhuzhumail.entity.User" resultType="com.zhuzhumail.entity.User">
        SELECT * FROM `user`
    </select>
    <insert id="insert" parameterType="com.zhuzhumail.entity.User">
     insert into  `user`(`name`,password)   values (#{name},#{password})
    </insert>
    <insert id="insertByBatch" parameterType="java.util.List">
        INSERT INTO `user` VALUES
        <foreach collection="list" item="item" index="index" separator=",">
            (#{item.name},#{item.password})
        </foreach>
    </insert>

</mapper>

业务层

@Service
public class UserServiceimp implements UserService {
    @Autowired
    private Userdao userdao;
    @Override
    public String select() {
        System.out.println("11111111111111");
        List<User> list=new ArrayList();
        for (int i = 0; i < list.size(); i++) {
            userdao.insert(list.get(i));
        }
        return "成功";
    }

    @Override
    public String insert() {
        List<User> list=new ArrayList();
        userdao.insertByBatch(list);
        return "批量插入";
    }
}

发现批量插入是有问题的 插入的时候记得数据什么字段必须存在,不能为空,你传递是null也是会出现问题的

@Data
public class User implements Serializable {

    private Integer id;

    private String name;


//    private String password;

}

出现这种缺password也是会出现问题的 所有建议大家的插入在真实项目中进行手写,不要调用

这种的万能的 自己认为自己聪明都是会出现问题的

 <insert id="insertByPrimaryKey" parameterType="com.rome.cstore.infrastructure.dataobject.RefundOrderinfo"  useGeneratedKeys="true" keyProperty="id">
      INSERT into cstore_refund_order_info
      <trim prefix="(" suffix=")" suffixOverrides=",">
          <if test="orderId!=null">
              order_id
          </if>
        
         
      </trim>
      <trim prefix="values (" suffix=")" suffixOverrides=",">
         <if test="orderId!=null">
           #{orderId}
        </if>
      </trim>
  </insert>

这个跟更新的set一样会自动去调,但是最后一个不要加,

奇葩问题3

假设2张表进行相连有关系 ,但是

2种情况 连接条件是空和连接条件不存在

执行sql

SELECT * FROM staff sta INNER JOIN department de on sta.departmentid=de.departmentid

没有问题,我不知道为什么当时我同事出现这个问题 可能就是mysql版本高,出现问题

post的请求

@RequestParam(value = "deliveryCode") String deliveryCode也是可以使用这个的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值