性能优化- 字符串,数组,集合

尽量使用StringBuilder和StringBuffer进行字符串连接

StringBuffer,StringBuilder 的区别

StringBuffer,StringBuilder 的区别在于:java.lang.StringBuffer 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。StringBuilder 与该类相比,通常应该优先使用 StringBuilder 类,因为她支持所有相同的操作,但由于她不执行同步,所以速度更快。为了获得更好的性能,在构造 StringBuffer 或 StringBuilder 时应尽量指定她的容量。当然如果不超过 16 个字符时就不用了。 相同情况下,使用 StringBuilder 比使用 StringBuffer 仅能获得 10%~15%的性能提升,但却要冒多线程不安全的风险。综合考虑还是建议使用 StringBuffer。


通过 StringBuffer 的构造函数来设定他的初始化容量,可以明显提升性能。

StringBuffer 的默认容量为 16,当 StringBuffer 的容量达到最大容量时,她会将自身容量增加到当前的 2 倍+2,也就是 2*n+2。无论何时,只要 StringBuffer 到达她的最大容量,她就不得不创建一个新的对象数组,然后复制旧的对象数组,这会浪费很多时间。所以给StringBuffer 设置一个合理的初始化容量值,是很有必要的!



尽量确定StringBuffer的容量

StringBuffer 的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再 丢弃旧的数组。在大多数情况下,你可以在创建 StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。

如:StringBuffer buffer = new StringBuffer(1000);


对于常量字符串,用‘string‘ 代替 ‘stringbuffer‘

常量字符串并不需要动态改变长度。


尽量避免使用二维数组

二维数据占用的内存空间比一维数组多得多,大概10倍以上。



在使用集合的时候,优先选择SparseArray,尽量用Android提供的SparseArray来代替HashMap


使用实体类比接口好

假设你有一个HashMap对象,你可以将它声明为HashMap或者Map:

Map map1 = new HashMap();
HashMap map2 = new HashMap();

哪个更好呢?

按照传统的观点Map会更好些,因为这样你可以改变他的具体实现类,只要这个类继承自Map接口。传统的观点对于传统的程序是正确的,但是它并不适合嵌入式系统。

调 用一个接口的引用会比调用实体类的引用多花费一倍的时间。如果HashMap完全适合你的程序,那么使用Map就没有什么价值。如果有些地方你不能确定, 先避免使用Map,剩下的交给IDE提供的重构功能好了。(当然公共API是一个例外:一个好的API常常会牺牲一些性能)



ArrayList & LinkedList

一 个是线性表,一个是链表,
一句话,随机查询尽量使用ArrayList,ArrayList优于LinkedListLinkedList还要移动指 针

添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据,不过这是理论性分析,事实未必如此,重要的是理解好2 者得数据结构,对症下药。


单线程应尽量使用HashMap、ArrayList

HashTable、Vector等使用了同步机制,降低了性能。


尽量合理的创建HashMap

当你要创建一个比较大的hashMap时,充分利用另一个构造函数

public HashMap(int initialCapacity, float loadFactor)

避 免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而 loadFactor是 0.75,需要多大的容量,你最好能准确的估计你所需要的最佳大小,同样的Hashtable,Vectors也是一样的道理。



避免使用枚举

枚举变量非常方便,但不幸的是它会牺牲执行的速度和并大幅增加文件体积。例如:

public class Foo {
       public enum Shrubbery { GROUND, CRAWLING, HANGING }
}

会产生一个900字节的.class文件(FooShubbery.class)。在它被首次调用时,这个类会调用初始化方法来准备每个枚举变量。每个枚举项都会被声明成一个静态变量,并被赋值。然后将这些静态变量放在一个名为”VALUES”的静态数组变量中。而这么一大堆代码,仅仅是为了使用三个 整数。

这样:Shrubbery shrub =Shrubbery.GROUND;会引起一个对静态变量的引用,如果这个静态变量是final int,那么编译器会直接内联这个常数。

一方面说,使用枚举变量可以让你的API更出色,并能提供编译时的检查。所以在通常的时候你毫无疑问应该为公共API选择枚举变量。但是当性能方面有所限制的时候,你就应该避免这种做法了。

有些情况下,使用ordinal()方法获取枚举变量的整数值会更好一些,举例来说:

for(int n =0; n < list.size(); n++) {
       if(list.items[n].e == MyEnum.VAL_X) {
              // do something
       } else if(list.items[n].e == MyEnum.VAL_Y) {
              // do something
       }
}

替换为:

int valX = MyEnum.VAL_X.ordinal();
int valY = MyEnum.VAL_Y.ordinal();
int count = list.size();
MyItem items = list.items();
for(int n =0; n < count; n++) {
       intvalItem = items[n].e.ordinal();
       if(valItem == valX) {
              // do something
       } else if(valItem == valY) {
              // do something
       }
}

会使性能得到一些改善,但这并不是最终的解决之道。

时间: 2024-10-10 01:52:16

性能优化- 字符串,数组,集合的相关文章

json和字符串/数组/集合的互相转换の神操作总结

一:前端字符串转JSON的4种方式 1,eval方式解析,恐怕这是最早的解析方式了. function strToJson(str){ var json = eval('(' + str + ')'); return json; } 2,new Function形式,比较怪异哦. function strToJson(str){ var json = (new Function("return " + str))(); return json; } IE6/7中当字符串中含有换行(\n

js高效性能优化--字符串优化

1.对于js中的字符串连接,很多误区的用法就是用“+”来连接字符串,但是这种效率极其低下,因为每次连接两个字符串的时候,后台都要创建一个中间字符串(比如“”)来作为两者的中介将其连接,且连接后后台还要花费时间去释放中间变量,造成了效率底下. 最好的解决方法:就是用join(“a”)方法-------作用将数组里的所有元素以a为分隔符连接成新的字符串 2.js中没有去处头尾空白符的函数trim(),这里利用replace()函数自定义一个trim()函数,高效且有用

Swift 数组、字符串、集合与字典详解

今天我们来看几个最基本的数据结构:数组,字符串,集合和字典. 数组 数组是最基本的数据结构.Swift编程语言中改变了以前Objective-C时代NSMutableArray和NSArray分开的做法,统一到了Array唯一的数据结构.下面是最基本的一些实现. 1 2 3 4 5 6 7 8 9 10 11 // 声明一个不可修改的数组 let nums = [1, 2, 3] let nums = [Int](count: 5, repeatedValue: 0) // 声明一个可以修改的数

java性能优化之字符串

Java程序性能优化之代码优化 字符串部分: 关于这一部分我们需要了解String StringBuffer StringBulider String是一个不可变字符序列,针对常量池优化,类是final的 String的不变性是指字符串对象一旦创建便不可改变. 常量池的优化是指若两个字符串拥有相同的字符串序列,则在常量池只有一份拷贝. String类是final的则意味着不能对String类进行继承或者修改 String实际上是由三部分组成char数组和偏移量以及字符串长度组成 实际上字符sub

java性能优化之集合

Java程序性能优化之集合 集合 关于结合用的较多的List Map Set等常用数据结构 我们先来来看下List接口相关的类 有ArrayList Vector LinkedList 他们都实现了List接口并扩展自AbstractList ArrayList 和Vector 内部均由数组实现 而LinkedList则是用双向链表实现,所以说如果对数据的查询操作比较频繁则使用ArrayList 如果对数据的删除插入操作比较频繁,则使用LinKedList.至于Vector 是一种线程安全的集合

Java性能优化之String字符串优化

字符串是软件开发中最重要的对象之一.通常,字符串对象在内存中是占据了最大的空间块,因此如何高效地处理字符串,必将是提高整体性能的关键所在. 1.字符串对象及其特点 Java中八大基本数据类型没有String类型,因为String类型是Java对char数组的进一步封装. String类的实现主要由三部分组成:char数组,offset偏移量,String的长度. String类型有三个基本特点: 不变性 不变性是指String对象一旦生成,则不能再对它进行改变. 不变性的作用在于当一个对象需要被

java常用的数组、字符串、集合操作以及数据结构与算法基本知识

java中常用封装的数组 .字符串. 集合来操作对象,但数据结构中常用的有栈和队列   数与图以及他们之间的排序,查找. 数组声明没有分配内存空间  只有创建或者是初始化时才分配,创建时把数组中的数据类型数据所在的内存空间首地址赋值给数组名,在创建每个对象时,都会给该对象分配地址和它存储的数据 .如变量    int arr[]; int arr[]={1,2,3};  arr=new int[10] ,int arr[][]={{1,9,7},{1,2,3}}  int arr[][]=new

字符串集合或字符串数组转换成json数组

字符串可以是List<String>类型的字符串集合,也可以是String[]类型的字符串数组,二者转换成JSON数组的方式没有什么不同.下面代码注意关键的部分即可(画红线部分). 1. List<String>类型的字符串集合转换成JSON数组,如下所示: List<String> shotLst = ecsDao.selectShotInstanceData4Ali(requestShotMap); JSONArray shotrray = JSONArray.fr

Mysql性能优化:如何给字符串加索引?

原文:Mysql性能优化:如何给字符串加索引? 导读 现代大部分的登录系统都支持邮箱.手机号码登录两种方式,那么如何在邮箱或者手机号码这个字符串上建立索引才能保证性能最佳呢? 今天这篇文章就来探讨一下在Mysql中如何给一个字符串加索引才能达到性能最佳. 本文首发于作者的微信公众号[码猿技术专栏],原创不易,喜欢的朋友支持一下,谢谢!!! 陈某将会从什么是前缀索引.前缀索引和普通索引的比较.如何建丽最佳性能的前缀索引.前缀索引对覆盖索引的影响这几段来讲. 前缀索引 顾名思义,对于列值较长,比如B