• 关于

    java定义数组

    的搜索结果

问题

java在定义二维数组时定义第二层数组出现的问题

蛮大人123 2019-12-01 20:26:45 1099 浏览量 回答数 1

问题

java怎么定义类数组初始化数组

云计算小粉 2019-12-01 19:56:53 629 浏览量 回答数 1

问题

java中的数组怎么定义数组的长度

云计算小粉 2019-12-01 19:52:51 998 浏览量 回答数 1

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

学生动手场景应用,快速了解并掌握云服务器的各种新奇玩法!

问题

Java中定义数组必须要指定长度吗为什么?

蛮大人123 2019-12-01 19:23:10 3958 浏览量 回答数 3

问题

java里面怎么定义数组

云计算小粉 2019-12-01 19:55:34 549 浏览量 回答数 1

问题

java里怎么定义数组

云计算小粉 2019-12-01 19:52:29 461 浏览量 回答数 2

问题

JAVA中数组定义new分配内存空间的问题

蛮大人123 2019-12-01 19:22:52 1174 浏览量 回答数 1

回答

这里讨论java语言,为什么数组定长,这是语言设计之初定义的规则。也可以有允许变化长度的数组LinkedList, ArrayList等类型。Java最初选择固定长度的数组:1、简化类型定义2、简化JVM内存管理分配和回收机制3、与C语言家族的语法尽量保持统一。当然其他弱类型语言,也有对于动态长度数组的支持。

徐雷frank 2019-12-02 01:44:14 0 浏览量 回答数 0

回答

Java中的数组是定长的!你这样int[] a ={}; 定义出来的数组a 长度为0,已经是定长了,之后再给它赋值是不可以的,因为它的长度定义出来之后是不可改变的了。所以在使用数组的时候,一定要注意长度,不能超过这个长度,负责就数组下表越界了。如果是标明全部格式,就必须给定一个数值,否则返回时出错;刚开始可以用变量名,在后面再new一个数组,也可以一个个添加!把数组可以看作是一个变量,比普通的变量难理解而已!

蛮大人123 2019-12-02 02:18:00 0 浏览量 回答数 0

回答

数组是一个容器,当它被创建后,不仅元素的类型是确定的,元素的个数也是确定的。换句话说,数组的长度是确定的,不可能再变长或者变短。因此,数组可以使用一个字段(length)来表示长度。 创建数组的方法有两种,这个应该大家都知道了。一种是通过 new 关键字创建指定长度后再赋值,另外一种是通过 {} 直接进行初始化。 // newint[] arr = new int[4]; arr[0] = 0; arr[1] = 1; arr[2] = 2; arr[3] = 3;//  {}int [] arr1 = {0, 1, 2, 3}; 但不管用哪种方法,数组的长度是可以明确知道的。并且不会再变长或者变短(学不了孙悟空的金箍棒)。 由于数组也是对象,所以以下代码是合法的。 那为什么数组不单独定义一个类来表示呢?就像字符串 String 类那样呢? 一个合理的解释是 Java 将其隐藏了。假如真的存在一个 Array.java,我们也可以假想它真实的样子,它必须要定义一个容器来存放数组的元素,就像 String 类那样。 public final class String     implements java.io.Serializable, Comparable<String>, CharSequence {     /** The value is used for character storage. */     private final char value[]; } 但这样做真的有必要吗?为数组单独定义一个类,是不是有点画蛇添足的意味。那既然数组没必要定义成一个类,也就没有必要再定义一个 length() 方法来获取数组的长度了,直接用 length 这个字段就可以了,不是吗? 那为什么字符串 String 类会有 length() 方法呢?来看一下源码就明白了。     /**     * Returns the length of this string.      *The length is equal to the number of Unicode      * code units in the string.      */    public int length() {         return value.length;     } length() 方法返回的正是字符数组 value 的长度(length),value 本身是 private 的,因此很有必要为 String 类提供一个 public 级别的方法来供外部访问字符的长度。 总结一下,Java 获取数组长度的时候用 length,获取字符串长度的时候用的是 length()。

游客pklijor6gytpx 2019-12-27 09:41:57 0 浏览量 回答数 0

回答

Java 的 Tuple 元组数据类型 元组类型,即 Tuple 常在脚本语言中出现,例如 Scala 的 ("Unmi", "china@qq.com", "blahbla")。元组可认为是象数组一样的容器,它的目的是让你方便构造和引用,例如 Pair 可认为是一个只能存两个元素的元组,像是个 Map; 真正的元组应该是可以任意多个元素的容器,绕来绕去,它还是数组,或列表,所以我们实现上还是要借助于数组或是列表。 先看 Scala 中什么是元组: val tuple = ("Unmi", "fantasia@sina.com", "blahblah...") println(tuple._1) //输出 Unmi Scala 中访问从 1 开始,用 ._1 方式来访问其中的元素。 场景:当在一个方法中, 你需要返回几个对象,这几个对象的类型一致,你可以返回一个数组;如果几个对象的类型不同呢,当然你可以返回一个Object[]数组,可是这样在使用结果数组的时候,就需要强转对象的类型,会导致类型不安全;也可以定义一个dto,当多个场景下需要使用的不同,需要定义多个dto,这样会类爆炸,而且重用率极低;在非常接近Java语言的Scala里有元组的定义:val t = (1, 3.14, "Fred"),就是一个不同类型的数据放到一个线性集合里,在Java里我们可以模拟出一个类似的结构,以适合上面的场景。

谙忆 2020-01-09 20:23:40 0 浏览量 回答数 0

问题

【精品问答】Java实战200例(附源码)

珍宝珠 2020-02-14 11:55:46 16104 浏览量 回答数 10

问题

能不能实现超过数组大小的数据存储并显示

a123456678 2019-12-01 19:24:25 832 浏览量 回答数 1

回答

enum是jdk5引入的语法糖,定义一个enum类实际上也是定义一个class,只是通过enum定义这个特殊class的时候,编译器会帮你做些事情:1.所有的枚举类会默认继承Enum类2.所有的枚举类是final的,不可扩展子类3.所有定义的枚举常量,会生成定义的枚举类中生成public static final常量所以,枚举类和普通类的用法没有太大的区别,譬如: case1: public enum TrafficLight { RED("红灯"), GREEN("绿灯"), YELLOW("黄灯"), ; private final String desc; TrafficLight (String desc) { this.desc = desc; } public String getDesc() { return desc; } } case2: public enum TrafficLight { RED("红灯") { public TrafficLight next() { return YELLOW; } }, GREEN("绿灯") { public TrafficLight next() { return RED; } }, YELLOW("黄灯") { public TrafficLight next() { return GREEN; } }, ; private final String desc; TrafficLight (String desc) { this.desc = desc; } public String getDesc() { return desc; } public abstract TrafficLight next(); } 根据上面的描述:第一个问题:Direction d = Direction.EAST;的答案就很显然了,赋值枚举变量的时候,当然要带前缀了,因为这些枚举常量是指定枚举类中的常量,必须加上类限定前缀。java的switch语法,是通过jvm的tableswitch和lookupswitch两个指令实现。简单说一下实现原理:java编译器为switch语句编译成一个局部变量数组,每个case对应一个数组的索引,指令的执行是通过不同的数组索引找到不同的入口指令。所以原则上switch...case只能处理int型的变量。 enum能用在switch语句中,也是一个语法糖,我们知道所有枚举类的父类Enum中有一个private final int ordinal;,java编译器检测到switch语句中变量是一个枚举类,则会利用之前枚举类的ordinal属性,编译一个局部变量数组,后续在进行case分支比较的时候,就是简单通过tableswitch或lookupswitch指令来进行跳转,需要注意的一点:这个局部变量数组的构建过程是在编译器在编译阶段完成的。给一个简单的实例: public class Traffic { public static void main(String[] args) { Light light = Light.RED; switch(light) { case RED: System.out.println("红灯"); break; case GREEN: System.out.println("绿灯"); break; case YELLOW: System.out.println("黄灯"); break; } } enum Light { RED, GREEN, YELLOW } } javap -c 反编译后的字节码: public class com.lee.test.Traffic extends java.lang.Object{ public com.lee.test.Traffic(); Code: 0: aload_0 1: invokespecial #10; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #18; //Field com/lee/test/Traffic$Light.RED:Lcom/lee/test/Traffic$Light; 3: astore_1 4: invokestatic #24; //Method $SWITCH_TABLE$com$lee$test$Traffic$Light:()[I 7: aload_1 8: invokevirtual #27; //Method com/lee/test/Traffic$Light.ordinal:()I 11: iaload 12: tableswitch{ //1 to 3 1: 40; 2: 51; 3: 62; default: 70 } 40: getstatic #31; //Field java/lang/System.out:Ljava/io/PrintStream; 43: ldc #37; //String 红灯 45: invokevirtual #39; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 48: goto 70 51: getstatic #31; //Field java/lang/System.out:Ljava/io/PrintStream; 54: ldc #45; //String 绿灯 56: invokevirtual #39; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 59: goto 70 62: getstatic #31; //Field java/lang/System.out:Ljava/io/PrintStream; 65: ldc #47; //String 黄灯 67: invokevirtual #39; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 70: return static int[] $SWITCH_TABLE$com$lee$test$Traffic$Light(); Code: 0: getstatic #53; //Field $SWITCH_TABLE$com$lee$test$Traffic$Light:[I 3: dup 4: ifnull 8 7: areturn 8: pop 9: invokestatic #55; //Method com/lee/test/Traffic$Light.values:()[Lcom/lee/test/Traffic$Light; 12: arraylength 13: newarray int 15: astore_0 16: aload_0 17: getstatic #59; //Field com/lee/test/Traffic$Light.GREEN:Lcom/lee/test/Traffic$Light; 20: invokevirtual #27; //Method com/lee/test/Traffic$Light.ordinal:()I 23: iconst_2 24: iastore 25: goto 29 28: pop 29: aload_0 30: getstatic #18; //Field com/lee/test/Traffic$Light.RED:Lcom/lee/test/Traffic$Light; 33: invokevirtual #27; //Method com/lee/test/Traffic$Light.ordinal:()I 36: iconst_1 37: iastore 38: goto 42 41: pop 42: aload_0 43: getstatic #62; //Field com/lee/test/Traffic$Light.YELLOW:Lcom/lee/test/Traffic$Light; 46: invokevirtual #27; //Method com/lee/test/Traffic$Light.ordinal:()I 49: iconst_3 50: iastore 51: goto 55 54: pop 55: aload_0 56: dup 57: putstatic #53; //Field $SWITCH_TABLE$com$lee$test$Traffic$Light:[I 60: areturn Exception table: from to target type 16 25 28 Class java/lang/NoSuchFieldError 29 38 41 Class java/lang/NoSuchFieldError 42 51 54 Class java/lang/NoSuchFieldError } } 根据上述的描述: 枚举变量的定义、赋值是运行时jvm强制要求类型必须一致,所以必须加上类限定前缀;而在switch...case中使用枚举变量,则只是java提供的语法糖,这个特色并不是在运行时通过JVM来保证的,而只是java编译器在编译阶段完成的,在编译过程中的一旦判断switch语句中的变量是enum类型,即只需要以其ordinal属性为索引,通过tableswitch查找局部变量数组(这在反编译后的7~12行字节码可以体现出)。在此时case语句不需要类限定前缀,完全是java编译器的限制(编译器是不需要枚举类的前缀,只需要枚举类编译的static int[] $SWITCH_TABLE)。 JDK7中switch...case语法新增支持string字面量是差不多同样的道理,java编译器根据string常量的hashcode值,在编译阶段构建局部常量数组。

蛮大人123 2019-12-02 01:57:42 0 浏览量 回答数 0

问题

重复元素问题

a123456678 2019-12-01 19:51:00 902 浏览量 回答数 1

回答

我们定义了二维数组,并获取数组的长度: Main.java 文件 public class Main { public static void main(String args[]) { String[][] data = new String[2][5]; System.out.println("第一维数组长度: " + data.length); System.out.println("第二维数组长度: " + data[0].length); } } 以上代码运行输出结果为: 第一维数组长度: 2 第二维数组长度: 5

珍宝珠 2020-02-12 17:38:13 0 浏览量 回答数 0

回答

定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。 分类 基本数据类型 数值型 整数类型(byte,short,int,long) 浮点类型(float,double) 字符型(char) 布尔型(boolean) 引用数据类型 类(class) 接口(interface) 数组([]) Java基本数据类型图

问问小秘 2020-03-27 16:24:35 0 浏览量 回答数 0

问题

关于Java中jdk文档的使用问题

蛮大人123 2019-12-01 19:53:53 1039 浏览量 回答数 2

回答

Java可以自定义对象数组来存储对象。需要注意的是,数组中的每个对象属于自定义的类,也就是同一类型。由于数组中每个元素都是引用数据类型,只有多个实例好的对象才能组成自定义数组。看看下面的代码你也许就更清楚了。 public class ZooTest { public static void main(String[] args) { Animal[] animals = { new Cat(), new Monkey(), new Cat(), new Mule(), new Dog(), new Monkey() }; for(Animal a:animals){ a.eat(); } } } class Animal { void eat() { System.out.println("动物吃东西"); } } class Cat extends Animal { void eat() { System.out.println("猫吃鱼"); } } class Dog extends Animal { void eat() { System.out.println("狗啃骨头"); } } class Monkey extends Animal { void eat() { System.out.println("猴吃香蕉"); } } class Mule extends Animal { void eat() { System.out.println("骡子吃饲料"); } }

蛮大人123 2019-12-02 02:18:05 0 浏览量 回答数 0

回答

数组是在Java中的特殊对象,他们有一个名为一个简单的属性length是final。 没有数组的“类定义”(您无法在任何.class文件中找到它),它们是语言本身的一部分。 10.7。数组成员 数组类型的成员包括以下所有: 的public final字段length,其中包含所述阵列的部件的数量。length可以是正数或零。 该public方法clone,它覆盖类同名的方法Object,并没有抛出checked异常。clone数组类型方法的返回类型T[]为T[]。 多维数组的克隆很浅,也就是说,它仅创建一个新数组。子数组是共享的。 所有成员都继承了阶级Object; 唯一Object不被继承的clone方法是它的方法。 问题来源于stack overflow

保持可爱mmm 2020-01-16 15:29:42 0 浏览量 回答数 0

回答

遍历 遍历就是把这个数组的每个元素 显示出来 遍历的方法就是先定义这个数组的大小,然后用FOR循环来完成数组,例如 [java] view plain copy <span style="font-family:'Microsoft YaHei';"><span style="white-space:pre;"> </span>double[] score = new double[5]; Scanner input = new Scanner(System.in); for (int i = 0; i < score.length; i++) { System.out.println("请输入第" + (i + 1) + "位同学的成绩:"); score[i] = input.nextDouble(); } for (int i = 0; i < 5; i++) { System.out.println(score[i]); }</span> 这个就是一个double 型的数组用for去遍历每个元素 而结束条件就是这个数组的最后一个数组 score.length就可以遍历这个数组了 求和 求和就是在遍历的基础上添加一个求和的计数器 就在在for外面定义一个和的变量 这个变量的初始值是0 这样就能达到求和的结果是正确的 求和的公式在for循环里面写这样的目的是因为求和也是在循环的往上加的过程 例如 [java] view plain copy <span style="white-space:pre;"> </span>double sum = 0; int i; for (i = 0; i < score.length; i++) { sum = sum + score[i]; } System.out.println(score.length + "位同学的成绩是" + sum); 这个就是求和的过程 其他的运算方法就是把这个符号更改下而已 极值 极值的目的就是求一个极端的值 方法就是假定数组里面的一个数据是最大的然后用其他的数据遍历他与他进行对比 如果新的数据值比这个定义的值大的话那么就替换他的这个位置然后继续遍历 遍历结束后就输出这个值就是最大的值或者最小的值 例如 [java] view plain copy double max = score[0]; for (i = 0; i < score.length; i++) { if (score[i] > max) { //这里的大于号变成小于号就可以求最小值了 max = score[i]; } } System.out.println(i + "位同学的最高成绩是" + max); 这个代码就是求一个极值而且是最大的内个 查找 这个功能就是查询当前的数组是否有你需要的值 就好像你去一个地方去找人是一个意思 查找用到了boolean变量 因为这个功能的目的就是找到与没找到 换句话来说就是 找到了就是真(或假) 没找到就是假(或真) for循环里面写的if判断 判断方法就是当用户输入的值与数组中的某一个值是一样的那么就输出 否则(else)就没找到 输出不输出随便你 还要判断下用boolean就可以做到 如果是真那么就跳出这个循环并且进入下一个循环 因为boolean在跳出的时候变化成真了 那么在下面的if里面就是以真的形式出现并且输出 例如 [java] view plain copy <span style="white-space:pre;"> </span>boolean flag = false; System.out.println("请输入您要查找的分数:"); double findScore = input.nextDouble(); for (i = 0; i < score.length; i++) { if (score[i] == findScore) { flag = true;//变真了 break;//跳出这个for循环进入下面的if循环 } } if (flag) {//由于是上面的boolean变成真了 所以就进入这个if 如果没找到就跳刀下面的else System.out.println("找到了您所要查找的分数。" + score[i]); } else { System.out.println("没有找到您所要查找的分数。"); } 这个就是 倒置 倒置的意思就是最后一个元素变成第一个元素第一个元素变成最后一个 过程就是折中取半 不遍历整个数组了遍历一半,那么就/2就可以 但是计算机数数的方法是从0开始的也就是说最后一个值里面是没有任何意义的 所以要在最后一个值那-1 并且还要定义一个空的变量 因为要用到三步换值(变量) 不定义也可以 例如 [java] view plain copy <span style="white-space:pre;"> </span>for (i = 0; i < score.length / 2; i++) { double temp = score[i]; //这里是空变量赋值 三步赋值第一步 score[i] = score[score.length - 1 - i];//右边的值赋到左边那么右边就变成空的值 score[score.length - 1 - i] = temp;//同上 但是这个temp是个临时的值所以他最后是空的没有 } for (i = 0; i < score.length; i++) { System.out.println(score[i]); } 排序 排序是引用的JAVA自带的一个类 所以没有难度 例如 [html] view plain copy <span style="white-space:pre;"> </span>Arrays.sort(score);//这个代码就是内个排序的类 for (i = 0; i < score.length; i++) { System.out.println(score[i]); } 插入 插入的意思就是在这个数组中某一个地方插入一个变量(值) 但是一旦插入的这个变量进去那么就会对这个数组产生变化所以数组一定要空出多余的地方 并且要对插入进来的 数据进行判断,判断结束后还要跳出这个判断的if,判断的条件就是:输入进来的值大于数组里的某一个值并且小于这个值前面的那一个值(num[i]-1) 替换这个值跳出 进入下一个循环 例如 [java] view plain copy <span style="white-space:pre;"> </span>int[] num = new int[6]; for (i = 0; i < num.length; i++) { num[i] = input.nextInt(); } Arrays.sort(num); System.out.println("输入您要插入的数:"); int insert = input.nextInt(); for (i = 0; i < num.length; i++) { if ((insert > num[i]) && (insert < num[i - 1])) { num[i] = insert; break; } } for (i = 0; i < num.length; i++) { System.out.println(num[i]); } 数组的7个算法100%全在遍历的过程 每个都是 每个算法里面都有一个for是在遍历

琴瑟 2019-12-02 01:18:48 0 浏览量 回答数 0

回答

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程 共享.跟C/C++不同,Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。

宏卓 2019-12-02 01:48:33 0 浏览量 回答数 0

回答

import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test03 { public static void main(String[] args) { int number[] = new int[8]; String letter[] = new String[8]; String str = "A1B2C3D4E5F6G7H8"; Matcher m = Pattern.compile("\\d").matcher(str); Matcher d = Pattern.compile("\\D").matcher(str); String s = ""; while (d.find()) { s += d.group(); // 将字符串拆分成字符数组 } // 将字符串拆分成字符数组 letter = s.split(""); System.out.println(); String s1 = ""; while (m.find()) { s1 += m.group(); } // 将字符串s1拆分后给数组number赋值 // 将字符串拆分成字符数组 String[] str1 = s1.split(""); // 给number数组赋值 for (int j = 0; j < str1.length; j++) { number[j] = Integer.parseInt(str1[j]); } // 输出字符串数组 for (String string : letter) { System.out.print(string + " "); } System.out.println(); // 输出整形数组 for (int num : number) { // 上面定义的number长度为 System.out.print(num + " "); } } }

爵霸 2019-12-02 02:28:56 0 浏览量 回答数 0

问题

无法在Java中创建LinkedList数组…?

保持可爱mmm 2020-02-08 11:32:05 1 浏览量 回答数 1

问题

关于java中的String类的方法的问题

蛮大人123 2019-12-01 19:55:10 785 浏览量 回答数 2

问题

java 关于几个类的关系逻辑问题

蛮大人123 2019-12-01 19:47:42 834 浏览量 回答数 1

回答

大部分编程语言都直接使用了 mysql 提供的 C 语言库。(也有很多语言使用自己写的库,比如 java,之前的版本适用的 C 语言库,后来的 JDBC 版本改成了用 Java 原生语言)。在 mysql 的 C 语言库头文件中 mysql.h 定义了 mysql_fetch_row 函数:MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);返回的类型是 MYSQL_ROW 类型。这个类型依然在 mysql.h 中定义:typedef char **MYSQL_ROW; /* return data as array of strings */后面注释写的很详细了。由于 C 语言没有关联数组,所以 mysql 的 C 语言库里没有提供 mysql_fetch_array函数,应该是 PHP 在 mysql_fetch_row 的基础上封装的。

落地花开啦 2019-12-02 02:53:15 0 浏览量 回答数 0

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19

回答

使用sort()方法对Java数组进行排序,及如何使用 binarySearch() 方法来查找数组中的元素, 这边我们定义了 printArray() 方法来打印数组: import java.util.Arrays; public class MainClass { public static void main(String args[]) throws Exception { int array[] = { 2, 5, -2, 6, -3, 8, 0, -7, -9, 4 }; Arrays.sort(array); printArray("数组排序结果为", array); int index = Arrays.binarySearch(array, 2); System.out.println("元素 2 在第 " + index + " 个位置"); } private static void printArray(String message, int array[]) { System.out.println(message + ": [length: " + array.length + "]"); for (int i = 0; i < array.length; i++) { if(i != 0){ System.out.print(", "); } System.out.print(array[i]); } System.out.println(); } } 以上代码运行输出结果为: 数组排序结果为: [length: 10] -9, -7, -3, -2, 0, 2, 4, 5, 6, 8 元素 2 在第 5 个位置

珍宝珠 2020-02-12 16:52:46 0 浏览量 回答数 0

问题

使用bytearrays数组创建Spark DataSet时出错

社区小助手 2019-12-01 19:23:50 428 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站