Java-易错点

数值转List

		String[] arr=new String[]{"1","2","3"};
        //数组转List的坑
        List<String> list = Arrays.asList(arr);
        System.out.println(list.add("1"));

Arrays.asList得到的是一个内部类,不是util下的ArrayList,没有实现add方法,执行会出现如下异常

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at com.test.utils.CloneTest.main(CloneTest.java:26)

正确的写法

String[] arr=new String[]{"1","2","3"};
        List<String> lst=new ArrayList<String>(Arrays.asList(arr));
        System.out.print(lst);

执行contain方法不会出现问题:

//List是否包含一个字符串的比较
        String[] arr=new String[]{"1","2","3"};
        System.out.print(Arrays.asList(arr).contains("3"));

参考
http://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247487301&idx=2&sn=9b3c815120343d2f73370f335189f5f5&chksm=e8fe934cdf891a5a81025b456402a715daf80f45f29a1db53d9526b4181d6045462b8394137b&mpshare=1&scene=24&srcid=#rd

int与Integer

//-128~127之间通过Integer var这种写法将会复用内存中值相同的对象测试
        Integer a=new Integer(1);
        Integer b=new Integer(1);
        //false---指向的是不同的内存空间
        System.out.println(a==b);
        //true---值相同
        System.out.println(a.equals(b));
        System.out.println("--------------------");

        //-128~127之间通过Integer var这种写法将会复用内存中值相同的对象
        Integer c=1;
        Integer d=1;
        //true--复用值相同的对象
        System.out.println(c==d);
        //true--值相同
        System.out.println(c.equals(d));
        System.out.println("---------------------");

        Integer g=1111;
        Integer h=1111;
        //false--不在-128~127之间,会再次new对象
        System.out.println(g==h);
        //true--值相同
        System.out.println(g.equals(h));
        //参考https://blog.csdn.net/alan_gaohaodong/article/details/80720704

        System.out.println("-------------------");

        Integer e=new Integer(1111);
        Integer f=new Integer(1111);
        //false--指向的是不同的内存空间
        System.out.println(e==f);
        //true--值相同
        System.out.println(e.equals(f));

BigDecimal

		double a=1.1;
		BigDecimal aD=new BigDecimal(a);
		//--不等于1.100000000000000088817841970012523233890533447265625
		System.out.println(aD);

		double b=1.1;
		BigDecimal bD = BigDecimal.valueOf(b);
		//得到1.1
		System.out.println(bD);

		//因为不是所有的浮点数都能够被精确的表示成一个double 类型值,有些浮点数值不能够被精确的表示成 double 类型值,
		// 因此它会被表示成与它最接近的 double 类型的值。必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。
		BigDecimal c = new BigDecimal(""+1.1);
		//得到1.1
		System.out.println(c);

		Integer d1=1;
		BigDecimal d=new BigDecimal(d1);
		//得到1
		System.out.println(d);

		//加法
		//new BigDecimal(0)).add(BigDecimal.valueOf(defaultValueRate))

		//减法
		BigDecimal subtract = BigDecimal.valueOf(1).subtract(BigDecimal.valueOf(2));
		System.out.println(subtract);

		//乘法
		double callDuration = BigDecimal.valueOf(Double.parseDouble("0.3"))
				.multiply(BigDecimal.valueOf(60)).setScale(1, BigDecimal.ROUND_UP).doubleValue();
		System.out.println(callDuration);

		//除法
		//保留小数位--保留4位--小数点向右移动
        float v = new BigDecimal(1).divide(new BigDecimal(3), 4,
                BigDecimal.ROUND_HALF_UP).movePointRight(2).floatValue();
        System.out.println(v);

比较

		BigDecimal a=BigDecimal.valueOf(3);
		BigDecimal b=BigDecimal.valueOf(5);
		System.out.println(a.compareTo(b));

参考//https://blog.csdn.net/haiyinshushe/article/details/82721234
https://mp.weixin.qq.com/s/auHwSBBuBXLNrdk1yQEQ6Q

BeanUtils.copyProperties,如果对象内存在嵌套对象,那么复制的是地址,不是一个新的对象。
pojo

    public static class User {

        private int i;

        private Integer id;

        private String userName;

        private User sonUser;

        public User() {
        }

        public User(Integer id,String userName) {
            this.id=id;
            this.userName = userName;
        }

        public int getI() {
            return i;
        }

        public void setI(int i) {
            this.i = i;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public User getSonUser() {
            return sonUser;
        }

        public void setSonUser(User sonUser) {
            this.sonUser = sonUser;
        }
    }
    /**
     * BeanUtils.copyProperties List类型变量还是指向一块内存区域
     */
    @Test
    public void test01(){
        Page<User> page1=new Page<>();
        page1.setTotal(100);
        page1.setSize(10);
        page1.setCurrent(1);
        page1.setRecords(Stream.of(new User(1,"u1")).collect(Collectors.toList()));

        Page<User> page2=new Page<>();
        BeanUtils.copyProperties(page1, page2);

        page1.setTotal(101);
        page1.getRecords().add(new User(2,"u2"));

        //records中有新加入的User对象
        // [{"i":0,"id":1,"userName":"u1"},{"i":0,"id":2,"userName":"u2"}]
        System.out.println(JSON.toJSONString(page2.getRecords()));
        // 100 不变
        System.out.println(page2.getTotal());
    }
    @Test
    public void test02(){
        User user01=new User(1,"u1");
        user01.setSonUser(new User(111, "u111"));

        User user02=new User();
        BeanUtils.copyProperties(user01, user02);

        user01.setId(11);
        user01.setUserName("u11");
        user01.getSonUser().setUserName("u111111111");
        user01.getSonUser().setId(111111111);
        //嵌套对象中的值均改变了
        // {"i":0,"id":1,"sonUser":{"i":0,"id":111111111,"userName":"u111111111"},"userName":"u1"}
        System.out.println(JSON.toJSONString(user02));
    }

方法中改变对象值

    @Test
    public void test03(){
        User user=new User(1, "u1");
        user.setI(1);
        user.setSonUser(new User(111111111, "sonU11111111"));
        changeUser(user);
        //值均改变了
        // {"i":2,"id":11,"sonUser":{"i":0,"id":222222,"userName":"sonU222222"},"userName":"u11"}
        System.out.println(JSON.toJSONString(user));
    }

    public static void changeUser(User user){
        user.setI(2);
        user.setId(11);
        user.setUserName("u11");
        user.getSonUser().setId(222222);
        user.getSonUser().setUserName("sonU222222");
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值