Java性能优化方面的程序优化知识点归纳,希望对你有所帮助

常用的程序设计优化技巧:

1、字符串优化处理

(1)String 类的特点:不变性、针对常量池的优化( String.intern() 方法的意义)

(2)subString 方法的内存泄漏 :

(3)字符串分割和查找不要使用 split 函数,效率低,而是使用 StringTokenizer 或者 indexOf结合 subString() 函数完成分割。

(4)用 charAt ()方法代替 startWith ()方法。

(5)对于静态字符串或者变量字符串的连接操作, Java 在编译的时候会进行彻底的优化,将多个连接操作的字符串在编译时合成一个单独的字符串,而不是生成大量的 String 实例。只生成一个对象。

(6)在无需考虑线程安全情况下尽量使用 StringBuilder 。

(7)StringBuffer 和 StringBuilder 初始化的时候都可以设置一个初始值,默认是 16B 。如果字符串的长度大于 16B 的时候,则需要进行扩容。扩容策略是将原有的容量大小翻倍,以新的容量申请内存空间,建立 char 数组,然后将数组中的内容复制到这个新的数组中,使用 Arrays.copyOf() 函数。因此,如果能预先评估 StringBuilder 的大小,则可以节省这些复制操作,从而提高系统的性能。

2、List 接口

( 1 ) ArrayList 和 Vector 的区别:它们几乎使用了相同的算法,它们的唯一区别是对多线程的支持。 ArrayList 是不安全的,而 Vector 是线程安全的。

( 2 ) LinkedList 和 ArrayList 的区别:

|---1 、 linkedList 采用链表实现,适合于数据删除和插入非常频繁的情况,不适合随机访问。

|---2 、 ArrayList 采用数组实现,适用于随机查找和顺序读的情况,不适合删除和插 入数据非常频繁的场景。

(3)基于数组的 List 都会有一个容量参数。当 ArrayList 所存储的元素容量超过其已有大小的时候就会进行扩容,数组的扩容会导致整个数组进行一次内存复制。因此合理的数组大小会减小数组扩容的次数从而提高系统性能。

(4)遍历列表的时候尽量使用迭代器,速度快。

2、Map 接口:

(1)HashMap 的实现原理:简单的说, HashMap 就是将 key 做 hash 算法,然后将 hash 值映射到内存地址,直接取得 key 所对应的数据。在 HashMap 中,底层数据结构使用的是数组,所谓的内存地址指的是数组的下标索引。

(2)容量参数与扩容:默认情况下, hashmap 的初始容量为 16 ,负载因子为 0.75 ,也就是说当 hashmap 的实际容量达到了初始容量 * 负载因子( hashmap 内部维护的一个 threshold 值)的时候, hashmap 就会进行扩容。在扩容时,会遍历整个 hashmap ,因此应该设置合理的初始大小和负载因子,可以减小 hashmap 扩容的次数。

(3)LinkedHashMap-- 有序的 HashMap : HashMap 的最大缺点是其无序性,被存入到 Hashmap 中的元素,在遍历 HashMap 的时候,其输出不一定按照输入的顺序,而是 HashMap 会根据 hash 算法设定一个查找高效的顺序。如果希望保存输入顺序,则需要使用 LinkedHashMap 。LinkedHashmap 在内部又增加了一个链表,用于保存元素的顺序。

(4)LinkedList 可以提供两种类型的顺序:一个是元素插入时候的顺序,一个是最近访问的顺序。注意: LinkedHashMap 在迭代过程中,如果设置为按照最后访问时间进行排序,即:每当使用 get() 方法访问某个元素时,该元素便会移动到链表的尾端。但是这个时候会出现异常,因此, LinkedHashMap 工作在这种模式的时候,不能在迭代器中使用 get() 操作。

(5)关于 ConcurrentModificationException :该异常一般会在集合迭代过程中被修改时抛出。因此,不要在迭代器模式中修改集合的结构。这个特性适合于所有的集合类,包括 HashMap 、 Vector 、 ArrayList 等。

(6)TreeMap-- 如果要对元素进行排序,则使用 TreeMap 对 key 实现自定义排序,有两种方式:在 TreeMap 的构造函数中注入一个 Comparator 或者使用一个实现了 Comparable 的 key 。

(7)如果需要将排序功能加入 HashMap ,最好是使用 Treemap 而不是在应用程序自定义排序。

(8)HashMap 基于 Hash 表实现, TreeMap 基于红黑树实现。

3 、 Map 和 Set 的关系:

( 1 )所有 Set 的实现都只是对应的 Map 的一种封装,其内部维护一个 Map 对象。即: Set只是相应的 Map 的 Value 是一种特殊的表现形式的一种特例。

( 2 ) Set 主要有三种实现类: HashSet 、 LinkedHashSet 、 TreeSet 。其中 HashSet 是基于 Hash 的快速元素插入,元素之间无序。 LinkedHashSet 同时维护着元素插入顺序,遍历集合的时候,总是按照先进先出的顺序排序。 TreeSet 是基于红黑树的实现,有着高效的基于元素 Key 的排序算法。

4 、优化集合访问代码:

( 1 )、分离循环中被重复调用的代码:例如, for 循环中使用集合的 size() 函数,则不应该把这个函数的调用放到循环中,而是放到循环外边、

( 2 )、省略相同的操作:

5 、 RandomAccess 接口:通过 RandomAccess 可知道 List 是否支持随机快速访问。同时,如果应用程序需要通过索引下标对 List 做随机访问,尽量 buyaoshiyongLinkedList , ArrayList 或者 Vector 可以。

6 、 JavaNIO 的特性:

1 、为所有的原始类型提供 Buffer 支持。

2 、使用 Java.nio.charset.Charset 作为字符编码解码解决方案。

3 、增加通道抽象代替原有的 IO 流抽象。

4 、支持锁和内存映射文件的文件访问接口。

5 、提供基于 Selector 的异步网络 IO 。

7 、 Java 中 NIO 的使用。 Channel 是一个双向通道,即可读也可写。应用程序不能直接操作 Channel ,必须借助于 Buffer 。例如读数据的时候,必须把数据从通道读入到缓冲区,然后在缓冲区中进行读取。以文件读取为例,首先通过文件输入流获得文件通道,然后把文件通道的内容读入到缓冲区中,然后就可以对缓冲区操作。

8 、 Buffer 的基本原理:

1 、 Buffer 的创建: Buffer 的静态 allocate(int size) 方法或者 Buffer.wrap(byte[]src) 。

2 、 Buffer 的工作原理:三个变量: position ,代表当前缓冲区的位置,写缓冲区的时候,将从 position 的下一个位置写数据。 Capacity ,代表缓冲区的总容量上限。 Limit ,缓冲区的实际上限,也就是说,读数据的时候,数据即是从 position 到 limit 之间的数据

3 、 flip 操作: limit=position,position=0, 一般是在读写切换的时候使用。写完数据之后,需要限定下有效数据范围,才能读数据;

4 、 clear 操作: position-0 , limit=capacity. 。为重新写入缓冲区做准备。

5 、 rewind 操作: position=0 ,为读取缓冲区中有效数据做准备,一半 limit 已经被合理设置。

9 、读写缓冲区:

1 、 public byte get() :顺序读取缓冲区的一个字节, position 会加一

2 、 public Buffer get(byte[]dst): 将缓冲区中的数据读入到数组 dst 中,并适当的移动 position

3 、 public byte get(int index) :得到第 index 个字节,但不移动 posoiion

4 、 public ByteBuffer put(byte b) :将字节 b 放入到缓冲区中,并移动 position

5 、 public ByteBuffer put(int index,byte b) :将字节 b 放到缓冲区的 index 位位置

6 、 pubglic final ByteBuffer(byte[]src) :将字节数组 src 放到缓冲区中。

10 、标志缓冲区:类似于一个书签的功能,在数据的处理过程中,可随时记录当前位置。然后在任意时刻,回到这个位置。 Mark 用于记录当前位置, reset 用于恢复到 mark 所在的位置、

11 、复制缓冲区:使用 Buffer 的 duplicate 方法可以复制一个缓冲区,副本缓冲区和原缓冲区共享一份空间但是有有着独立的 position 、 capacity 和 limit 值。

20 、缓冲区分片:缓冲区分片使用 slice 方法实现。它将在现有的缓冲区中,创建的子缓冲区。子缓冲区和父缓冲区共享数据。这个方法有助于将系统模块化。缓冲区切片可以将一个大缓冲区进行分割处理,得到的子缓冲区都具有缓冲的缓冲区模型结构;因此。这个操作有助于系统的模块化。

12 、只读缓冲区:只读缓冲区可以保证核心数据的安全,如果不希望数据被随意篡改,返回一个只读缓冲区是很有帮助的。

13 、文件映射到内存: NIO 提供了一种将文件映射到内存的方法进行 IO 操作,这种方法比基于流 IO 快很多。这个操作主要由 FileChanne.map() 操作。使用文件内存的方式,将文本通过 FileChannel 映射到内存中。然后从内存中读取数据。同时,通过修改 Buffer, 将对内存中数据的修改写到对应的硬盘文件中。

14 、处理结构化数据:散射和聚集。散射就是将数据读入到一组 bytebuffer 中,而聚集正好相反。通过 ScatteringByteChannel 和 GatheringByteChannel 可以简化对结构数据的操作。

15 、直接内存访问: DirectBuffer 直接分配在物理内存中,并不占用对空间,因此也不受对空间限制。 DirectBuffer 的读写操作比普通 Buffer 块,因为 DirectBuffer 直接操纵的就是内核缓冲区。

16 、引用类型:强、软、若、虚四种引用类型。

WeakHashMap :是弱引用的一中典型应用,它使用弱引用作为内部数据的存储方案。可以作为简单的缓存表解决方案。

如果在系统中,需要一张很大的 Map 表, Map 中的表项作为缓存之用。这也意味着即使没能从该 Map 中取得相应地数据,系统也可以通过选项方案获取这些数据,虽然这样会消耗更多的时间,但是不影响系统的正常运行。这个时候,使用 WeakHashMap 是最合适的。因为 WeakHashMap 会在系统内存范围内,保存所有表项,而一旦内存不够,在 GC 时,没有被引用的又会很快被清除掉,避免系统内存溢出。

17 、有助于改善系统性能的技巧:

1 、慎用异常: for 循环中使用 try-catch 会大大降低系统性能

2 、使用局部变量:局部变量的访问速度远远高于类的静态变量的访问速度,因为类的 变量是存在在堆空间中的。

3 、位运算代替乘除法:右移代表除以二、左移代表乘以二。

4 、有的时候考虑是否可以使用数组代替位运算。

5 、一维数组代替二维数组。

6 、提取表达式:尽可能让程序少做重复的计算,尤其要关注在循环体的代码,从循环提中提取重复的代码可以有效的提升系统性能。

为了让学习变得轻松、高效,今天给大家免费分享一套Java入门教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要入门的资料欢迎加入学习交流群:9285,05736

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java工具栏的工具提示,动态菜单项、状态条提示、工具条提示问题

问题的提出:一个应用程序想要动态改变菜单项。使用CCmdUI::SetText("Menu Text")可以改变菜单文本,但是如何动态改变工具条和状态条的文本呢?有几种策略,避免,欺骗,面对......首先,避…

python excel操作库,可能是全网最完整的 Python 操作 Excel库总结!

openpyxlxlrd/xlwtxlwingsxlsxwriter了解各个库的异同,从而在不同场景下可以灵活使用首先让我们来整体把握下不同库的特点“xlrdxlwtxlutils.xlsxlwt.xlsxlrd.xlsxlutilsxlrdxlwt.xlsxlrdxlwtxlutilsxlwingsXlsxWriter.xlsxopenpyxl.xlsxpandas”如果你懒得看详细的…

Java编程中程序员会遇到的一些感性烦恼,你有遇到吗?

如果作为兴趣来学编程,什么人都适合。毕竟,现在小学生都开始学习编程了。如果要作为职业来说,你到底适合不适合确实是个问题。我教过的学员里面从初中生到博士生、甚至50多岁的企业高管都有,怀着不同的目的来学习JAVA。 我记得教过…

java开发中spring常用的工具类

内置的resouce类型 UrlResourceClassPathResourceFileSystemResourceServletContextResourceInputStreamResourceByteArrayResourceEncodedResource 也就是Resource加上encoding, 可以认为是有编码的资源VfsResource(在jboss里经常用到, 相应还有 工具类 VfsUtils)org.springf…

python波士顿房价是什么数据,Python数据分析 | 波士顿房价回归分析

分析目标:将波士顿房价的数据集进行描述性数据分析、预测性数据分析(主要用了回归分析),可用于预测房价。数据集介绍:卡内基梅隆大学收集,StatLib库,1978年,涵盖了麻省波士顿的506个不同郊区的房屋数据。一…

Java开发的Spring Boot的核心模块

Spring Boot 的核心模块 下面我们大概来了解一下 Spring Boot 的核心模块。 1、spring-boot 这是 Spring Boot 的主模块,也是支持其他模块的核心模块,主要包含以下几点: 提供了一个启动 Spring 应用的主类,并提供了一个相当方便…

java开发中对于程序员的几点建议,你们有想到吗?

建议一:只有真正喜欢才能写好程序 喜欢写程序,做程序员就是上天堂; 不喜欢写程序,做程序员就是下地狱; 程序员需要整天趴在电脑前,经常没日没夜的,非常辛苦,而且工作来不得半点虚…

Java面向对象和面向过程有什么区别?网友:傻傻分不清楚……

面向对象,Obeject Oriented,是一种编程术语。面向对象是当今软件开发方法的主流方法之一,他是把数据以及对数据的操作放在一起,作为一个相互依存的整体,就是我们所说的对象。对同类对象抽象出其共性,就是类…

Java 反射机制和动态代理是基于什么原理,了解过吗?

工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因: 1、“知其然不知其所以然”。 做了多年技术,开发了很多业务应用&#x…

成长为一名Java架构师需要掌握的技术有哪些呢?

Java架构师需要掌握的技术: 1、熟练使用各种框架,并知道它们实现的原理。 2、jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码; 3、池技术,什么对象池,连接池,线程池……Java反射技术&…

Java程序员遇到瓶颈后我们可以试着朝四个方向拓展?你们觉得呢?

现如今随着IT行业的火热,人们对于编程技术也是越来越关注重视,在从业后我们做Java开发难免会遇到一些瓶颈。在我看来解决这个问题一般有以下4种方向: 基于产品本身 要记住公司招人是解决问题的,基于现有问题出发,大家…

oracle 布尔盲注,Oracle基于延时的盲注总结

0x00 前言oracle注入中可以通过页面响应的状态,这里指的是响应时间,通过这种方式判断SQL是否被执行的方式,便是时间盲注;oracle的时间盲注通常使用DBMS_PIPE.RECEIVE_MESSAGE(),而另外一种便是decode()与高耗时SQL操作…

Java架构师除了必备的技术之外,这些技能也需必备?你们觉得呢?

成为Java架构师首先你必须是一名Java高级开发工程师,熟练使用各种框架,并且能知道他们其中的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池等等 Java构架师…

Java编程学习并不难,有坚持的动力与良好的心态尤为重要

时间过得很快,回想刚学习Java编程开发的懵懂无知,到现在可以做出简单的项目,可以明显的感觉到自己确实进步了。Java编程其实并不难学,难的是你能够一如既往的保持好的学习态度,并愿意努力的去背、去记、去做项目练习。…

Java编程开发中高效编码的7个技巧?你应该知道……

1. 使用 JDK 8 或更高版本 从 JDK 8 以及 更高版本开始,引进许多新功能将允许你编写更短、更具表现力的代码,包括 lambda 表达式、functional 接口、stream API等。你实际上不需要记住他们,因为 IDEA 将帮助你使用这些功能,这也是…

下载jdk一定要登录oracle么,如何下载oracle jdk|oracle jdk下载慢,要登录等等问题

/java/jdk/8u231-b11/5b13a193868b4bf28bcb45c792fce896/jdk-8u231-linux-x64.tar.gz注意替换--------------------------------------------附上一批网址,这些应该也够了http://ns1.iranns.ir 这个比较新https://mirrors.huaweicloud.com/java/http://enos.itcoll…

谈谈Java与大数据之间的关系你们都了解了清楚了吗?

Java是计算机编程语言界的王者,大数据是当下IT领域中最新潮的技术,Java和大数据都是当下十分受企业欢迎的IT技术,也是企业核心竞争力的重要组成部分,都说学大数据要先学Java,那么Java和大数据有什么关系呢?…

自学Java必看的知识点,猿们怎么看?

1.你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该了解UML,尤其是class、object、interaction以及statediagrams。 2. 你需要学习Java语言的基础知识以及它的核心类库(collections、serialization、streams、network…

谈一谈Java编程开发中虚拟机的内存区域划分?猿们怎么看?

java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,有的区域随虚拟机进程的启动而存在,有的区域则依赖线程而存在。包括以下几个运行时数据区域: 程序计数器(线程私有): 可以…

成为一名成功的程序员要做到以下10点?网友:是真的吗?

编程是一个没有极限的职业,所以要成为一名优秀的程序员,你必须超越现有已存在的极限。在程序员职业生涯的开始阶段,他们将面临许多挑战,面对困境,他们之中有一些人将会放弃,而只有少数人会坚持到底&#xf…