目前好像写不出比较高质量的随笔,除了多看看别人写的,就是多写,做好自己可以做的

最近听的和看到的最多的一个词就是“勿忘初心”。的确不少人到了一定高度之后,就不知道该怎么做了。(包括我曾经的偶像娜姐,在得到法网冠军之后,有很长一段时间都迷失了)

自己总结一下:人生到了某个层次或高度的时候,应该记得是什么原因让自己可以走到这个高度,而不是觉得自己应该做些什么去适应这个高度。

当然,每个阶段都有每个阶段该做的和能做的事,这里说的是要保持住让自己前进的好品质。

在项目初期出现的问题:

在Java中,List是一个接口,LinkedList继承了抽象类AbstractSequentialList实现了List接口(其中AbstractSequentialList类继承 AbstractList类)

ArrayList、Vector继承AbstractList类,实现了List接口。

AbstractList实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,AbstractList是List接口的最小实现。

(也有人说AbstractList是多余的参考Why does LinkedHashSet<E> extend HashSet<e> and implement Set<E>

扯远了,项目中有地方用到了LinkedList的时候出错。

一、将List赋值给另一个List

         LinkedList<Integer> getData=new LinkedList<Integer>();
LinkedList<Integer> saveData;
//错误一:saveData对象引用getData对象(类似于指针指向A),并不是将getData对象传递给savaData
saveData=getData;
//错误二:浅克隆,依然是同一个对象
saveData=(LinkedList<Integer>) getData.clone(); //正确一
LinkedList<Integer> saveData=new LinkedList<Integer>(getData);
//正确二
LinkedList<Integer> saveData=new LinkedList<Integer> ();
saveData.addAll(getData);
//正确三
for(Integer s:getData)
saveData.add(s);

二、实现在一个List中多线程操作(添加和删除)

由于LinkedList是线程不同步的,所以我选择的办法是给他的添加、删除等操作的模块加锁

关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁,哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,其他线程都只能呈等待状态。但是这有个前提:既然锁叫做对象锁,那么势必和对象相关,所以多个线程访问的必须是同一个对象

//代码块一,将含有添加元素的语句放入锁中
synchronized (test.myApp.getFlag()) {//myApp是一个继承Application类的类,getFlag()得到其中定义的一个String对象(字符串常量)
if (Assets2.start == 1) {
float[] i = {event.getAccelerationX(), event.getAccelerationY(), event.getAccelerationZ()};
test.myApp.getAsensorData().addLast(i);
} else test.myApp.getAsensorData().clear();
}
//代码块二,给含删除List中元素的代码块加锁,注意锁与代码块一相同
synchronized (test.myApp.getFlag()) {
if (!test.myApp.getAsensorData().isEmpty() && (!test.myApp.getGsensorData().isEmpty())) {
test.myApp.getAsensorData().removeFirst();
// test.myApp.getGsensorData().removeFirst();
}
}

其中test.myApp.getFlag()只用是一个对象即可,如果是在Java中非安卓中使用:String flag="110";用flag代替test.myApp.getFlag()即可。

test.myApp.getAsensorData()是获取定义为全局变量的LinkedList,在Java中:LinkedList<float[]> asensorData=new LinkedList<>();后用asensorData代替test.myApp.getAsensorData()。

知识补充:vector、LinkedList、ArrayList区别

1.Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。

2.Vector的方法加了synchronized, 而ArrayList、LinkedList则没有。Vector属于线程安全的(也称线程同步)。

3.LinkedList适合指定位置插入、删除操作,不适合查找。()Vector、ArrayList适合查找,不适合指定位置插入、删除。

4.ArrayList在内存不够时默认是扩展50% + 1个。(例如:原始大小是 10 ,扩容后的大小就是 10 + 5+1 = 16);Vector是当增长因子>0,默认扩展增加一个增长因子,否则默认扩展1倍(当扩容因子大于0时,新数组长度为原数组长度+扩容因子,否子新数组长度为原数组长度的2倍。)。linkedList 是一个双向链表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好。

添加:HashMap扩容(初始化大小是 16 ,扩容因子默认0.75(可以指定初始化大小,和扩容因子)),当前大小 和 当前容量 的比例超过了 扩容因子,就会扩容,扩容后大小为 一倍。

例如:初始大小为 16 ,扩容因子 0.75 ,当容量为12的时候,比例已经是0.75 。触发扩容,扩容后的大小为 32。

写一篇随笔挺花时间的,有时候写到一半,忘记,下次再打开居然没存,就gg了~希望以后会更熟练吧,希望能锻炼自己的梳理能力,也能温习以前遇到的东西。

List、LinkedList、ArrayList、Vector的更多相关文章

  1. Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别

    ArrayList和Vector的区别ArrayList与Vector主要从二方面来说.  一.同步性:   Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...

  2. 16、Collection接口及其子接口Set和List(常用类LinkedList,ArrayList,Vector和Stack)

    16.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同 ...

  3. Queue 与List、LinkedList与 ArrayList 区别

    List 是一个接口,不能实例化,通过实例化ArrayList 或者LinkedList来调用:List list = new ArrayList(); |--List: 元素是有序的(怎么存的就怎么 ...

  4. linkedlist,arraylist,vector的特点

    LinkedList  基于双向链表实现的列表,Node结构是它的内部类: Linkedlist <E> extends AbstractSequentialList<E> p ...

  5. ArrayList、LinkedList、Vector的区别

    Arraylist和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以插入数据慢,查找有下标, ...

  6. Java ArrayList、Vector和LinkedList等的差别与用法(转)

    Java ArrayList.Vector和LinkedList等的差别与用法(转) ArrayList 和Vector是采取数组体式格式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都 ...

  7. HashMap、HashTable、ArrayList、LinkedList、Vector区别

    HashTable和HashMap区别 ①继承不同. public class Hashtable extends Dictionary implements Map public class Has ...

  8. Java进阶(四十六)简述ArrayList、Vector与LinkedList的异同点

    简述ArrayList.Vector与LinkedList的异同点   Collection类的继承图如下:   从图中可以看出,LinkedList与ArrayList.ArrayDeque这三者都 ...

  9. 数组Array和列表集合ArrayList、LinkedList和Vector的区别

    一.ArrayList和Vector的区别 ArrayList与Vector主要从以下方面来说. 1.同步性: Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同 ...

  10. 一道关于:ArrayList、Vector、LinkedList的存储性能和特性 的面试题

    ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢 ...

随机推荐

  1. perf4j 监控请求 + traceId区分日志

    1. 场景 从request进入Controller到出去的时间, 可以统计接口访问的一些数据,如:平均处理时间.最大处理时间 2. 代码 2.1 mvc-servlet 定义切面和拦截器 <? ...

  2. svg拖拽和缩放

    需求:做机房平面图,用svg实现拖拽和缩放,刚开始一头雾水,不知所措,好在皇天不负有心人........ 本文重点介绍拖拽,单纯实现很简单,但是由于vue项目,机房图有很多事件,拖拽就成了难点 简单介 ...

  3. 如何让div覆盖canvas元素

    第一步 请让该div和canvas同样处于同一画布,都用position:absolute; 然后设置canvas的z-index="-1",是的,你没看错 然后把要覆盖canva ...

  4. tcp三次握手和四次挥手(2)

      背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进 ...

  5. centos7主机名的修改

    在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵活的(pretty).“静态”主机名也称为内核主机名,是系统在启动时从/etc/hostname自动初始 ...

  6. sudo:*:command not found

    原因:执行sudo后,sudo会根据visudo里面配置的secure_path来找寻命令,所以sudo尽量使用绝对路径 sudo bash-c "echo $PATH"也可以看到 ...

  7. 解决yii2.0里url重写引用js路径问题(@web/的用法)

    在实际项目中,为了seo优化,使用了伪静态,开启了url重写

  8. 如何退出virtualbox scale mode

    进入scale mode之后,可能会退不出来 HOST Key + C. 默认是 右Ctrl + C

  9. 【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.2.运行期优化。这章提到的具体的优化技术,应该对以后做性能工作会有帮助。

    1.概述 Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code). 为了提高 ...

  10. June 22nd 2017 Week 25th Thursday

    Happiness is when the desolated soul meets love. 幸福是孤寂的灵魂遭遇爱的邂逅. When living alone for a long period ...