java编码陷阱

Posted gonghaiyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java编码陷阱相关的知识,希望对你有一定的参考价值。

java类型转换

下面代码如果不加L,将导致int类型超范围,不会自动升级为Long,从而导致结果与实际不符。

    public static boolean isValidity(String faceResultTime, int internalHour) {
        boolean valid = false;
        if (StringUtils.isNotEmpty(faceResultTime)) {
            valid = (System.currentTimeMillis() - DateUtils.parseDateTime(faceResultTime).getTime()) > internalHour * 3600 * 1000L ? false : true;
        }
        return valid;
    }

请求头过大

在这里插入图片描述
解决方式

#端口配置
server:
  port: 8090
  tomcat:
    # 配置tomct的基本目录(用于存放临时文件等数据)
    basedir: /home/credit/xx/runtime
  #配置http传输支持压缩  
  compression:
    enabled: true
    mime-types: application/json,application/xml,text/html,text/xml,text/plai
  max-http-header-size: 10000000

公司固话

    /**
     * 公司固定电话
     * 0-9的数字或-,且11位或12位
     */
    @NotBlank(message = "公司固定电话不能为空")
    @Pattern(regexp = "(0\\\\d{2,3}-[1-9]\\\\d{6,7})|(^[1][3,4,5,7,8][0-9]{9}$)", message = "公司固定电话不满足电话格式")
    private String companyLandline;

关于方法是抛出异常还是包装后返回

在京东时,针对已知的异常,比如参数校验错误、用户操作错误、登录密码错误。这些通过校验可以知道的异常,是通过在service封装返回的。如果是不知道的异常,则会报错,只要报错,就会通过切面的方式将错误信息推送给我们开发人员手机上。所以,报错就是我们未知的错误或者是代码的BUG。这也是alibaba编码规范中的要求。

但是在美的,很多人习惯用throw new Exception()的方式进行抛出异常,只要不满足要求,就会抛出来。

基本类型包装类比较

包装类对象不可使用“==”符做比较运算,如果要进行比较运算时,最好使用java类库中的compareTo方法。

jdk8中groupingBy的用法

/**
     * 
     *
     * @param clientId
     * @param applyNo
     * @return
     */
    private VoucherInfo2Vo getVoucherInfo(String clientId, String applyNo) {
        VoucherInfo2Vo voucherInfoVo = new VoucherInfo2Vo();
        XdImageFile voucherImage = ymImageStoreService.getApplyFileByType(clientId, applyNo, ImageFileType.IMG_CONSUMER_VOUCHERS.getCode());
        List<XdImageFile> otherMaterialListFile = getApplyFileListByType(clientId, applyNo, TCLDict.FILE_STYLE_OTHER_MATERIAL);

        if (voucherImage != null) {
            ConsumeProofVo consumeProofVo = new ConsumeProofVo();
            consumeProofVo.setFileId(voucherImage.getId());
            consumeProofVo.setFileType(voucherImage.getFileType());
            consumeProofVo.setImageThumbUrl(ymImageStoreService.getImgUrl(voucherImage.getThumbBatchNo(), voucherImage.getThumbFileName()));
            consumeProofVo.setImageUrl(ymImageStoreService.getImgUrl(voucherImage.getOriginBatchNo(), voucherImage.getOriginFileName()));
            voucherInfoVo.setConsumeProof(consumeProofVo);
        }

        if (CollectionUtils.isNotEmpty(otherMaterialListFile)) {
            Map<String, List<XdImageFile>> map = otherMaterialListFile.stream().collect(
                    Collectors.groupingBy(e -> e.getFileType()));

            List<OtherProofVo> otherProofVoList = new ArrayList<>();

            for (Map.Entry<String, List<XdImageFile>> entry : map.entrySet()) {
                OtherProofVo otherProofVo = new OtherProofVo();
                otherProofVo.setProofType(entry.getKey());
                otherProofVo.setProofTypeDesc(ImageFileType.parse(entry.getKey()).getDesc());

                List<ConsumeProofVo> consumeProofVoList = new ArrayList<>();
                List<XdImageFile> xdImageFileList = entry.getValue();
                for (XdImageFile f : xdImageFileList) {
                    ConsumeProofVo consumeProofVo = new ConsumeProofVo();
                    consumeProofVo.setFileId(f.getId());
                    consumeProofVo.setFileType(f.getFileType());
                    consumeProofVo.setImageThumbUrl(ymImageStoreService.getImgUrl(f.getThumbBatchNo(), f.getThumbFileName()));
                    consumeProofVo.setImageUrl(ymImageStoreService.getImgUrl(f.getOriginBatchNo(), f.getOriginFileName()));
                    consumeProofVoList.add(consumeProofVo);
                }
                otherProofVo.setProofFileList(consumeProofVoList);
                otherProofVoList.add(otherProofVo);
            }
            voucherInfoVo.setOtherProof(otherProofVoList);

        }
        return voucherInfoVo;
    }

null的输出

        String ss = null;
        System.out.println(ss);//null
        System.out.println(ss + "") ;//null

关于java包装类型比较

低于128的时候,IntegerCache会缓存。

        Integer a = null;
        System.out.println(a == 512);//NullPointerException
        Integer b = new Integer(1024);
        Integer c = new Integer(1024);
        System.out.println(b == c);//false
        System.out.println(b.equals(c));//true

为什么equals可以,请看equals源码。

Integer.java
public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

身份证尾号为x

#face++人脸时,忽略身份证大小写对比
xdBasecust.getCertNo().equalsIgnoreCase(idCardORCResult.getString("id_card_number")

联系人姓名不能含有表情符及个人邮箱

 /**
         * 联系人姓名
         */
        @NotBlank(message = "联系人姓名不能为空")
        @Size(max = 20)
        @Pattern(regexp = "(?!([\\ud83c\\udc00-\\ud83c\\udfff]|[\\ud83d\\udc00-\\ud83d\\udfff]|[\\u2600-\\u27ff]))", message = "居住地址中不能含有表情符")
        private String name;
        /**
         * 联系人手机号
         */
        @NotBlank(message = "联系人手机号不能为空")
        @Pattern(regexp = "^1[0-9]{10}$", message = "联系人手机号不满足手机格式")
        private String mobileNo;
            /**
     * 公司固定电话
     * 0-9的数字或-,且11位或12位
     */
    @NotBlank(message = "公司固定电话不能为空")
    @Pattern(regexp = "(^0([0-9]|[-]){6,13}$)|(^[1][3,4,5,7,8,9][0-9]{9}$)", message = "请输入正确的公司电话")
    private String companyLandline;
    /**
     * 个人邮箱
     */
    @NotBlank(message = "个人邮箱不能为空")
    @Pattern(regexp = "^[A-Za-z0-9(\\\\.)+\\\\u4e00-\\\\u9fa5]+@[a-zA-Z0-9_-]+(\\\\.[a-zA-Z0-9_-]+)+$", message = "个人邮箱不满足邮箱格式")
    private String personalMailbox;

在大多数JVM中,Object.hashCode()与内存位置无关

对于OpenJDK和HotSpot JVM,hashCode()是按需生成的,并存储在对象的标头中。 使用Unsafe,您可以查看是否已设置hashCode。

重写equals方法的时候为什么需要重写hashcode

equals()方法和hashcode()方法是Object类的两个方法。从下面的代码中可以看到equals方法比较的是内存地址是否相等,因此一般情况下也无法满足两个对象值的比较。

  1. 如果要满足两个对象的值是否相等,需要重写equals方法。
  2. 如果在使用HashMap等容器类时,用对象当做key进行比较时,如下代码,此时,需要重写hashCode是为了让同一个Class对象的两个具有相同值的对象的Hash值相等。
  3. 同时重写hashCode()与equals()是为了满足HashSet、HashMap等此类集合的相同对象的不重复存储。
//Object.java
public native int hashCode();
 
public boolean equals(Object obj) {
        return (this == obj);
    }

//Test.java
        Student s1 = new Student(1,"June");
        Student s2 = new Student(1,"June");
 
        Map<Object,String> testMap = new HashMap<Object,String>();
        testMap.put(s1, "美国学生");
        System.out.println(s1.equals(s2));//对象比较

那该如何重写该对象呢?如下仅仅是个示例。大家要根据自己的对象进行改写。


public class Student {
    private int age;
    private String name;


@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}

double的使用

double a = 0.0d;
        double b = 0d;
        if(a == b) {//这两者是相等的
            System.out.println("test");
        }

java代码不能实现对jar包中的配置文件改写

原本打算读取IO流后写入流的方式进行重写jar包中的配置文件。但是这种方式在jar包中配置文件根本就不支持写。

@PostConstruct
    public void initEAP() throws Exception {
        org.springframework.core.io.Resource resource = new ClassPathResource("/conf/eap-ssapi.conf");
        InputStream is = resource.getInputStream();
        Properties configs = new Properties();
        configs.load(is);
        Config.getInstance().load("/conf/eap-ssapi.conf");
        Config.getInstance().get("test");
        configs.setProperty("loan", loanAddr);
        String key = "loan";
        MyProperties myProps = new MyProperties(configs);
        FileOutputStream out = null;
        FileLock lock = null;
        is.close();
        try {
            out = new FileOutputStream(resource.getFile());
            FileChannel channel = out.getChannel();
            lock = channel.tryLock();
            if (lock == null) {
                throw new Exception("file is being edited: " + resource.getFile());
            }

            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
            Date date = new Date();
            myProps.store(out, "Last edit time: " + format.format(date));
        } finally {
            try {
                out.close();
            } catch (Exception var28) {
            }

            try {
                lock.release();
            } catch (Exception var27) {
            }

        }
        Util.storeProperties2(resource.getURI().getPath(), configs, "loan");
    }

以上是关于java编码陷阱的主要内容,如果未能解决你的问题,请参考以下文章

Java面试中的常见陷阱!

编码SLL时获取中止陷阱6

是一个热门编码是免费的虚拟陷阱[关闭]

C++编码陷阱总结

JS变量比较陷阱

markdown 打字稿...编码说明,提示,作弊,指南,代码片段和教程文章