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?(
????</insert>
????<insert?id="insertByBatch"?parameterType="java.util.List">
????????INSERT?INTO?`user`?VALUES
????????<foreach?collection="list"?item="item"?index="index"?separator=",">
????????????(
????????</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">
???????????
????????</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也是可以使用这个的