• [技术干货] 2020-10-06:java中垃圾回收器让工作线程停顿下来是怎么做的?
    2020-10-06:java中垃圾回收器让工作线程停顿下来是怎么做的?#福大大架构师每日一题#
  • [技术干货] 2020-10-04:java中GC Root 对象有哪些?
    2020-10-04:java中GC Root 对象有哪些?#福大大架构师每日一题#
  • [技术干货] 2020-10-03:java中satb和tlab有什么区别?
    2020-10-03:java中satb和tlab有什么区别?#福大大架构师每日一题#
  • [赋能学习] 通过Hcatalog的java接口,获取hive表的元数据信息
        通过Hcatalog的java接口,获取hive表的元数据信息        一、获取hive表元数据的方式:            1、通过hive的beeline客户端命令获取表元数据,如在beeline客户端中执行desc tablename;            2、通过hive的jdbc接口获取获取表元数据;            3、通过HCatalog的hcat客户端获取表元数据,如执行hcat -e "desc tablename";            4、通过HCatalog的java接口获取表元数据;            5、通过WebHcat的restful接口获取表元数据;            6、通过hive表的元数据库高斯DB获取表元数据(hive表的元数据库不对外开放)。        二、关于HCatalog            HCatalog建立在Hive Metastore之上,具有Hive的DDL能力。 从另外一种意义上说,HCatalog还是Hadoop的表和存储管理层,它使用户能够通过使用不同的数据处理工具(比如Pig和MapReduce),更轻松地在网格上读写HDFS上的数据, HCatalog还能为这些数据处理工具提供读写接口,并使用Hive的命令行接口发布数据定义和元数据探索命令。此外,经过封装这些命令,WebHcat Server还对外提供了RESTful接口。             HCatalog接口直接访问Hive Metastore,在效率上更为高效。本章节主要介绍通过Hcatalog的java接口,获取hive的元数据信息。        三、java代码            样例代码功能:获取hive表中列的个数。            package com.huawei.bigdata.hcatalog.example;                        import java.util.HashMap;            import org.apache.hadoop.conf.Configured;            import org.apache.hadoop.hive.conf.HiveConf;            import org.apache.hadoop.mapreduce.Job;            import org.apache.hadoop.util.Tool;            import org.apache.hadoop.util.ToolRunner;            import org.apache.hive.hcatalog.data.schema.HCatSchema;            import org.apache.hive.hcatalog.mapreduce.HCatOutputFormat;            import org.apache.hive.hcatalog.mapreduce.OutputJobInfo;                        public class HCatalogExample extends Configured implements Tool {                public HashMap<String, Integer> hm = new HashMap<>();                            public int run(String[] args) {                    HiveConf.setLoadMetastoreConfig(true);                    String[] tablenames = args[0].split(",");                                Job outputJob = null;                    HCatSchema schema = null;                    try {                        outputJob = Job.getInstance();                        for (int i = 0; i < tablenames.length; i++) {                            OutputJobInfo outputjobInfo = OutputJobInfo.create("default", tablenames[i], null);                            HCatOutputFormat.setOutput(outputJob, outputjobInfo);                            schema = outputjobInfo.getOutputSchema();                            hm.put(tablenames, schema.getFieldNames().size());                        }                    } catch (Exception e) {                        e.printStackTrace();                        return 1;                    }                    return 0;                            }                            public static void main(String[] args) throws Exception {                    HCatalogExample he = new HCatalogExample();                    int errcode = ToolRunner.run(he, args);                    he.hm.forEach((a, b) -> System.out.println("表"+a + "的列的个数为:" + b));                    System.exit(errcode);                            }            }        四、调试代码            1、安装集群的客户端,例如安装目录为“/opt/client”;            2、将上述代码打包成 HCatalog-examples.jar,并上传至客户端所在服务器的指定目录下,例如上传目录为“/opt/hive_client”;            3、加载如下环境变量:     export HCAT_CLIENT=/opt/hive_client       export HADOOP_HOME=/opt/client/HDFS/hadoop       export HIVE_HOME=/opt/client/Hive/Beeline       export HCAT_HOME=$HIVE_HOME/../HCatalog       export LIB_JARS=$HCAT_HOME/lib/hive-hcatalog-core-3.1.0.jar,$HCAT_HOME/lib/hive-metastore-3.1.0.jar,$HCAT_HOME/lib/hive-standalone-metastore-3.1.0.jar,$HIVE_HOME/lib/hive-exec-3.1.0.jar,$HCAT_HOME/lib/libfb303-0.9.3.jar,$HCAT_HOME/lib/slf4j-api-1.7.10.jar,$HCAT_HOME/lib/antlr-3.5.2.jar,$HCAT_HOME/lib/jdo-api-3.0.1.jar,$HCAT_HOME/lib/antlr-runtime-3.5.2.jar,$HCAT_HOME/lib/datanucleus-api-jdo-4.2.4.jar,$HCAT_HOME/lib/datanucleus-core-4.1.17.jar,$HCAT_HOME/lib/datanucleus-rdbms-fi-4.1.19.jar,$HCAT_HOME/lib/log4j-api-2.10.0.jar,$HCAT_HOME/lib/log4j-core-2.10.0.jar      export HADOOP_CLASSPATH=$HCAT_HOME/lib/hive-hcatalog-core-3.1.0.jar:$HCAT_HOME/lib/hive-metastore-3.1.0.jar:$HCAT_HOME/lib/hive-standalone-metastore-3.1.0.jar:$HIVE_HOME/lib/hive-exec-3.1.0.jar:$HCAT_HOME/lib/libfb303-0.9.3.jar:$HADOOP_HOME/etc/hadoop:$HCAT_HOME/conf:$HCAT_HOME/lib/slf4j-api-1.7.10.jar:$HCAT_HOME/lib/antlr-3.5.2.jar:$HCAT_HOME/lib/jdo-api-3.0.1.jar:$HCAT_HOME/lib/antlr-runtime-3.5.2.jar:$HCAT_HOME/lib/datanucleus-api-jdo-4.2.4.jar:$HCAT_HOME/lib/datanucleus-core-4.1.17.jar:$HCAT_HOME/lib/datanucleus-rdbms-fi-4.1.19.jar:$HCAT_HOME/lib/log4j-api-2.10.0.jar:$HCAT_HOME/lib/log4j-core-2.10.0.jar            4、执行提交命令:                  yarn --config $HADOOP_HOME/etc/hadoop jar $HCAT_CLIENT/HCatalog-examples.jar com.huawei.bigdata.hcatalog.example.HCatalogExample -libjars $LIB_JARS table10,table11,table12                    
  • [技术干货] SQLserver 如何给表新建触发器
    一. 需要数据库hzppb(汉字拼音表)和Xsxxb(学生信息表)二. 对Xsxxb进行更新时的触发器SQLSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONG**ATE TRIGGER update_xmsx_after_update_xsxxb_xm     ON  dbo.Xsxxb     AFTER UPDATE --在更新数据时对表中数据进行更新AS BEGIN IF UPDATE(xm) --如果表中的xm字段发生了更新,才执行对表中xmsx字段的更新 BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; DECLARE @xsid INT,@xm VARCHAR(50); --定义变量 ,@xm 姓名 可变字符串长度为五十 @xsid 学生ID 整型变量 SELECT @xsid=xsid,@xm=xm FROM Inserted;--在执行插入的操作后,在Inserted的临时表中获取xsid和xm,并将其赋给@xsid和@xm UPDATE Xsxxb SET xmsx=dbo.PysxCx(@xm) WHERE xsid=@xsid;-- 更新Xsxxb中的数据,使用函数PysxCx在表hzpyb中查询@xm对应的xmsx(姓名缩写), -- 并当@xsid 和Xsxxb表中的xsid相同时,更新对应的xmsx -- Insert statements for trigger here END else print '没有更新姓名,不对表的xmsx进行更新' END GO三. 对表Xsxxb进行更新时的触发器USE SSMSTest --使用的数据库名称 go set ANSI_NULLS ON GO Set QUOTED_IDENTIFIER ON GO CREATE TRIGGER Update_xmsx_after_insert_xsxxb              ON dbo.Xsxxb              AFTER INSERT --在插入数据后对Xsxxb进行更新 AS BEGIN SET NOCOUNT ON; DECLARE @xm VARCHAR(50),@xsid INT; --定义变量,@xm 姓名 可变字符串长度为五十 @xsid 学生ID 整型变量 SELECT @xsid=xsid,@xm=xm FROM Inserted; --在执行插入的操作后,在Inserted的临时表中获取xsid和xm,并将其赋给@xsid和@xm UPDATE Xsxxb SET xmsx=dbo.PysxCx(@xm) where xsid=@xsid; -- 更新Xsxxb中的数据,使用函数PysxCx在表hzpyb中查询@xm对应的xmsx(姓名缩写), -- 并当@xsid 和Xsxxb表中的xsid相同时,更新对应的xmsx END
  • [Java] GC的分类和触发机制
    GC按照回收区域分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)1.部分收集:不是完整收集整个Java堆的垃圾收集。其中分为:       新生代收集(Minor GC / Young GC):只是新生代的垃圾收集       老年代收集(Major GC / Old GC):只是老年代的收集。 注意很多时候Major GC 会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收2.整堆收集(Full GC):收集整个Java堆和方法区的垃圾回收。Minor GC 只在Eden区满的时候触发,Survivor区满并不会触发Minor GC,但是并不是说Survivor区不会被垃圾回收,而是说在Eden区满时触发Minor GC然后Eden区和Survivor区一起被垃圾回收,可以说Survivor区时被动垃圾回收的在老年代空间不足的时候,会先尝试触发Minor GC,如果之后空间还不足,就会执行Major GC。Full GC触发机制(1)调用System.gc()时,系统建议执行Full GC,但是不必然执行(2)老年代不足的时候(3)方法区不足的时候(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存(5)由Eden区,survivor0(From Space)区先survivor1(To Space)区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小说明:Full GC是开发或者调优中尽量要避免的,这样暂停时间会短一些
  • [技术干货] 将java中的 string 类型转成 数组案例
    个要看你的具体需求了.如果是有分隔符的那种例如"a,b,c";就直接分割就行了.String string = "a,b,c";String [] stringArr= string.split(","); //注意分隔符是需要转译滴...如果是"abc"这种字符串,就直接String string = "abc" ;char [] stringArr = string.toCharArray(); //注意返回值是char数组如果要返回byte数组就直接使用getBytes方法就ok了~~String string = "abc" ;byte [] stringArr = string.getBytes();同时,前台也可以 通过拼接 参数 传到后台 ,可以这样写使用“a,b,c”的 方式转成 数组形式,如果拼接成“[”+a+b+"]",需要 在后台 做相关操作:方法1:1234String demo = "[a,b,c]";String demosub = demo.substring(1,demo.length()-1);String demoArray[] = demosub.split(",");List<String> demoList = Arrays.asList(demoArray);方法 2:Arrays.asList("[a,b,c]").get(0)补充知识:Java将String型字符串转换成int型(或int型数组)转换成int型数组代码实现1234567String str = "6921168509256";int[] arr = new int[str.length()];for (int i = 0; i < str.length(); i++) {  arr[i] = Integer.parseInt(str.substring(i, i + 1));//substring是找出包含起始位置,不包含结束位置,到结束位置的前一位的子串}for(int i:arr)//输出数组arr  System.out.print(i+" ");转换成int型代码实现123String str = "69211685";int a = Integer.parseInt(str);System.out.print(a);
  • [技术干货] 【转载】使用java+TestNG进行接口回归测试
    TestNG是一个开源自动化测试框架,“NG”表示下一代(Next Generation的首字母)。 TestNG类似于JUnit(特别是JUnit 4),但它不是JUnit框架的扩展,相较于Junit而言,功能更强大,使用起来更加方便,比较适合测试人员来进行集成测试或是接口回归测试。一、TestNG的特点使用java和面向对象的功能方法的名称就不必受限于某种固定的格式,可以通过注释来识别需要执行的方法;方法中需要的一些参数可以通过注释传递;注释是强类型的,所以有错误可以在编译期体现出来;支持分组测试,依赖测试,并行测试,负载测试等支持多线程测试二、TestNG常用的注释类型注释描述@Test将类或是方法标记为测试的一部分@BeforeSuite在该套件的所有测试都运行在注释的方法之前,仅运行一次。@AfterSuite在该套件的所有测试都运行在注释的方法之后,仅运行一次@BeforeClass在调用当前类的所有测试方法之前执行,注释方法仅运行一次@AfterClass在调用当前类的所有测试方法之后执行,注释方法仅运行一次@BeforeTest注释的方法将在属于          标签内的类的所有测试方法运行之前运行@AfterTest注释的方法将在属于          标签内的类的所有测试方法运行之后运行。@BeforeGroups此方法是保证在运行属于任何这些组的第一个测试方法之前,该方法被调用@AfterGroups此方法是保证运行属于任何这些组的所有测试方法执行之后,该方法被调用@BeforeMethod被注释的方法将在每个测试方法之前执行@AfterMethod被注释的方法将在每个测试方法之后执行@DataProvider被注释的方法的作用是提供测试数据,如果某个测试方法希望从这个DataProvider接收数据,就必须使用一个名字等于这个注解名字的DataProvider@Parameters介绍如何将参数传递给测试方法三、TestNG参数化测试TestNG提供了2种传递参数的方式。第一种: testng.xml这种方式的优点是使得代码和测试数据分离,方便维护;缺点就是如果需要传递的参数不是基本的java类型,或是需要的值只能在运行时创建,这种方法就不再适用。第二种:@DataProvider这种能够提供比较复杂的参数(也叫data-driven testing)。我们项目中使用的是第二种如图示:首先给测试方法添加值为WithdrawBatchQueryLoopData的属性dataProvider,然后提供一个name与之对应的@DataProvider方法,这个方法里的具体实现,就是从配置文件或是数据库中读取数据。四、TestNG分组测试分组测试是TestNG中的创新功能,分组测试使得我们可以进行各种灵活的测试,在想要并行多组不同的测试时,不需要重新进行编译。分组可以应用在方法上(一个方法可以属于一到多个分组),也可以应用在类上,应用在类上时,这个类中的所有public方法都变成测试方法,即便他们没有被注解,也可以继续在需要增加属性的方法上重复@Test注解。分组执行测试方法有多种形式:可以通过在testng.xml配置,来指定具体要执行的分组也可以通过集成到jenkins中,通过参数化构建来设置要执行的分组还可以通过运行Run Configurations时,设置要执行的分组需要注意的一点:Group标签会导致@BeforeMethod失效@BeforeMethod的作用是标明所注解的方法在每一个测试方法运行之前会执行一次。例如:正常的执行的顺序为:beforeMehod—> testCase1—> beforeMehod—> testCase2但是,在将testCase放入某一个Group之后,@BeforeMethod就失效了再次执行脚本,执行顺序变为testCase1—>testCase2解决方法:1、将@BeforeMethod同样加入group12、设置@BeforeMethod的属性alwaysRun=true五、TestNG依赖测试我们经常会遇到要测试的多个接口之间存在依赖关系,即某一个接口的执行需要依赖上一个接口的返回结果,比如执行批付查询时,需要先执行批量代付,那么这时就使用到了TestNG的依赖测试,TestNG使用dependsOnMethods配合alwaysRun来设置测试方法之间的依赖关系,使用dependsOnGroups来设置分组之间的依赖关系强依赖:在测试方法运行之前,所有的依赖方法都必须运行并且成功,哪怕只有一个失败,测试方法都不会被调用(是skip而不是fail)软依赖(alwaysRun=true):测试方法在依赖方法运行之后总是会被执行,即便某些依赖方法运行失败。六、TestNG预期异常测试测试中,有时候我们期望某些代码抛出异常。TestNG通过@Test(expectedExceptions) 来判断期待的异常, 并且判断Error Message七、TestNG测试报告执行完测试用例之后,会在项目的test-output(默认目录)下生成测试报告打开index.html文件可以看到测试结果摘要,包括:套件名、测试用例成功数、测试用例失败数、测试用例忽略数、执行时间和testng.xml文件。测试用例都成功的话,测试结果以绿底标志,测试用例有失败的话,测试结果以红底标志。testNG自带生成的测试报告不太美观,可以使用testng-xslt进行美化。
  • [问题求助] 【鲲鹏产品】【扫描检测功能】java代码移植扫描检测问题
    【功能模块】【操作步骤&问题现象】1、上传java工程源码,2、执行/opt/depadv/tools/cmd/bin/dependency-advisor -S /home/yx/code --tos 'centos7.6' -C 'GCC4.8.5' -T 'make' --cmd 'make'没有报告生成,请问如何解决,对java工程和前端工程js代码如何进行扫描检测?【截图信息】【日志信息】(可选,上传日志内容或者附件)[Sat, 19 Sep 2020 18:21:14] [INFO] [entrance_util:record_task_begin_info:68] -------------------------------Start-----------------------------------[Sat, 19 Sep 2020 18:21:14] [INFO] [entrance_util:record_task_begin_info:70] *********************************************************************[Sat, 19 Sep 2020 18:21:14] [INFO] [entrance_util:record_tool_begin:58] **** The dependency advisor function: Generate a Kunpeng dependency report.[Sat, 19 Sep 2020 18:21:14] [INFO] [entrance_util:record_tool_begin:60] **** The dependency advisor version: dependency advisor v2.2.0.SPC200[Sat, 19 Sep 2020 18:21:14] [INFO] [entrance_util:record_task_begin_info:74] **** The current scanning task starting at 2020-09-19 18:21:14[Sat, 19 Sep 2020 18:21:14] [INFO] [entrance_util:record_task_begin_info:76] **** The current scanning task id: 20200919182114[Sat, 19 Sep 2020 18:21:14] [INFO] [entrance_util:record_task_begin_info:78] **** scanning begin>>>[Sat, 19 Sep 2020 18:21:14] [INFO] [entrance_util:record_task_begin_info:79] **** Start scan task from command line ...[Sat, 19 Sep 2020 18:21:14] [INFO] [scan_api:__scan_source_target:238] Scan source files...[Sat, 19 Sep 2020 18:21:14] [INFO] [project:do_exclude_make_scanner:621] call make parse start[Sat, 19 Sep 2020 18:21:15] [INFO] [project:do_exclude_make_scanner:624] call make parse succeed[Sat, 19 Sep 2020 18:21:15] [INFO] [project:do_exclude_scanner:769] get exclude scanner:-1 [Sat, 19 Sep 2020 18:21:15] [INFO] [project:do_exclude_scanner:781] do_exclude_scanner failed /home/yx/code/[Sat, 19 Sep 2020 18:21:15] [INFO] [scanner:do_scan:123] no C/C++ file in directory.skipping...[Sat, 19 Sep 2020 18:21:15] [INFO] [scanner:do_scan:123] no asm file in directory.skipping...[Sat, 19 Sep 2020 18:21:15] [INFO] [makefile_scanner:do_scan:45] no makefile file in directory.skipping...[Sat, 19 Sep 2020 18:21:15] [INFO] [cmake_scanner:do_scan:75] no cmake scan result in directory.skipping...[Sat, 19 Sep 2020 18:21:15] [INFO] [automake_scanner:do_scan:66] no automake file in directory.skipping...[Sat, 19 Sep 2020 18:21:15] [INFO] [fortran_scanner:do_scan:42] no fortran file in directory.skipping...[Sat, 19 Sep 2020 18:21:15] [INFO] [project:dump:110] ------------------------------ project ------------------------------------[Sat, 19 Sep 2020 18:21:15] [INFO] [project:dump:113] [Scan Directories]: ['/home/yx/code/'][Sat, 19 Sep 2020 18:21:15] [INFO] [project:dump:114] [Compiler]: GCC4.8.5, [Sat, 19 Sep 2020 18:21:15] [INFO] [project:dump:117] [ReportType]: [<ReporterType.CsvReporter: 0>][Sat, 19 Sep 2020 18:21:15] [INFO] [project:dump:118] [KeepGoingSwitch]: True[Sat, 19 Sep 2020 18:21:15] [INFO] [project:dump:119] [ConstructTool]: make[Sat, 19 Sep 2020 18:21:15] [INFO] [project:dump:120] [Command]: make[Sat, 19 Sep 2020 18:21:15] [INFO] [project:dump:121] [Target]: centos7.6-4.14.0[Sat, 19 Sep 2020 18:21:15] [INFO] [project:dump:123] [ProjectDirectory]: /opt/depadv/tools/cmd/report[Sat, 19 Sep 2020 18:21:15] [INFO] [project:dump:124] [ProjectTime]: 20200919182114[Sat, 19 Sep 2020 18:21:15] [INFO] [scan_api:__scan_source_target:275] Scan source files ended.[Sat, 19 Sep 2020 18:21:15] [WARNING] [scan_api:__scan_binary_and_source:208] There is nothing to report: wrong files or path[Sat, 19 Sep 2020 18:21:15] [INFO] [scan_api:scan_binary_and_source:109] There is nothing to be ported.[Sat, 19 Sep 2020 18:21:15] [INFO] [entrance_util:record_task_end_info:85] The current scanning task ending at 2020-09-19 18:21:15[Sat, 19 Sep 2020 18:21:15] [INFO] [entrance_util:record_task_end_info:87] **** scanning end >>>[Sat, 19 Sep 2020 18:21:15] [INFO] [entrance_util:record_task_end_info:88] -------------------------------End-----------------------------------[19955]options Namespace(always_make=True, debug=False, disable_builtin_rules=False, disable_builtin_variable=False, dump_json=True, dump_json_dir=['/opt/depadv/tools/make'], env_override=False, eval_string=[], ignore_errors=False, include_dirs=[], job_count=1, just_print=True, keep_going=False, load_avg=1, makefiles=[], new_file=[], old_files=[], opt_bm=False, output_sync=False, print_database=False, print_dir=False, print_version=False, question=False, silent=False, source_dir=['/home/yx/code'], symlink_times=False, touch=False, trace=False, verbose=False, warn_undefined_variables=True, work_dir='/home/yx/code')[19955]arguments [][19955]===================================================================================================[19955]start in make_interface:['--dump-json', '--source-dir=/home/yx/code', '--dump-json-dir=/opt/depadv/tools/make', '--always-make', '--just-print', '-C', '/home/yx/code'][19955]interpreter_path=/opt/depadv/tools/cmd/bin/dependency-advisor[19955]log_file_path=/opt/depadv/tools/cmd/bin/../logs/makefile_parser.log[19955]===================================================================================================[19955]include dirs:['/usr/gnu/include', '/usr/local/include', '/usr/include', '.'][19955]include directory /usr/gnu/include not exist, ignored[19955]options Namespace(always_make=False, debug=False, disable_builtin_rules=False, disable_builtin_variable=False, dump_json=False, dump_json_dir=[], env_override=False, eval_string=[], ignore_errors=False, include_dirs=[], job_count=1, just_print=False, keep_going=False, load_avg=1, makefiles=[], new_file=[], old_files=[], opt_bm=False, output_sync=False, print_database=False, print_dir=False, print_version=False, question=False, silent=False, source_dir=[], symlink_times=False, touch=False, trace=False, verbose=False, warn_undefined_variables=True, work_dir=None)[19955]arguments ['-'][19955]options Namespace(always_make=False, debug=False, disable_builtin_rules=False, disable_builtin_variable=False, dump_json=False, dump_json_dir=[], env_override=False, eval_string=[], ignore_errors=False, include_dirs=[], job_count=1, just_print=False, keep_going=False, load_avg=1, makefiles=[], new_file=[], old_files=[], opt_bm=False, output_sync=False, print_database=False, print_dir=False, print_version=False, question=False, silent=False, source_dir=[], symlink_times=False, touch=False, trace=False, verbose=False, warn_undefined_variables=True, work_dir=None)[19955]arguments ['-'][19955]add GNUMAKEFLAGS val [19955]debug in add_make_var(): MAKE=/opt/depadv/tools/cmd/bin/makefile_parser[19955]add MAKELEVEL val 0[19955]start parse[19955]variable assign:AR with:ar[19955]add AR val ar[19955]variable assign:ARFLAGS with:rv[19955]add ARFLAGS val rv[19955]variable assign:AS with:as[19955]add AS val as[19955]variable assign:CC with:cc[19955]add CC val cc[19955]variable assign:CXX with:g++[19955]add CXX val g++[19955]variable assign:CPP with:$(CC) -E[19955]add CPP val $(CC) -E[19955]variable assign:RM with:rm -f[19955]add RM val rm -f[19955]variable assign:LD with:ld[19955]add LD val ld[19955]variable assign:OUTPUT_OPTION with:-o $@[19955]add OUTPUT_OPTION val -o $@[19955]variable assign:LINK.o with:$(CC) $(LDFLAGS) $(TARGET_ARCH)[19955]add LINK.o val $(CC) $(LDFLAGS) $(TARGET_ARCH)[19955]variable assign:LINK.s with:$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c[19955]add LINK.s val $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c[19955]variable assign:LINK.S with:$(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)[19955]add LINK.S val $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)[19955]variable assign:LINK.c with:$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)[19955]add LINK.c val $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)[19955]variable assign:LINK.cc with:$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)[19955]add LINK.cc val $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)[19955]variable assign:LINK.C with:$(LINK.cc)[19955]add LINK.C val $(LINK.cc)[19955]variable assign:LINK.cpp with:$(LINK.cc)[19955]add LINK.cpp val $(LINK.cc)[19955]variable assign:LINK.cxx with:$(LINK.cc)[19955]add LINK.cxx val $(LINK.cc)[19955]variable assign:COMPILE.s with:$(AS) $(ASFLAGS) $(TARGET_MACH)[19955]add COMPILE.s val $(AS) $(ASFLAGS) $(TARGET_MACH)[19955]variable assign:COMPILE.S with:$(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c[19955]add COMPILE.S val $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c[19955]variable assign:COMPILE.c with:$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c[19955]add COMPILE.c val $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c[19955]variable assign:COMPILE.cc with:$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c[19955]add COMPILE.cc val $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c[19955]variable assign:COMPILE.C with:$(COMPILE.c)[19955]add COMPILE.C val $(COMPILE.c)[19955]variable assign:COMPILE.cpp with:$(COMPILE.cc)[19955]add COMPILE.cpp val $(COMPILE.cc)[19955]variable assign:COMPILE.cxx with:$(COMPILE.cc)[19955]add COMPILE.cxx val $(COMPILE.cc)[19955]variable assign:PREPROCESS.S with:$(CC) -E $(CPPFLAGS)[19955]add PREPROCESS.S val $(CC) -E $(CPPFLAGS)[19955]variable assign:.FEATURES with:order-only second-expansion target-specific undefine else-if[19955]add .FEATURES val order-only second-expansion target-specific undefine else-if[19955]variable assign:MAKE_VERSION with:4.2.1[19955]add MAKE_VERSION val 4.2.1[19955]start parse[19955]search for [origin:(%), prefix:(, suffix:), ]:[<tool.make.sub_module.prerequisite.Prerequisite object at 0x7f3235ea4ac0>][19955]add pattern:[origin:(%), prefix:(, suffix:), ][19955]add MFLAGS val -Bn --dump-json[19955]add MAKEFLAGS val Bn --dump-json$(COMMNAD_EVALS)[19955]environment variable MAKEFILES is start parse
  • [技术干货] 2020-09-15:java里的wait()和sleep()的区别有哪些?
    2020-09-15:java里的wait()和sleep()的区别有哪些?#福大大架构师每日一题#
  • [技术干货] Java基础之文件操作(IO流)
    特意写一章关于IO流的知识,不为别的,是因为IO流实在太重要了文件文件对象File 就是文件对象,我们电脑上的文件和文件夹都可以用这个File实例化public class Test{     public static void main(String[] args){         // 获取绝对路径D盘的hello文件夹         File f1 = new File("D:/hello");         // 获取相对路径的hello.txt文件         File f2 = new File("hello.txt");         // 获取D盘的hello文件夹下hello.txt文件的实例         File f3 = new File(f1,"hello.txt");                  // 输出三个文件或者文件夹的绝对路径         System.out.println(f1.getAbsolutePath());         System.out.println(f2.getAbsolutePath());         System.out.println(f3.getAbsolutePath());     }}123456789101112131415上面代码注释讲的已经非常的详细了,用三种方式创建一个文件对象,怎么获取文件的绝对路径文件常用方法假设我们已经实例化了一个File对象f判断是否存在 f.exists()判断是否是文件夹 f.isDirectory()判断是否是文件 f.isFile()获取文件的长度 f.length()文件最后修改的时间 f.lastModified()设置文件最后修改时间 f.setLastModified(0) 这里的0代表的是时间戳 也就是1970.1.1 08:00:00文件重命名 f.renameTo(“newName”)以字符串数组的形式,返回当前文件夹下面的所有文件 f.list()以文件数组的形式,返回当前文件夹下面的所有文件 f.listFiles()以字符串形式返回所在文件夹 f.getParent()以字符串形式返回获取所在文件夹 f.getParentFile()创建一个文件夹 f.mkdir() 如果说f所在的父文件夹不存在就会抛出异常创建一个文件夹 f.mkdirs() 如果说f所在的父文件夹不存在就会自动给你创建一个父文件夹删除文件 f.delete()JVM结束的时候删除文件 f.deleteOnExit()遍历C:\WINDOWS下面所有文件public class Test{     public static void main(StringP[] args){         File f = new File("C:/WINDOWS");         File[] files;         int k=0;         long max = 0;         if(f.exists){             // 把文件夹下面的所有文件都取出来             files = f.listFiles();             // 遍历所有的文件取出体积最大的文件             for(int i=0;i<files.length();i++){                 if(files[i].length()>max){                     //如果比最大的文件还大就把他的下标记下来                     k = i;                     max = files[i].length();                 }             }         }else{             System.out.println("文件夹不存在");         }                  // 输出找到的最大的文件路径和它体积         System.out.println("最大文件路径: "+files[k]);         System.out.println("最大文件体积: "+files[k].length()+" 字节");     }}1234567891011121314151617181920212223242526编码编码是信息从一种形式或格式转换为另一种形式的过程常见的编码常见的编码方式有如下几种:ISO-8859-1 ASCII 数字和西欧字母GBK GB2312 BIG5 中文UNICODE (统一码,万国码)看样子,我们的中文就是属于这个GBK这种编码了,也就是说中文只能用GBK编码来存储嘛?这个肯定是错的,UNICODE称为万国码,也就是全世界任何国家的字符都是可以储存的,只不过,他占用的空间是最大的,比入英文字母只需要1字节的空间,汉字需要3字节的空间,但是Unicode它不管你是英文字母还是汉字,都统一给你4个字节,这样的话是比较浪费空间的,所以就诞生了UTF-8这种基于Unicode减肥版本的编码方式。UTF-8它可以对英文或者数字使用一个字节,对汉字使用三个字节,这样的话就避免了空间的浪费。Java源代码中的汉字在执行之后,都会变成JVM中的字符,而这些中文字符采用的编码方式,都是Unicode流什么流?流就是一系列的数据。当不同的介质之间有数据交互的时候,Java就是使用流来实现比如读取文件的数据到程序中,站在程序的角度来看,就叫做输入流。文件输入流如何创建文件输入流,看以下代码:public class Test{     public static void main(String[] args){         try{             File f = new File("D:/hello.txt");             // 通过这个文件输入流可以将硬盘上文件中的数据读取到java程序内存中来             FileInputStream fis = new FileInputStream(f);         }catch(IOException e){             e.printStackTrace();         }     }}1234567891011字节流字节输入流InputStream是字节输入流,同时也是抽象类,只提供方法声明,不提供方法的具体实现。FileInputStream是InputStream的子类,我们下面就用FileInputStream来实现读取文件的内容public class Test{     public static void main(String[] args){         try{             // 准备一个文本文件,里面内容是AB             File f = new File("D:/test.txt");             // 创建文件输入流             FileInputStream fis = new FileInputStream(f);             // 创建一个字节数组,它的长度就是文件的长度             byte[] all = new byte[(int)f.length()];             // 以字节流的形式读取文件中的所有内容到字节数组             fis.read(all);             for(byte b : all){                 System.out.println(b);            }             fis.close();                      }catch(IOException e){             e.printStackTrace();         }     }}123456789101112131415161718192021结果是65和66 也就是A和B对应的ASCII码字节输出流OutputStream 是字节输出流,更InputStream也是一样的,抽象类。所以我们用FileOutputStream为例往文件中写入数据public class Test{     public static void main(String[] args){         try{             // 准备一个文本文件,里面内容是空的             File f = new File("D:/test.txt");             // 创建文件输出流             FileOutputStream fis = new FileOutputStream(f);             // 创建一个字节数组,里面写上A和B的ASCII码             byte[] data = {65,66};             // 以字节流的形式将data里的数据写入到输出流             fis.write(all);             fis.close();          }catch(IOException e){             e.printStackTrace();         }     }}1234567891011121314151617我们打开对应的文件,发现数据就已经写在里面了,但是输出流跟输入流有一个区别,就是输出流的时候不一定要求文件存在,当文件不存在的时候,会自动给我们创建一个新的文件,而输入流则会抛出异常字符流字符流:就是在字节流的基础上,加上编码,形成的数据流字符流分为字符输入流Reader 和 字符输出流 Writer他们常用的子类就是FileReader 和 FileWriter字符输入流在之前我们使用了字节输入流读取文件中的内容,读取的AB打印出来是65和66现在我们来看一下使用字符输入流读取文件是什么样的结果public class Test {       public static void main(String[] args) {         // 准备文件hello.txt其中的内容是AB         File f = new File("d:/hello.txt");         // 创建基于文件的Reader         try (FileReader fr = new FileReader(f)) {             // 创建字符数组,其长度就是文件的长度             char[] all = new char[(int) f.length()];             // 以字符流的形式读取文件所有内容             fr.read(all);             for (char b : all) {                 // 打印出来是A B                 System.out.println(b);             }         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }       }}12345678910111213141516171819202122字符输入流可以直接读取文件中的字符字符输出流我们可以直接将一串字符存储到文件中,代码如下:public class Test{     public static void main(String[] args){         // 创建文件对象,文件内容是空的         File f = new File("D:/hello.txt");         // 要写入的字符串         String str = "hello";        char[] cs = str.toCharArray();         try(FileWrter fw = new FileWriter(f)){             fw.write(cs)         }catch(IOException e){             e.printStackTrace();         }     }}1234567891011121314文件中的内容就会变称hello中文读取上面我们学习了字节流和字符流,那么我们分别用两种流来从文件中读取汉字内容。用字节流读取中文内容首先你得了解文本是以哪种编码方式进行保存的使用字节流读取文本后,再使用对应的编码方式去识别这些文字public class Test{     File f = new File("D:/hello.txt");     try(FileInputStream fis = new FileInputStream(f)){         byte[] all = new byte[(int) f.length()];         fis.read(all);         //将读到的字节进行编码输出         String str = new String(all,"GBK");         System.out.println(str);     }catch(IOException e){         e.printStackTrace();     }}123456789101112用字符流读取中文内容FileReader得到的字符,肯定是已经把字节根据某种编码方式识别成的字符。FIleReader的编码方式可以用Charset.defaultCharset()获取,如果是中文的操作系统那么就是GBK假设现在我们的文件是用UTF-8编码方式保存的,那么我们该如何使用字符流读取文字呢?答案就是使用InputStreamReader,这个是字节流到字符流的桥接器,它可以按照指定的字符集读取字节并将它们转换为字符。public class TestStream {     public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException {         File f = new File("D:/hello.txt");         System.out.println("默认编码方式:"+Charset.defaultCharset());         //FileReader得到的是字符,所以一定是已经把字节根据某种编码识别成了字符了         //而FileReader使用的编码方式是Charset.defaultCharset()的返回值,如果是中文的操作系统,就是GBK         try (FileReader fr = new FileReader(f)) {             char[] cs = new char[(int) f.length()];             fr.read(cs);             System.out.printf("FileReader会使用默认的编码方式%s,识别出来的字符是:%n",Charset.defaultCharset());             System.out.println(new String(cs));         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }         //FileReader是不能手动设置编码方式的,为了使用其他的编码方式,只能使用InputStreamReader来代替         //并且使用new InputStreamReader(new FileInputStream(f),Charset.forName("UTF-8")); 这样的形式         try (InputStreamReader isr = new InputStreamReader(new FileInputStream(f),Charset.forName("UTF-8"))) {             char[] cs = new char[(int) f.length()];             isr.read(cs);             System.out.printf("InputStreamReader 指定编码方式UTF-8,识别出来的字符是:%n");             System.out.println(new String(cs));         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }               }}1234567891011121314151617181920212223242526272829为什么中字的前面有一个?,如果你是用记事本另存为UTF-8的字符集编码的话,那么在第一个字节有一个标识,叫做BOM,用来标识这个文件是使用UTF-8编码的缓存流以介质是硬盘为例,字节流和字符流的弊端:在每一次读写的时候,都会访问硬盘。 如果读写的频率比较高的时候,其性能表现不佳。为了解决以上弊端,采用缓存流。缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到缓存中的数据读取完毕,再到硬盘中读取。就好比吃饭,不用缓存就是每吃一口都到锅里去铲。用缓存就是先把饭盛到碗里,碗里的吃完了,再到锅里去铲缓存流在写入数据的时候,会先把数据写入到缓存区,直到缓存区达到一定的量,才把这些数据,一起写入到硬盘中去。按照这种操作模式,就不会像字节流,字符流那样每写一个字节都访问硬盘,从而减少了IO操作缓存字符输入流BufferedReader可以一次性读取一行数据public class Test{     public static void main(String[] args){         /**         准备一个文件,里面的内容是         hello         world         你好         */         File f = new File("d:/hello.txt");         // 缓存字符输入流必须在一个存在的流的基础上创建         try(         FileReader fr = new FileReader(f);         BufferedReader br = new BufferedReader(fr);             ){             while(true){                 // 一次读取一行                 String line = br.readLine();                 if(line == null){                     break;                 }                 System.out.println(line);             }catch(IOException e){                 e.printStackTrace();             }         }     }}123456789101112131415161718192021222324252627缓存字符输出流PrintWrite,可以一次写出一行数据public class TestStream {         public static void main(String[] args) {         // 向文件lol2.txt中写入三行语句         File f = new File("d:/hello.txt");                    try (                           PrintWriter pw = new PrintWriter(f);                       ) {             pw.println("hello");             pw.println("world");             pw.println("你好");         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }         }}12345678910111213141516171819这里需要注意的是,缓存字符输入流的构造方法的参数是一个Reader,也就是一个字符流,而PrintWriter的构造参数可以是文件对象也可以是字节流或者字符流对象!缓存字节输入流和输出流分别是BufferedInputStream 和 BufferedOutputStream下面代码演示的是通过缓存字节输入流和输出流实现文件的复制public class Test{     public static void main(String[] args){         File file = new File("E:/我的文档/临时文件/视屏文件.ts");         File file1 = new File("E:/我的文档/临时文件/视屏文件(副本).ts");         try (                 FileInputStream fis = new FileInputStream(f);                 FileOutputStream fos = new FileOutputStream(f1);                 BufferedInputStream bis = new BufferedInputStream(fis);                 BufferedOutputStream bos = new BufferedOutputStream(fos);         ){             byte[] bytes = new byte[1024];             int len;             while(true){                 len = bis.read(bytes);                 if(len == -1){                     break;                 }                 bos.write(bytes,0,len);             }         }catch (IOException e){             e.printStackTrace();         }     }     }}
  • [技术干货] 2020-09-10:java里Object类有哪些方法?
    2020-09-10:java里Object类有哪些方法?
  • [大赛专区] 【中奖公示】【心得分享幸运奖】【求职训练营·Java实践排位赛来】11月中奖名单公布,12月赛程继续,分享学习心得感悟即可抽奖
    求职训练营·Java实践排位赛来啦华为专家手把手教你企业级Java编程规范迈出入职名企第一步现在起加入训练营,完成作业,在本帖内分享心得有机会获得华为耳机或精美周边一、中奖名单公布*抽奖公示视频请见本帖下方请12月期的获奖学员在1月10日前扫描下方二维码,用报名训练营的华为云账号登录,完成信息核对和邮寄信息填写,未在限定时间内反馈视为放弃。二、心得分享幸运奖规则1. 活动时间:即日起到2020年12月31日。2. 参与规则:报名训练营并完成作业题,在本帖下方回复心得的同学,即可参与抽奖。3. 奖品:华为手环4e篮球精灵(椰子灰)、华为mini蓝牙音箱、华为10000mAh移动电源SuperCharge快充版、华为周边(棒球帽、渔夫帽)。4. 中奖名单公布:每月抽奖并公示1次,当月公示上个月的心得分享幸运奖。5. 大赛官方会在本帖及官方QQ群内进行公示,请大家现在入群,第一时间收到中奖名单提醒。6. 领奖方式:请获奖学员在名单公布后的一周内内扫描下方二维码,用报名训练营的华为云账号登录,完成信息核对和邮寄信息填写,未在限定时间内反馈视为放弃。7. 发奖方式:奖品将在中奖名单公布后20个工作日内发放完成。*活动最终解释权归华为所有。三、心得分享幸运奖参与规则1. 报名训练营,报名链接>>>求职训练营·Java实践排位赛2. 进入大赛官网平台,页面左侧【训练营入口】加入课堂。进入课堂后,点击【作业】并完成。3. 进入答题页面,完成题目内容,点击“提交作业”即完成一题。4. 在本帖下方按以下格式回复心得内容:(1)我的华为云账号:XXX(必须提供,不然无法参与抽奖)(2)我的心得:XXX(3)心得内容:可以围绕课程内容、作业题和Java自由展开,比如:学习笔记分享(学霸、课代表们赶快来给同学们划重点,目前已有28位满分同学了哦,不来分享分享嘛);学习过程中遇到的困惑点,可以提出来,寻求其他同学和社区大神帮忙解答;学习过程中遇到的困惑点,并且自己找到解决思路的,也可以跟大家分享解决过程;学习过程中的感想感悟等等等等(纯自由发挥,心有多大,贴有多长)……【友情链接】学霸奖名单公布https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=76258&page=1&extra=#pid340680学习激励奖名单公布https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=76218&page=1&extra=#pid340451四、抽奖视频公示处【11月心得分享幸运奖】【12月心得分享幸运奖】
  • [大赛专区] 【中奖公示】【学霸奖】【求职训练营 · Java实践排位赛学霸奖】11月中奖名单公布,12月赛程继续,参与答题即可抽奖
    求职训练营·Java实践排位赛来啦华为专家手把手教你企业级Java编程规范迈出入职名企第一步现在起加入训练营,完成作业。得高分赢超值奖励你学习,我发奖,赶紧来呀!一、中奖名单公布1、满分学霸奖截止11月,前30位满分学霸学员已经全部诞生,学员们可以继续参加1600分高分抽奖、学习激励和心得分享奖的活动!2、高分抽奖奖励(1600分以上学员即可参与抽奖)*抽奖视频请见本帖下方3、奖品领取请12月期的获奖学员在1月10日前扫描下方二维码,用报名训练营的华为云账号登录,完成信息核对和邮寄信息填写,未在限定时间内反馈视为放弃。二、学霸奖规则活动时间:即日起到2020年12月31日【满分学霸奖励】:达到满分的同学可获得学霸奖,奖励华为华为手环 4 Pro,数量共30台,先完成先得。【高分抽奖奖励】:分数在1600分以上(含1600分)的同学,可获得抽奖机会1次。有机会获得华为AI音箱2(太空黑)HUAWEI Sound,第一期(9月、10月)每次抽奖送出8台。第二期(11月、12月)每次抽奖送出7台。*每人只能领奖1次1.训练营作业分值统计:共26个作业题,分为选择题和实践题两类。每题分值100分,总分值为2600分。系统以最后一次答题成绩为准(答题截止前可最多提交5次)。2.本次学霸奖分为【满分学霸奖励】和【高分抽奖奖励】两种。在活动期间,报名训练营,完成作业并取得满分或高分的学员,都有机会获得学霸奖品,数量有限,先完成先得。3.名单公布:每月公示获奖名单1次,将在当月的前5个工作日内,公示前一个月的学霸奖名单及抽奖名单。大赛官方会在本帖及官方QQ群内进行公示,请大家现在入群,第一时间收到中奖名单提醒。4.领奖方式:请获奖学员在名单公布后的一周内内扫描下方二维码,用报名训练营的华为云账号登录,完成信息核对和邮寄信息填写,未在限定时间内反馈视为放弃。5. 发奖方式:奖品将在中奖名单公布后20个工作日内发放完成。*活动最终解释权归华为所有。三、学霸奖参与方式 报名训练营,报名链接>>>求职训练营·Java实践排位赛            2. 进入大赛官网平台,页面左侧【训练营入口】加入课堂。进入课堂后,点击【作业】完成所有26个作业。           3. 进入答题页面,完成题目内容,点击“提交作业”即完成一题。26个作业均提交后,算最终完成作业。      在答题截止时间前可以多次修改(最多5次),系统以最后一次答题成绩为准。        【友情链接】学习激励奖名单公布https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=76218&page=1&extra=#pid340451心得分享幸运奖名单公布https://bbs.huaweicloud.com/forum/thread-76417-1-1.html四、抽奖视频公示处:【9月高分抽奖奖励抽奖视频】【10月高分抽奖奖励抽奖视频】【11月高分抽奖奖励抽奖视频】【12月高分抽奖奖励抽奖视频】
  • [大赛专区] 【分享推荐奖】【活动规则】求职训练营·Java实践排位赛邀请激励,华为音箱、耳机、移动电源等价值万元豪礼等你拿!
    参加求职训练营·Java实践排位赛华为专家手把手教你企业级Java编程规范迈出入职名企第一步不仅完成作业有机会获奖邀请好友参加还可以收获华为音箱、手环、移动电源等价值万元豪礼!带着你的小伙伴一起参加吧!一、活动公告求职训练营·Java实践排位赛自上线以来,选手们的参与热情一直很高,尤其是分享推荐,但同时我们也发现学习激励奖还没有开奖。为了把所有奖品都发放到选手们手中,从第二期开始,将暂停分享推荐奖,同时加大了其他活动的奖励,希望已报名的同学多多完成课程作业并分享学习心得,一起瓜分学习激励奖和心得分享幸运奖。学霸奖 https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=76258&page=1&extra=#pid340680学习激励奖 https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=76218&page=1&extra=#pid340451心得分享幸运奖 https://bbs.huaweicloud.com/forum/thread-76417-1-1.html#学习不停 发奖不止#一起冲鸭!二、第二中奖名单(截止11月6日活动结束)三、第一期中奖名单四、分享推荐方式1. 点击右侧链接报名训练营>>> 求职训练营·Java实践排位赛,左上角点击【立刻报名】2. 报名成功后,页面会多出一个【分享大赛】按钮(在之前立刻报名按钮右侧)。点击【分享大赛】,即可生成你的专属链接和二维码海报。*被邀请账号必须真实有效,活动期间大赛组委会将核实账号有效性,非有效账号将取消获奖资格。*活动最终解释权归华为所有。五、分享推荐奖励如何加入课堂?1.前往大赛报名页面>>>求职训练营·Java实践排位赛,完成报名2.点击左侧菜单栏【训练营入口】3.点击页面中【加入课堂】按钮。六、分享推荐公布规则1. 活动时间:即日起到2020年10月31日2. 中奖名单公布方式:邀请人数由系统后台统一,每周公示1次。名单在本帖及QQ群公示,建议立刻入群,以便收取第一手中奖提醒3. 领奖方式:中奖学生请在名单公布后的7个工作日内,扫描下方二维码填写邮寄信息,逾期视为自动放弃。奖品将于10月31日后的10个工作日内发放完毕。领取奖品请在此处扫码登记!4.训练营报名链接>>>求职训练营·Java实践排位赛活动解释权归华为所有。
总条数:2294 到第 页
上滑加载中