仁寿县建设局网站,网页制作基础教程例子,网站设计不同的原因,页面正在跳转 3秒后自动最近准备写点Javase的东西#xff0c;希望可以帮助大家写出更好的代码。 1、给不可实例化的类提供私有构造器 比如#xff1a;每个项目中都有很多工具类#xff0c;提供了很多static类型的方法供大家使用#xff0c;谁也不希望看到下面的代码#xff1a; TextUtils textUt… 最近准备写点Javase的东西希望可以帮助大家写出更好的代码。 1、给不可实例化的类提供私有构造器 比如每个项目中都有很多工具类提供了很多static类型的方法供大家使用谁也不希望看到下面的代码 TextUtils textUtils new TextUtils();if(textUtils.isDigitsOnly(123)){//doSometing}else{//doSomething}自己写个工具类总有人喜欢先初始化个实例在调用方法然后还附带一个警告The static method isDigitsOnly(CharSequence) from the type TextUtils should be accessed in a static way 。 你建议他使用类名.方法人家还不乐意我又没出错干嘛要改错了你负责么。所以最好的方式让他没办法new实例。 为工具类添加私有构造器 public class TextUtils {private TextUtils() { /* cannot be instantiated */ } 这是android的TextUtils的源码这样就可以了让他妹的初始化实例~当然你也可以在私有方法里面扔个异常。 public class TextUtils{private TextUtils() { /* cannot be instantiated */ throw new UnsupportedOperationException(cannot be instantiated);}} 对于异常的使用一尽量使用Java提供的异常类这样可以使你的API比较易读和易懂。 2、正确使用String避免创建不必要的对象 很多人面试的时候都遇到过这样的问题String s new String(abc)请问创建了几个对象。也从侧面说明了这是个反面的代码写法 a、String s new String(abc)“abc”本身就是一个String的实例所以new String创建了不必要的String实例 b、如果改写成 String s abc不仅只创建了一个实例而且在同一台VM中对于“abc”字符串的字面常量还会重用。 3、优先使用基本类型Java提供了8种基本类型以及对应的装箱基本类型且在Java1.5 提供了自动装箱和解箱操作虽然方便了代码的编写但是如果不注意可能带来不好的效果。 看下面的代码 long start System.nanoTime();Long sum 0L;for (long i 0; i Integer.MAX_VALUE; i){sum i;}System.out.println(sum);System.out.println(System.nanoTime() - start);//20995956735 如果你观察了内存会发现一直GC一直在内存回收并且计算时间需要20多秒如果我说这段代码有个bug导致代码运行很慢以及耗费内存你能找到吗 下面我修改下代码 long start System.nanoTime();long sum 0l;for (long i 0; i Integer.MAX_VALUE; i){sum i;}System.out.println(sum);System.out.println(System.nanoTime() - start);//5029758632 这次运行不会出现GC一直回收内存且速度也只需要5秒左右可能眼神不好的没有发现哪个地方修改了。 问题就出在自动装箱、解箱上。第一次的程序sum为Long类型在计算sumi时会把sum自动解箱成long sum 然后运算运算完成后再装箱成Long sum导致程序构造了大约2的32次方个多余Long实例。所以各位且用且严谨。 4、对于自己管理内存的类一定要清除不必要的对象引用防止内存泄漏 看下面的代码 package com.zhy._01;import java.util.Arrays;/** 使用数组模拟栈*/
public class MyStack
{private static final int DEFAULT_INIT_SIZE 10;private Object[] eles new Object[DEFAULT_INIT_SIZE];/*** 当前栈顶索引*/private int currentIndex;/*** 弹栈* * return*/public Object pop(){if (currentIndex 0)throw new ArrayIndexOutOfBoundsException(stack is empty);return eles[--currentIndex];}/*** 压栈* * param o*/public void push(Object o){ensureCapacity();eles[currentIndex] o;}private void ensureCapacity(){if (eles.length currentIndex){eles Arrays.copyOf(eles, currentIndex * 2 1);}}}代码中存在一个地方导致了内存泄漏你可以发现不 return eles[--currentIndex]; 这行代码导致如果栈增长了特别大然后调用多次pop弹栈虽然currentIndex小了但是栈始终保持中之前pop出的过期对象的引用这就导致了内存泄漏。如果不注意甚至最终造成OOM。 应该改为 /*** 弹栈* * return*/public Object pop(){if (currentIndex 0)throw new ArrayIndexOutOfBoundsException(stack is empty);Object tmp eles[--currentIndex];eles[currentIndex] null ; return tmp ; } 当然了不要因为担心内存泄漏在每个变量使用完成后都添加xxxnull对于消除过期引用的最好方法就是让包含该引用的变量结束生命周期而不是显示的清空。一般情况下对于类自己管理的内存应当警惕。 好了就到这里这些内容都是我个人觉得值得知道且在项目中会常遇到的希望可以帮助到大家嘿嘿求评论求赞。 转载于:https://www.cnblogs.com/oversea201405/p/3752027.html