看了几天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. CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解

    CAS (6) -- Nginx代理模式下浏览器访问CAS服务器网络顺序图详解 tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 nginx版本: nginx-1. ...

  2. hdfs平衡分布

    这篇文章是从网上看到的,觉得很好就收藏了,但是最终不知道出处了. Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,比如集群中添加新的数据节点.当HDFS出现不平衡状况的时候 ...

  3. OpenSceneGraph-3.2.0 源代码的编辑步骤

    到osg官网去下载源代码 官网 再把资源包下载下来叫作3dpart资源包. 源代码下载下来之后依照这个步骤来. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...

  4. @Resource、@Autowired跟default-autowire区别联系

    @Resource.@Autowired和default-autowire区别联系 今天看了一工程,里面既有default-autowire,又有@Autowired,还有@Resource.我就不明 ...

  5. Mac 创建证书(以 创建gdb证书 为例 )

    open /Applications/Utilities/Keychain\ Access.app/ 打开 钥匙串访问 继续继续 创建完毕. Now that we have a certificat ...

  6. Java如何显示不同格式的日期?

    在Java中,如何以不同的格式来显示日期? 此示例使用DateFormatSymbols().DateFormatSymbols类的getWeekdays()方法来显示时间的格式. package c ...

  7. WCF Service 配置文件注释(转)

    VS 2008 SP1(不确定是否不打SP1是否有)自带的一个编辑工具,可以更快的帮助定制配置文件, 以前看到过没有注意, 昨天正好一个同事提起, 这里记录一笔:打开VS 2008->Tools ...

  8. Python:数组、队列及堆栈的使用(list用法)--转

    Python编程中数组.队列及堆栈用于保存一组数据或对象的序列,元素可以是各种类型混合在一起,定义格式为[元素,元素,……,元素],用变量[位置]即可取出相应的元素,其中“位置”是从零开始计算. 数组 ...

  9. com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method

    查看了网友们的错误原因, 需要进行实例化的类没有进行实例化,具体没有实例化的类会在错误信息中显示,在错误信息中搜索“Serializable”即可找到将其实现序列化可消除错误. 是在使用Dubbo提供 ...

  10. 表单提交之List集合

    一.表单数据 <div class="panel panel-default"> <div class="panel-heading"> ...