步伐人生——Java中基本范例使用建议
https://i-blog.csdnimg.cn/blog_migrate/594dc1eade291a3d6706be94cc80bffd.png引出
步伐人生——Java中基本范例使用建议
Java中基本范例使用建议
建议21:用偶判断,不消奇判断
[*]不要使用奇判断(i%2 == 1 ? “奇数” : “偶数”),使用偶判断(i%2 == 0 ? “偶数” : “奇数”)。原因Java中的取余(%标识符)算法:测试数据输入1 2 0 -1 -2,奇判断的时候,当输入-1时,也会返回偶数。
// 模拟取余计算,dividend被除数,divisor除数
public static int remainder(int dividend, int divisor) {
return dividend - dividend / divisor * divisor;}
建议22:用整数范例处理惩罚货币
[*]不要使用float或者double计算货币,由于在计算机中浮点数“有可能”是不正确的,它只能无限靠近正确值,而不能完全准确。不能使用计算机中的二进制位来表示如0.4等的浮点数。
[*]解决方案:
[*]1、使用BigDecimal(优先使用)
[*]2、使用整型
建议23:不要让范例默默转换
[*]基本范例转换时,使用自动声明方式减少不必要的Bug
public static final int LIGHT_SPEED = 30 * 10000 * 1000;long dis2 = LIGHT_SPEED * 60 * 8;
[*]以上两句在参与运算时会溢出,由于Java是先运算后再举行范例转换的。由于dis2的三个运算参数都是int范例,三者相乘的结果也是int范例,但是已经超过了int的最大值,所以越界了。解决方法,在运算参数60后加L即可。
建议24:界限、界限、照旧界限
[*]数字越界是检验条件失效,界限测试;检验条件if(order>0 && order+cur<=LIMIT),输入的数大于0,加上cur的值之后溢出为负值,小于LIMIT,所以满足条件,但不符合要求
建议25:不要让四舍五入亏了一方
[*]Math.round(10.5)输出结果11;Math.round(-10.5)输出结果-10。这是由于Math.round采用的舍入规则所决定的(采用的是正无穷方向舍入规则),根据不同的场景,慎重选择不同的舍入模式,以进步项目标精准度,减少算法损失
建议26:提防包装范例的null值
[*]泛型中不能使用基本范例,只能使用包装范例,null执行自动拆箱操纵会抛NullPointerException异常,由于自动拆箱是通过调用包装对象的intValue方法来实现的,而访问null的intValue方法会报空指针异常。谨记一点:包装类参与运算时,要做null值校验,即(i!=null ? i : 0)
建议27:审慎包装范例的大小比较
[*]大于>或者小于<比较时,包装范例会调用intValue方法,执行自动拆箱比较。而==等号用来判断两个操纵数是否有相等关系的,假如是基本范例则判断数值是否相等,假如是对象则判断是否是一个对象的两个引用,也就是地址是否相等。通过两次new操纵产生的两个包装范例,地址肯定不相等
建议28:优先使用整型池
[*]自动装箱是通过调用valueOf方法来实现的,包装类的valueOf天生包装实例可以明显进步空间和时间性能)valueOf方法实现源码:
public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <=127) { return IntegerCache.cache; } return new Integer(i); }class IntegerCache { static final Integer cache[] = new Integer[-(-128) + 127 + 1]; static { for (int i = 0; i < cache.length; i++) cache = new Integer(i - 128); }}
[*]cache是IntegerCache内部类的一个静态数组,容纳的是**-128到127**之间的Integer对象。通过valueOf产生包装对象时,假如int参数在-128到127之间,则直接从整型池中得到对象,不在该范围的int范例则通过new天生包装对象。在判断对象是否相等的时候,最好是利用equals方法,避免“==”产生非预期结果。
建议29:优先选择基本范例
[*]int参数先加宽变化成long型,然后自动转换成Long型。Integer.valueOf(i)参数先自动拆箱变化为int范例,与之前类似
建议30:不要任意设置随机种子
[*]若非必要,不要设置随机数种子)(Random r = new Random(1000);该代码中1000即为随机种子。在同一台机器上,不管运行多少次,所打印的随机数都是相同的。在Java中,随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:1、种子不同,产生不同的随机数;2、种子相同,即使实例不同也产生相同的随机数。Random类默认种子(无参构造)是System.nanoTime()的返回值,这个值是距离某一个固定时间点的纳秒数,所以可以产生随机数。java.util.Random类与Math.random方法原理相同
深入认识JVM
JVM内存分配,类加载
Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例
https://i-blog.csdnimg.cn/blog_migrate/9d86e3e499c9402c0f39ceb60d0babc4.png
创建对象的4种方法总结
Java进阶(4)——联合类加载JVM的过程明白创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化
https://i-blog.csdnimg.cn/blog_migrate/7cb8f7f19bfe1e2d7778aa3a1b112761.png
垃圾回收GC
https://i-blog.csdnimg.cn/blog_migrate/7a6a26a970996afb73168ac7c45be06b.png
Java进阶(垃圾回收GC)——理论篇:JVM内存模型 & 垃圾回收定位扫除算法 & JVM中的垃圾回收器
简介:本篇博客先容JVM的内存模型,对比了1.7和1.8的内存模型的变化;先容了垃圾回收的语言发展;阐述了定位垃圾的方法,引用计数法和可达性分析发以及垃圾扫除算法;然后先容了Java中的垃圾回收器,由串行、到并行再到并发,最后到G1的演变;最后给出了垃圾回收器的对比和使用指引。
JVM调优,Arthas使用
[*]Java进阶(JVM调优)——阿里云的Arthas的使用 & 安装和使用 & 死锁查找案例,重新加载案例,慢调用分析
[*]Java进阶(JVM调优)——JVM调优参数 & JDK自带工具使用 & 内存溢出和死锁题目案例 & GC垃圾回收
https://i-blog.csdnimg.cn/blog_migrate/af9ffe6991dd6b43e5873656cab3a11c.png
https://i-blog.csdnimg.cn/blog_migrate/fe07dfd768e7dfbcfef3c96fd4a63c05.png
https://i-blog.csdnimg.cn/blog_migrate/0e888eb85c22c9bd072906aee6bb84c4.png
认识多线程
创建多线程方法+相识线程池
Java进阶(5)——创建多线程的方法extends Thread和implements Runnable的对比 & 线程池及常用的线程池
https://i-blog.csdnimg.cn/blog_migrate/c18f86e823ba5f47065d2ac6a7ad7a61.png
多线程下-1非原子性题目即解决
Java进阶(6)——抢购题目中的数据不安全(非原子性题目)& Java中的synchronize和ReentrantLock锁使用 & 死锁及其产生的条件
https://i-blog.csdnimg.cn/blog_migrate/ebf58c28c7159cc3d3fa105db622f033.png
再论线程,创建、生命周期
Java进阶(再论线程)——线程的4种创建方式 & 线程的生命周期 & 线程的3大特性 & 集合中的线程安全题目
主要内容:
1.线程创建的方式,继续Thread类,实现Runable接口,实现Callable接口,采用线程池;
2.线程生命周期: join():运行结束再下一个, yield():暂时让出cpu的使用权,deamon():保卫线程,最后结束,sleep():假如有锁,不会让出;
3.线程3大特性,原子性,可见性,有序性;
4.list集合中线程安全题目,hash算法题目;
总结
步伐人生——Java中基本范例使用建议
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]