【Java】集合补充

常见基础集合汇总

数据结构:栈

数据结构分为:

(1)逻辑结构 :--》思想上的结构--》卧室,厨房,卫生间 ---》线性表(数组,链表),图,树,栈,队列

(2)物理结构 :--》真实结构--》钢筋混凝土+牛顿力学------》紧密结构(顺序结构),跳转结构(链式结构) 

栈:

特点:后进先出(LIFO - last in first out):

实际应用:

(1)内存分析:形参,局部变量放入栈中。放入的那个区域的数据结构就是按照栈来做的。

(堆:利用完全二叉树的结构来维护一组数据)

(2)网络浏览器多会将用户最近访问过的网址组织为一个栈。这样,用户每访问一个新页面,其地址就会被存放至栈顶;而用户每按下一次“后退”按钮,即可沿相反的次序访问此前刚访问过的页面。

(3)主流的文本编辑器也大都支持编辑操作的历史记录功能(ctrl + z:撤销,ctrl + y:恢复),用户的编辑操作被依次记录在一个栈中。一旦出现误操作,用户只需按下“撤销”按钮,即可取消最近一次操作并回到此前的编辑状态。

Stack

  1. package com.star.test01;
  2. import java.util.Stack;
  3. /**
  4.  * @author : Starshine
  5.  */
  6. public class Test {
  7.     //这是main方法,程序的入口
  8.     public static void main(String[] args) {
  9.         /*
  10.         Stack是Vector的子类,Vector里面两个重要的属性:
  11.         Object[] elementData;底层依然是一个数组
  12.         int elementCount;数组中的容量
  13.          */
  14.         Stack s = new Stack();
  15.         s.add("A");
  16.         s.add("B");
  17.         s.add("C");
  18.         s.add("D");
  19.         System.out.println(s);//[A, B, C, D]
  20.         System.out.println("栈是否为空:" + s.empty());
  21.         System.out.println("查看栈顶的数据,但是不移除:" + s.peek());
  22.         System.out.println(s);
  23.         System.out.println("查看栈顶的数据,并且不移除:" + s.pop());
  24.         System.out.println(s);
  25.         s.push("D");//和add方法执行的功能一样,就是返回值不同
  26.         System.out.println(s);
  27.     }
  28. }

同步类容器

比如ArrayList,HashMap,线程不安全,现在想把线程不安全的集合转换为线程安全的集合:

  1. public class Test01 {
  2.     //这是main方法,程序的入口
  3.     public static void main(String[] args) {
  4.         //ArrayList为案例:从线程不安全  转为线程安全:
  5.         List list = Collections.synchronizedList(new ArrayList());
  6.     }
  7. }

试试ArrayList的线程不安全:

  1. package com.star.test02;
  2. import java.util.ArrayList;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. /**
  6.  * @author : Starshine
  7.  */
  8. public class Demo {
  9.     //这是main方法,程序的入口
  10.     public static void main(String[] args) {
  11.         //创建一个ArrayList集合:
  12.         ArrayList list = new ArrayList();
  13.         //创建一个线程池:线程池定长100
  14.         ExecutorService es = Executors.newFixedThreadPool(100);
  15.         //并发向集合中添加10000个数据:
  16.         for (int i = 0; i < 10000; i++) {
  17.             //每个线程处理任务:run方法中的内容就是线程单元,任务,实际线程执行的部分
  18.             es.execute(new Runnable() {
  19.                 @Override
  20.                 public void run() {
  21.                     list.add("aaa");
  22.                 }
  23.             });
  24.         }
  25.         //关闭线程池:
  26.         es.shutdown();
  27.         //监控线程是否执行完毕:
  28.         while(true){
  29.             //线程都执行完以后返回true
  30.             if(es.isTerminated()){
  31.                 System.out.println("所有的子线程都执行完毕了!");
  32.                 //执行完毕以后看一下集合中元素的数量:
  33.                 System.out.println(list.size());
  34.                 if(list.size() == 10000){
  35.                     System.out.println("线程安全!");
  36.                 }else{
  37.                     System.out.println("线程不安全!");
  38.                 }
  39.                 //线程执行完以后,while循环可以停止:
  40.                 break;
  41.             }
  42.         }
  43.     }
  44. }

结果:

利用同步类容器解决:

  1. package com.star.test02;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. /**
  8. * @author : Starshine
  9. */
  10. public class Demo {
  11.     //这是main方法,程序的入口
  12.     public static void main(String[] args) {
  13.         //创建一个ArrayList集合:
  14.         ArrayList oldlist = new ArrayList();
  15.         List list = Collections.synchronizedList(oldlist);
  16.         //创建一个线程池:线程池定长100
  17.         ExecutorService es = Executors.newFixedThreadPool(100);
  18.         //并发向集合中添加10000个数据:
  19.         for (int i = 0; i < 10000; i++) {
  20.             //每个线程处理任务:run方法中的内容就是线程单元,任务,实际线程执行的部分
  21.             es.execute(new Runnable() {
  22.                 @Override
  23.                 public void run() {
  24.                     list.add("aaa");
  25.                 }
  26.             });
  27.         }
  28.         //关闭线程池:
  29.         es.shutdown();
  30.         //监控线程是否执行完毕:
  31.         while(true){
  32.             //线程都执行完以后返回true
  33.             if(es.isTerminated()){
  34.                 System.out.println("所有的子线程都执行完毕了!");
  35.                 //执行完毕以后看一下集合中元素的数量:
  36.                 System.out.println(list.size());
  37.                 if(list.size() == 10000){
  38.                     System.out.println("线程安全!");
  39.                 }else{
  40.                     System.out.println("线程不安全!");
  41.                 }
  42.                 //线程执行完以后,while循环可以停止:
  43.                 break;
  44.             }
  45.         }
  46.     }
  47. }

结果:

源码解析:

ConcurrentMap并发容器

JDK5.0之后提供了多种并发类容器可以替代同步类容器,提升性能、吞吐量

ConcurrentHashMap替代HashMap、HashTable

ConcurrentSkipListMap替代TreeMap 

简单原理:

并发情况下,验证提高性能:

ConcunrrentHashMap :

  1. public class Test {
  2.     //这是main方法,程序的入口
  3.     public static void main(String[] args) {
  4.         //选择一个容器:
  5.         ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<>();
  6.         
  7.         //创建10个线程:
  8.         for (int i = 0; i < 10; i++) {
  9.             new Thread(new Runnable() {
  10.                 @Override
  11.                 public void run() {
  12.                     long startTime = System.currentTimeMillis();
  13.                     for (int j = 0; j < 1000000; j++) {
  14.                         map.put("test" + j , j);
  15.                     }
  16.                     long endTime = System.currentTimeMillis();
  17.                     System.out.println("一共需要的时间:" + (endTime - startTime));
  18.                 }
  19.             }).start();
  20.         }
  21.     }
  22. }

结果:

Hashtable:

  1. package com.star.test03;
  2. import java.util.Hashtable;
  3. import java.util.concurrent.ConcurrentHashMap;
  4. /**
  5.  * @author : Starshine
  6.  */
  7. public class Test {
  8.     //这是main方法,程序的入口
  9.     public static void main(String[] args) {
  10.         //选择一个容器:
  11.         //ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<>();
  12.         Hashtable map = new Hashtable();
  13.         //创建10个线程:
  14.         for (int i = 0; i < 10; i++) {
  15.             new Thread(new Runnable() {
  16.                 @Override
  17.                 public void run() {
  18.                     long startTime = System.currentTimeMillis();
  19.                     for (int j = 0; j < 1000000; j++) {
  20.                         map.put("test" + j , j);
  21.                     }
  22.                     long endTime = System.currentTimeMillis();
  23.                     System.out.println("一共需要的时间:" + (endTime - startTime));
  24.                 }
  25.             }).start();
  26.         }
  27.     }
  28. }

结果:

HashMap:

  1. package com.star.test03;
  2. import java.util.HashMap;
  3. import java.util.Hashtable;
  4. import java.util.concurrent.ConcurrentHashMap;
  5. /**
  6.  * @author : Starshine
  7.  */
  8. public class Test {
  9.     //这是main方法,程序的入口
  10.     public static void main(String[] args) {
  11.         //选择一个容器:
  12.         //ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<>();
  13.         //Hashtable map = new Hashtable();
  14.         HashMap map = new HashMap();
  15.         //创建10个线程:
  16.         for (int i = 0; i < 10; i++) {
  17.             new Thread(new Runnable() {
  18.                 @Override
  19.                 public void run() {
  20.                     long startTime = System.currentTimeMillis();
  21.                     for (int j = 0; j < 1000000; j++) {
  22.                         map.put("test" + j , j);
  23.                     }
  24.                     long endTime = System.currentTimeMillis();
  25.                     System.out.println("一共需要的时间:" + (endTime - startTime));
  26.                 }
  27.             }).start();
  28.         }
  29.     }
  30. }

线程安全的HashMap:

  1. package com.star.test03;
  2. import java.util.Collections;
  3. import java.util.HashMap;
  4. import java.util.Hashtable;
  5. import java.util.Map;
  6. import java.util.concurrent.ConcurrentHashMap;
  7. /**
  8. * @author : Starshine
  9. */
  10. public class Test {
  11.     //这是main方法,程序的入口
  12.     public static void main(String[] args) {
  13.         //选择一个容器:
  14.         //ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<>();
  15.         //Hashtable map = new Hashtable();
  16.         HashMap oldmap = new HashMap();
  17.         Map map = Collections.synchronizedMap(oldmap);
  18.         //创建10个线程:
  19.         for (int i = 0; i < 10; i++) {
  20.             new Thread(new Runnable() {
  21.                 @Override
  22.                 public void run() {
  23.                     long startTime = System.currentTimeMillis();
  24.                     for (int j = 0; j < 1000000; j++) {
  25.                         map.put("test" + j , j);
  26.                     }
  27.                     long endTime = System.currentTimeMillis();
  28.                     System.out.println("一共需要的时间:" + (endTime - startTime));
  29.                 }
  30.             }).start();
  31.         }
  32.     }
  33. }

结果:

总结:

ConcurrentHashMap:性能高,线程安全

Hashtable: 线程安全,性能低

HashMap:线程不安全,性能高

线程安全的HashMap:线程安全,性能低

COW并发容器

【1】COW类并发容器,全称:Copy  On  Write容器,写时复制容器。(读写分离容器)     

【2】原理:

向容器中添加元素时,先将容器进行Copy复制出一个新容器,然后将元素添加到新容器中,再将原容器的引用指向新容器。

并发读的时候不需要锁定容器,因为原容器没有变化,所以可以读取原容器中的值,使用的是一种读写分离的思想。

【3】这种设计的好处是什么呢?

注意上面的操作arr数组本身是无锁的,没有锁,在添加数据的时候,做了额外的复制,

此时如果有线程来读数据,那么读取的是老arr的数据,此时arr的地址还没有改呢,在我添加元素的过程中,

无论有多少个线程来读数据,都是读的原来的arr,不是新的arr

所以性能很高,读写分离。提高了并发的性能。如果再读再复制...

【4】注意:

CopyOnWrite容器只能保证数据的最终一致性,不能保证数据实时一致性。

所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。

【5】适合特定场合:

这个应用场景显而易见,适合读多写少的情况。如果一万个线程都添加操作,都在集合中添加数据,那数组不断复制,长度不断+1,

那JVM肯定一直往上飙升,你用的时候肯定要评估使用场景的。

由于每次更新都会复制新容器,所以如果数据量较大并且更新操作频繁则对内存消耗很高,建议在高并发读的场景下使用。

【6】主要讲解:

COW容器有两种一种是CopyonWriteArrayList,一种是CopyOnWriteArraySet

一个是替代ArrayList,一个是代替Set  

CopyOnWriteArrayList

【1】代码:

  1. package com.star.test04;
  2. import java.util.concurrent.CopyOnWriteArrayList;
  3. /**
  4.  * @author : Starshine
  5.  */
  6. public class Test {
  7.     //这是main方法,程序的入口
  8.     public static void main(String[] args) {
  9.         CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
  10.         //添加方法:
  11.         list.add(1);
  12.         list.add(2);
  13.         list.add(3);
  14.         list.add(4);
  15.         System.out.println(list);//[1, 2, 3, 4]
  16.         list.add(3);//add方法无论元素是否存在,都可以添加进去--》添加重复的元素
  17.         System.out.println(list);//[1, 2, 3, 4, 3]
  18.         //adj. 缺席的;缺少的;心不在焉的;茫然的
  19.         list.addIfAbsent(33);//添加不存在的元素--》不可以添加重复的数据
  20.         System.out.println(list);//[1, 2, 3, 4, 3, 33]
  21.     }
  22. }

【2】源码分析:

  1. public class CopyOnWriteArrayList<E>{
  2.         //底层基于数组实现的
  3.         private transient volatile Object[] array;
  4.         
  5.         public CopyOnWriteArrayList() {
  6.         setArray(new Object[0]);
  7.     }
  8.         
  9.         final void setArray(Object[] a) {
  10.         array = a; // array = new Object[0]
  11.     }
  12.         //add方法:
  13.         public boolean add(E e) {
  14.         final ReentrantLock lock = this.lock;
  15.         lock.lock();
  16.         try {
  17.                         //返回底层array数组,给了elements
  18.             Object[] elements = getArray();
  19.                         //获取elements的长度---》获取老数组的长度
  20.             int len = elements.length;
  21.                         //完成数组的复制,将老数组中的元素复制到新数组中,并且新数组的长度加1操作
  22.             Object[] newElements = Arrays.copyOf(elements, len + 1);
  23.                         //将e元素放入新数组最后位置
  24.             newElements[len] = e;
  25.                         //array数组的指向从老数组变为新数组
  26.             setArray(newElements);
  27.             return true;
  28.         } finally {
  29.             lock.unlock();
  30.         }
  31.     }
  32.        
  33.        
  34.         final Object[] getArray() {
  35.         return array;//返回底层数组
  36.     }
  37.        
  38.        
  39.         private boolean addIfAbsent(E e, Object[] snapshot) {
  40.         final ReentrantLock lock = this.lock;
  41.         lock.lock();
  42.         try {
  43.                         //取出array数组给current
  44.             Object[] current = getArray();
  45.             int len = current.length;
  46.             if (snapshot != current) {
  47.                 // Optimize for lost race to another addXXX operation
  48.                 int common = Math.min(snapshot.length, len);
  49.                                 //遍历老数组:
  50.                 for (int i = 0; i < common; i++)
  51.                                         //eq(e, current[i])将放入的元素和老数组的每一个元素进行比较,如果有重复的元素,就返回false,不添加了
  52.                     if (current[i] != snapshot[i] && eq(e, current[i]))
  53.                         return false;
  54.                 if (indexOf(e, current, common, len) >= 0)
  55.                         return false;
  56.             }
  57.                         //完成数组的复制,将老数组中的元素复制到新数组中,并且新数组的长度加1操作
  58.             Object[] newElements = Arrays.copyOf(current, len + 1);
  59.                         //将e元素放入新数组最后位置
  60.             newElements[len] = e;
  61.                         //array数组的指向从老数组变为新数组
  62.             setArray(newElements);
  63.             return true;
  64.         } finally {
  65.             lock.unlock();
  66.         }
  67.     }
  68.        
  69.        
  70. }

CopyOnWriteArraySet

【1】代码:

  1. /**
  2.  * @author : Starshine
  3.  */
  4. public class Test02 {
  5.     //这是main方法,程序的入口
  6.     public static void main(String[] args) {
  7.         //创建一个集合:
  8.         CopyOnWriteArraySet<Integer> set = new CopyOnWriteArraySet<>();
  9.         //在这里也体现出Set和List的本质区别,就在于是否重复
  10.         //所以add方法直接不可以添加重复数据进去
  11.         set.add(1);
  12.         set.add(2);
  13.         set.add(2);
  14.         set.add(7);
  15.         System.out.println(set);//[1, 2, 7]
  16.        
  17.     }
  18. }

【2】源码:

  1. public class CopyOnWriteArraySet<E>{
  2.         //CopyOnWriteArraySet底层基于CopyOnWriteArrayList
  3.         private final CopyOnWriteArrayList<E> al;
  4.         
  5.         public CopyOnWriteArraySet() {
  6.         al = new CopyOnWriteArrayList<E>();
  7.     }
  8.         
  9.         //添加方法:
  10.         public boolean add(E e) {
  11.         return al.addIfAbsent(e);//底层调用的还是CopyOnWriteArrayList的addIfAbsent
  12.     }
  13. }

总结:

由上面的源码看出,每次调用CopyOnWriteArraySet的add方法时候,其实底层是基于CopyOnWriteArrayList的addIfAbsent,

每次在addIfAbsent方法中每次都要对数组进行遍历,所以CopyOnWriteArraySet的性能低于CopyOnWriteArrayList

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

近期股市热潮,现有架构模块下金融交易系统如何应对“冲击”?优化思路如下

近期股市热情高涨&#xff0c;激增的交易量挑战的不止是券商&#xff0c;还有交易系统的基础架构是否稳固。9月底&#xff0c;股市牛抬头&#xff0c;瞬时的高并发量一把“撞”崩多家券商的交易应用系统&#xff0c;导致交易停滞。 在这场资本盛宴背后&#xff0c;稳定、高效、…

一家异业联盟平台 两年百亿销售额怎么做到的?

近年来&#xff0c;互联网领域涌现了一颗耀眼的新星——“上海我店”&#xff0c;该平台短时间内交易额突破百亿大关&#xff0c;且用户数量在上月实现了近百万的增长。这一迅猛的扩张速度&#xff0c;自然吸引了众多商家的目光。不过&#xff0c;随着其影响力的提升&#xff0…

[自动化测试:Selenium]:环境部署和Webdriver的使用

文章目录 修改安装源打开Python Packages。点击梅花按钮。在弹出的对话框中&#xff0c;填入Name&#xff08;随便填&#xff09;&#xff0c;Repository URL&#xff0c;选择下列的源&#xff0c;一般先选择清华源按OK确认。配置完成 安装seleniumFile→Settings→Project&…

为你的网站增加点灵性:随系统变色

&#x1f33b; 前言 网站切换主题色已经是非常常见的功能了&#xff0c;提供浅色和暗色两种色调可以满足用户的使用习惯&#xff0c;帮助这些用户获得更好的访问体验。但是只能用户手动切换主题。 那如果用户已经将系统切换到了深色模式&#xff0c;当他们打开我们网站的时候…

虚拟机网络设置为桥接模式

1、打开VMware Workstation Pro&#xff0c;点击“虚拟机—设置”&#xff0c;进入虚拟机设置页面 2、点击“网络适配器”&#xff0c;网络连接选择桥接模式 3、点击“编辑—虚拟网络编辑器”&#xff0c;进入虚拟网络编辑器页面 4、选择桥接模式&#xff0c;并选择要桥接到的…

有趣的css - 跷跷板加载动画

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是使用 css 模拟一个跷跷板效果的加载动画效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面…

YOLO目标检测

文章目录 一、含义二、与传统检测对比1.one-stage的优缺点2.two-stage的优缺点 三、MAP指标1.基本概念2.计算方法3.指标意义 一、含义 YOLO&#xff08;You Only Look Once&#xff09;是一种基于深度学习的目标检测算法&#xff0c;由Joseph Redmon等人于2016年提出。它的核心…

基于STM32的多功能MP3播放器

基于STM32的多功能MP3播放器 基于STM32的多功能MP3播放器一、项目背景与意义二、系统设计与实现2.1 硬件设计2.2 软件设计2.3 系统调试 三、功能实现与展望四、结论五、附录 基于STM32的多功能MP3播放器 在数字化时代&#xff0c;多功能播放器已成为我们生活中不可或缺的一部分…

Aurora 4.6.2 | 第三方谷歌商店,无需谷歌框架

Aurora Store是谷歌Play Store的一个非官方FOSS客户端&#xff0c;通常称为‘极光商店’&#xff0c;设计优雅。Aurora Store不仅可以下载、更新和搜索Play Store等应用程序&#xff0c;还为用户提供了新功能。应用提供范围广泛的游戏和应用程序&#xff0c;包括音乐流媒体、购…

一起搭WPF架构之LiveCharts.Wpf的简单了解与安装

一起搭WPF架构之LiveCharts.Wpf的简单了解与安装 前言LiveCharts.Wpf介绍LiveCharts.Wpf的安装总结 前言 根据项目需求&#xff0c;我单独留了一个界面用于进行数据分析。数据分析的内容考虑是采用图表的形式将SQLite数据库中存储的数据进行绘制成图&#xff0c;以便数据分析。…

【ARM】ARM架构参考手册_Part B 内存和系统架构(5)

目录 5.1关于缓存和写缓冲区 5.2 Cache 组织 5.2.1 集联性&#xff08;Set-associativity&#xff09; 5.2.2 缓存大小 5.3 缓存类型 5.3.1 统一缓存或分离缓存 5.3.2 写通过&#xff08;Write-through&#xff09;或写回&#xff08;Write-back&#xff09;缓存 5.3.3…

09_实现reactive之代理 Set 和 Map

目录 创建代理建立响应式联系避免污染原始数据处理 forEachfor...ofvalues 与 keys 方法 Set 和 Map 都有特定的属性和方法来操作自身&#xff0c;因此需要单独处理。 创建代理 我们来看一段案例代码&#xff0c;体验一下和它们的独特之处&#xff0c;如下&#xff1a; const…

柯桥俄语学习,旅游俄语中的支付和交际常用语句

支付用语 --Здравствуйте, счёт, пожалуйста. --Как вы будете платить? --Вы принимаете карты? --Да, пожалуйста, покажите QR - код. --Нам нужно ещё одно б…

云原生技术:nacos进化到servicemash

面试的时候跟面试官吹嘘说&#xff0c;现在主流的微服务架构&#xff0c;都已经用得熟熟的了&#xff0c;自己技术很不错。进了公司却被分到了API资产管理平台&#xff0c;要做一个类似于网关的东西。经过调研才发现&#xff0c;自己用的微服务架构已经过时了&#xff0c;什么&…

基于yolov10的驾驶员抽烟打电话安全带检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv10的驾驶员抽烟、打电话、安全带检测系统是一种先进的驾驶行为监测系统。该系统利用YOLOv10算法的高效性和准确性&#xff0c;实现对驾驶员行为的实时检测与识别。 YOLOv10是一种最新的实时物体检测模型&#xff0c;其通过深度学习技术&#xff0c;如卷…

FastCFS高性能分布式文件系统集群搭建

FastCFS – 可以跑数据库的高性能通用分布式文件系统 简介 FastCFS 是一款强一致性、高性能、高可用、支持百亿级海量文件的通用分布式文件系统&#xff0c;可以作为MySQL、PostgreSQL、Oracle等数据库&#xff0c;k8s、KVM、FTP、SMB和NFS等系统的后端存储。 FastCFS 主要特…

L0G1000 Linux 基础知识

1.创建虚拟机 构建完成后 按需启动&#xff0c;本次启动30分钟&#xff0c;启动完成后出现下图界面。 点击进入开发机&#xff0c;出现初始界面。 2. 配置SSH密钥进行SSH远程连接 2.1打开Windows PowerShell,利用 ssh-keygen -t rsa 输入命令后一路回车就可以了&#xff0c;…

WXML-模板语法-条件渲染及列表渲染

条件渲染&#xff1a; wx&#xff1a;if: 结合block使用wx:if&#xff1a; hidden&#xff1a; wx:if和hidden对比&#xff1a; 列表渲染&#xff1a; wx&#xff1a;for&#xff1a; 1、在.js文件中创建一个数组&#xff1a; 2、创建一个view使用wx&#xff1a;for组件&…

【机器学习】并行计算(parallel computation)Part2

Asynchronous Parallel Gradient Descent Using Parameter Server 用Parameter Server实现异步并行梯度下降 Parameter Server这种编程模型可以实现异步并行梯度下降&#xff0c;架构采用的是Client-Server&#xff0c;通信方式是Message-passing&#xff0c;同步方式是异步的…

windows scp 免密码文件传输

windows scp 免密码文件传输 scp 是基于ssh加密服务的一种文件传输方式&#xff0c;是常见的linux主机间文件传输方式&#xff0c;在windows中也是支持的。 配置目标&#xff1a; 两台windows主机间通过scp命令行传输文件梳理概念 客户端&#xff1a; 通过命令行实现文件传输…