看了几天Python,感觉记忆力不行了,很多东西记不住了。但是终归是得到了一点知识:重写一个ArrayList,允许从负值的索引得到指定的项。然后写一个得到斐波拉契数组的方法,这种方法要比递归调用的方式好很多,性能上大概提升几百倍。

关于Java的递归调用的性能:

  Java中的每一个方法调用都会把这个调用的方法加入到调用栈,等到一个方法执行完毕返回的时候(return,如果没有显式写return语句,实际上还是有的 - 方法内还有一个指针,用来执向当前执行的代码位置),才把方法从栈中弹出来,

而在Java中,这个栈的维护会很费性能,而且递归调用还有个5000次的约束。所以,在Java中尽量不要使用递归调用。

  如果在Android中还可以使用SoarseIntArray来代替ArrayList,那样性能更好些,避免了大量创建BigInteger对象的,性能还能再提升N倍,N>100
        SparseIntArray sia = new SparseIntArray();

现在看下这个实现吧:

  1 package com.xinye.test;

 import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List; /**
* 斐波那契数列的各种实现方式
* F0 = 0
* F1 = 1
* Fn = Fn-2 + Fn-1
*
*
* @author xinye
*
*/
public class Test {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
XYArrayList<BigInteger> list = getFiboArray(1, 1, 50);
for(BigInteger b : list){
System.out.println(b.toString());
}
System.out.println("计算" + list.size() + "项花费的时间是:" + (System.currentTimeMillis() - startTime) + "毫秒");
}
/**
* 得到斐波那契数组
* @param first 数组第一项
* @param second 数组第一项
* @param index 要得到的最大项,从2开始
* @return
*/
public static XYArrayList<BigInteger> getFiboArray(int first,int second,int index){
XYArrayList<BigInteger> feiboArray = new XYArrayList<BigInteger>();
if(index <= 0){
return feiboArray;
}
BigInteger bi01 = BigInteger.valueOf(first);
feiboArray.add(bi01);
if(index == 1){
return feiboArray;
}
BigInteger bi02 = BigInteger.valueOf(second);
feiboArray.add(bi02);
if(index == 2){
return feiboArray;
}
for(int i = 2;i < index;i++){
feiboArray.add(feiboArray.get(-1).add(feiboArray.get(-2)));
}
return feiboArray;
}
}
/**
* 一个采用了负值索引的ArrayList
* 最后一项索引-1,倒数第二项-2,倒数第三项-3
* 也可以正向取值:0,1,2,3,4,5
*
* @author xinye
*
* @param <E>
*/
class XYArrayList <E> extends ArrayList<E>{ /**
*
*/
private static final long serialVersionUID = -1319739564479533206L; public E get(int index){ if(index < 0){
index = index + size();
}
return super.get(index);
}
public E set(int index,E element){
if(index < 0){
index = index + size();
}
return super.set(index, element);
}
public void add(int index, E element) {
if(index < 0){
index = index + size();
}
super.add(index, element);
} public boolean addAll(int index, Collection<? extends E> c) {
if(index < 0){
index = index + size();
}
return super.addAll(index, c);
}
public E remove(int index) {
if(index < 0){
index = index + size();
}
return super.remove(index);
}
/**
* 删除指定范围内的对象
* 无论从正向取值还是负向取值,fromIndex总要比toIndex先出现
*/
public void removeRange(int fromIndex, int toIndex) {
if(fromIndex < 0){
fromIndex = fromIndex + size();
}
if(toIndex < 0){
toIndex = toIndex + size();
}
super.removeRange(fromIndex, toIndex);
}
/**
* 得到从fromIndex到toIndex的List的子集
* 无论从正向取值还是负向取值,fromIndex总要比toIndex先出现
*/
public List<E> subList(int fromIndex, int toIndex) {
if(fromIndex < 0){
fromIndex = fromIndex + size();
}
if(toIndex < 0){
toIndex = toIndex + size();
}
return super.subList(fromIndex, toIndex);
}
}

So Easy.

做个笔记,忘了的时候再来看看!

从Python学习中得到的一点启发 - Java逆向索引ArrayList的更多相关文章

  1. 记录Python学习中的几个小问题

    记录Python学习中的几个小问题,和C#\JAVA的习惯都不太一样. 1.Django模板中比较两个值是否相等 错误的做法 <option value="{{group.id}}&q ...

  2. 【PyTorch教程】P3. Python学习中的两大法宝函数(当然也可以用在PyTorch)

    温馨提示:为了更好的教程体验,提供视频.阅读地址 Youtube: https://www.youtube.com/playlist?list=PLgAyVnrNJ96CqYdjZ8v9YjQvCBc ...

  3. python学习中遇到的错误及解决办法

    1. nodename nor servname provided 原因:Python程序中有段程序调用 socket.gethostbyname(socket.gethostname()) sock ...

  4. python学习中

    python中的单引号.双引号.三引号的用法 网上也查找了资料,理解的都有些费劲 就自己验证了一下(主要是目前掌握的python知识,不知道什么时候会同时用到这三种引号) 用python3验证的 单引 ...

  5. Python学习中的“按位取反”笔记总结

    | 疑惑 最近在学习Python的过程中了解到位运算符,但对于按位取反有点迷糊,就比如说~9(按位取反)之后的结果是-10,为什么不是6呢?所以下面就来看看为什么不是6,正确结果是如何计算出来的呢? ...

  6. python 学习中遇到的问题

    一.安装pip中遇到的问题. 出现错误:ImportError:DLL load failed :%1不是有效的win32应用程序 出现问题解答: 主要是由于安装的python版本和所下载的安装包版本 ...

  7. python学习中,list/tuple/dict格式化遇到的问题

    昨天上了python培训的第一课,学习了基础知识.包括类型和赋值,函数type(),dir(),id(),help()的使用,list/tuple/dict的定义以及内置函数的操作,函数的定义,控制语 ...

  8. 我在Python学习中遇到的问题一

    开发工具:PyCharm 系统:macOs Serria 10.12.4 jetbrains出品,作为和idea一个公司的兄弟产品,延续了idea的易用性,并且操作按钮也基本一致 一. 执行环境问题 ...

  9. python学习中的bug

    1.在pycharm的terminal中的python工程目录下update pip失败,但是在cmd中为什么就可以.’

随机推荐

  1. Excel数据批量导入到SqlServer的方法

    1,以Excel为数据源建立连接导入. 关键点在于Excel的数据要有表头,表头要和数据库表的列名一样.连接字符串中HDR=YES不能省略,也就是第一行是表头的意思.IMEX=1;是把数据都当作字符串 ...

  2. openvpn之EasyRSA配置篇

    cd EasyRSA-2.2.2 vi vars #红色加粗的表示是我们需要修改的,其它的保持默认就可以 export EASY_RSA="`pwd`" export OPENSS ...

  3. 【oneday_onepage】——Microsoft adds a wing, more closets to the homes of SharePoint Online tenants

    To prevent SharePoint Online customers from feeling boxed in, Microsoft wants to improve the way the ...

  4. filter和map的区别

    filter和map初一看很像 都是filter(func,iterable) map(func,iterable) 实际情况是filter函数:filter()为已知的序列的每个元素调用给定的布尔函 ...

  5. php curl批处理--可控并发异步

    通常情况下 PHP 中的 cURL 是阻塞运行的,就是说创建一个 cURL 请求以后必须等它执行成功或者超时才会执行下一个请求:API接口访问一般会首选CURL 在实际项目或者自己编写小工具(比如新闻 ...

  6. Java BEAN与EJB的区别

    Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean.但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以 ...

  7. React Native安卓项目打包发布APK步骤

    1.产生签名的key 该过程会用到keytool,开发过安卓的都应该接触过该东西.详细请见密钥和证书管理工具.在项目的主目录(不是android文件夹)中执行: --生成签名key,注意记下你的密钥和 ...

  8. Android studio 3+版本apk安装失败问题

    studio2.3升级到3.1之后将apk发给别人下载到手机上安装,华为提示安装包无效或与操作系统不兼容,魅族提示apk仅为测试版,要求下载正式版安装. 在网上找了一下,发现是studio3.0之后的 ...

  9. Javascript导航菜单13则

    来源:http://www.noupe.com/ajax/13-awesome-java-script-css-menu.html翻译:http://parandroid.com下面为你准备了13个利 ...

  10. linux文件经 windows系统 之后出现 权限缺失 的解决方法

    把Linux下的文件拷贝到windows,再拷贝到Linux时,文件的权限丢失. 解决办法: 把文件压缩后,将压缩文件拷贝到windows系统上,再拷贝压缩文件到linux服务器,在目标linux服务 ...