当前位置: 首页 > 网络应用技术

35个提高Java效率的技巧,都使用它!

时间:2023-03-07 13:27:25 网络应用技术

  代码优化,一个非常重要的主题,有些人可能会感到毫无用处。某些小地方的影响是什么?改变代码的操作效率有什么影响?我认为这样的问题就像海中的鲸鱼一样。吃一只小虾吗?它没有用,但是吃了小虾后,鲸鱼被喂了。

  代码优化也是如此。如果项目专注于没有错误的情况下,则可以掌握大小的小规模,并且可以磨削代码的详细信息;可以优化的详细信息。小型优化点之一累积了,该代码的运行效率肯定会提高。

  代码优化的目标是:

  1.尝试使用最终修饰符指定方法方法的类和方法。在Java Core API中,有许多最终示例,例如Java.lang.string,整个类都是最终的示例。指定可以使类不继承的类的最终修饰符,并且该方法指定最终修饰符可以使方法无法重写。如果将类指定为最终方法,则该类的所有方法都是最终的。编译器将寻找内部联邦的所有最终方法。内部联盟对提高Java的运行效率有很大的影响。这可以平均提高性能50%。

  2.尝试重复使用对象,尤其是使用字符串对象。连接字符串后,您应该使用StringBuilder/StringBuffer。Beaf.bava Virtual Machine不仅需要时间来生成对象,而且将来可能需要时间回收和处理这些对象,因此生成过多的对象将具有一个对计划的性能的巨大影响。

  3.在尽可能多地使用局部变量时传递的参数,并且在调用中创建的临时变量存储在堆栈中,其他变量,例如静态变量,实例变量等,是在桩中创建的,而且速度较慢。速度较慢。添加速度,堆栈中创建的变量随方法结束而消失,并且这些内容消失了,不需要其他垃圾回收。

  4.及时关闭Java编程的流。执行数据库连接时,I/O流操作必须小心。使用后,关闭以及时释放资源。由于这些大物体的操作将导致系统支出很大,因此一点粗心大意会导致严重的后果。

  5.尝试最大程度地减少变量的重复计算,以明确阐明一个概念。调用了调用方法,即使方法中只有一个句子,它也被消耗了,包括创建堆栈框架,创建呼叫方法时的保护站点以及当调用方法为例如,以下操作:

  建议取代它:

  这样,当list.size()非常大时,大量消费就会减少。

  6.尝试使用懒惰加载策略,也就是说,当您需要时,例如:

  建议取代它:

  7.要小心异常异常对性能不利。首先,一个新的对象是抛出例外。可投掷接口的构造函数调用名为FillInstackTrace()的本地同步方法。为了进行错误处理,不应用于控制程序流。

  8.不要使用尝试...捕捉...在周期中,除非有任何理由,只要您的领导层是高级的,就应该把它放在最外层的层。几乎没有痴迷的脉冲障碍,八个成就会责骂您为什么要编写此垃圾代码。

  9.如果您可以估计要添加的内容的长度,则基础层的初始长度的设置由数组(例如ArrayList,linkedllist,stringBuilder,stringBuilder,stringBuffer,hashmap,hashset等)实现,例如:stringBuilder作为示例:

  它可以通过设置类(不仅在上面的StringBuilder)来设置其初始化能力,这可以显着提高性能。例如,StringBuilder,长度表示StringBuilder可以维护的字符数量。何时何时StringBuilder达到最大容量,它将将自己的能力提高到当前两次和2次。每当StringBuilder达到其最大容量时,它必须创建一个新的字符数组,然后使旧字符复制到新字符阵列中 - 这是一个非常昂贵的操作。想象一下,如果估计5,000,则字符应存储在字符阵列中,未指定长度,并且接近5,000的2个时间功率为4096。

  这样,不仅浪费了内存空间并降低代码操作效率。因此,不可能设置合理的初始化能力来为底层设置收集和工具类别,这将带来立即效果。是数组+链接列表的集合,不要将初始大小设置为您估计的大小,因为表格上只有一个对象的可能性几乎为0。建议将初始大小设置为n次n次2次。如果可以估计具有2,000个元素,则可以将其设置为新的哈希姆普(128)和新的哈希图(256)。

  10.复制大量数据后,使用system.ArrayCopy()命令11.乘法和删除使用位移操作,例如:

  位移操作可以大大改善性能,因为在计算机的底部,正确位置的操作是最方便,最快的。因此,建议修改它:

  尽管位移操作很快,但它可能会使代码不理解,因此最好添加相应的注释。

  12.不要在周期中不断创建对象引用。例如:

  此方法将导致内存中计数对象的引用。如果计数很大,它将消耗内存。建议更改它:

  在这种情况下,内存中只有一个对象引用。每次它是新对象()时,对象对象引用了不同对象,但是内存中只有一个对象可以大大保存内存空间。

  13.基于效率和类型检查的考虑应尽可能用作数组。不能确定在使用ArrayList14之前大量使用阵列。尝试使用hashmap,arraylist,stringBuilder。除非线程安全需求,否则不建议使用Hashtable,Vector,StringBuffer和最后三个三个三个。由于使用同步机制而导致的绩效开销15.请勿将数组声明为公共静态最终最终最终最终。这仅定义对静态决赛的引用。数组的内容仍然可以随意更改。这是一个安全漏洞,这意味着外部类可以更改此数组。

  16.尝试在正确的场合使用单个箱子来减轻加载的负担,缩短装载时间并提高加载效率,但并非所有地方都适合单身。简而言之,单打主要适用于以下方面:

  17.尝试避免随意使用静态变量。当某个对象由定义为静态的变量引用时,GC通常不会恢复该对象所占据的堆栈内存,例如:::

  目前,静态变量B的生命周期与A类相同。如果未卸载类A类,则参考B中的B对象B将居住在内存中,直到程序终止为止。

  18.为了删除不再活动的会话,不再需要的清晰会议,许多应用程序服务器具有默认的会话超时时间,通常为30分钟。当应用程序服务器需要节省更多会话时,如果内存为不足,操作系统会将某些数据传输到磁盘,并且应用程序服务器还可以根据MRU(最近使用的)algorithm.Algorithm.Chimmm.Chim可能会抛出异常内存。如果会话为要将其转移到磁盘中,必须将对象的序列化成本序列化,以大规模的群集序列化。因此,当不再需要会话时,应调用Httpsession的无效()方法以及时清除会话。

  19.诸如ArrayList之类的随机界面的集合应使用最常见的循环而不是foreach循环穿越它。建议用户。JDKAPI对RandomAccess接口的解释是:实现RandomAccess接口用于表示其对快速和随机访问的支持。该界面的主要目的是允许一般算法更改其行为,以便将其应用于随机或连续访问列表时可以提供良好或连续的访问列表。Performance.Performance.SACTUAL经验表明,实现了RandomAccess界面的实例。如果随机访问它,则使用普通的循环效率将高于使用foreach循环的使用;反过来,如果按顺序访问它,它将更有效。您可以使用以下代码来判断:

  循环的基本实现的原理是迭代器迭代器。因此,句子的后半部分“依次访问,使用迭代器将更有效”。这意味着访问顺序访问的那些类实例被用来与foreach周期一起穿越。

  20.使用同步代码块替换同步方法。这在多线模块中的同步锁定方法块的文章块中清楚地描述了这一点。除非您可以确定整个方法需要同步,否则请尝试尽可能多地使用同步代码块,并尝试使用同步代码块。

  21.将常数声明为静态决赛,并用大写的名称命名。在编译期间,您可以将这些内容放入常数池中,以避免计算操作时计算常数的值。加上,常数名称的名称也可以命名为大写。

  22.不要创建一些未使用的对象,不要导入一些未使用的类。这是毫无意义的。如果代码出现“不使用本地变量的值”,则永远不会使用import java.util”,请删除这些无用的内容。

  23.避免在程序运行期间进行反射,请参阅反射。反射是Java向用户提供的非常强大的功能。强大的功能通常意味着效率不高。不建议在程序运行过程中经常使用反射机制,尤其是方法的方法。如果确实有必要,则推荐的方法是用对象实例化反射,并将内存用户放入只有在仅关心末端并交互时才能获得最快的响应速度。

  24.数据库连接池和线程池的两个池用于重复使用对象。前者可以避免频繁打开和关闭连接,后者可以避免频繁的创建和破坏线程。

  25.使用带有缓冲区的输入输出流执行IO操作频段缓冲区的输入输出流,也就是说,BufferedReader,BufferedWriter,BufferedInputStream和BuffredOutStream可以极大地提高IO效率。

  26.为了插入和访问更多方案,使用arraylist,并使用该元素在中间删除和插入很多。使用linkedlist。要了解Arraylist和LinkedList的原理,方法是提供给外界的方法。如果您提供这些方法过多,则有两个主要缺点:

  至于有多少“太多”是指3或4。有10个学生信息字段可以插入学生表中。您可以将这10个参数封装在物理类中,作为插入()方法的参数。

  28.字符串变量和字符串常规量的恒定字符串写在字符串常数的前面。这是一个相对常见的提示。如果有以下代码:

  建议修改它:

  这主要是为了避免空指针异常。

  29.请知道IF(i == 1)和if(1 == i)在Java中没有区别1)和andif(1 == i)是否有区别,必须从C/C ++开始。在C/C ++中,IF(i == 1)的判断条件基于0和0non -0作为基准。

  c/c ++判断i == 1尚未建立,因此由0表示,即false。但是,如果:

  如果程序员不小心,请写(i == 1),就好像(i = 1),以便存在问题。不是0,回报是正确的,但是显而易见的I是2,比较值为1,应该返回错误。这种情况可能发生在C/C ++的开发中,并导致难以理解的困难错误。因此,为了避免IF语句中开发人员的不正确分配操作,建议编写IF语句:

  这样,即使开发人员意外地写入1 = i,C/C ++编译器可以尽快检查,因为我们可以将变量值i分配给1,但是我们不能为i分配一个常数值1。

  但是,在Java中,无法出现C/C ++的语法,因为一旦编写了此语法,Java将编译并报告一个错误“类型不匹配:不能从Int转换为Boolean”。i == 1),如果(1 == i)在语义上没有不同,则建议在阅读习惯方面更好地使用前者。

  30.请勿将ToString()方法使用到数组中,以查看使用ToString()打印的数组:

  结果发现:

  最初的意图是打印出数组内容,但可能是由空气指针异常引起的,因为数组引用是空的。,因为收集的父类ApportsCollections重写了对象的ToString()方法。

  31.不要强迫基本数据类型的转换超出基本数据范围。这将永远不会得到理想的结果:

  我们可能期望得到其中的一些,但结果是:

  解释。在Java中长度为8个字节,因此12345678901234表示在计算机中应该是:

  INT数据在4个字节中为32位。低位置的二进制数据的前32位是:

  该二进制字符串代表(int i = 0,int length = list.size(); i <langth; i ++){...} 8的小数在此示例中,您仍然可以得出两个结论:

  32.如果集合类是公共的,则必须及时删除不公开集类别的数据(即方法中的属性),那么该集合中的元素将不会自动发布,因为总有总是有总有总是有总是有总是有一个总有存在的地方,总有总是有总有总是有一个总有存在的地方。总是总是有那里。内存泄漏。

  33.将基本数据类型转换为字符串。方法,我有一个整数类型数据I,您可以使用三种方法:i.tostring(),string.valueof(i),i+”和i+“ i+”。

  运行结果:

  因此,当您将来遇到一个基本数据类型时,您将优先使用ToString()方法。

  这三个的比较显然是最快的,一次是最慢的。

  34.有很多方法可以以最有效的方式遍历地图。通常,我们在场景中需要的是遍历地图中的密钥和值。然后,推荐,最有效的方法是:

  如果您只想穿越此地图的键值,请使用set keyset = map.keyset();它会更合适

  35.对于资源的关闭(),建议单独运行。例如,我有这样的代码:

  建议修改它:

  尽管有些麻烦,但它可以避免资源的泄漏。我认为,如果尚未修改的代码(如果xxx.close()为异常,则它已输入捕获块,yyy.close()将不会执行,YYY的资源将不会被回收,不会被回收。

  作者:亨利

  资料来源:henleylee.github.io/posts/2019/a780fcc1.html