• [基础组件] java封装FlinkSQL写Hudi
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.enableCheckpointing(1000);env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);env.setParallelism(Integer.valueOf(prop.getProperty("setParallelism")));TableEnvironment tEnv = StreamTableEnvironment.create(env);tEnv.executeSql("CREATE TABLE kafka(\n" +"uuid VARCHAR(20),\n" +"name VARCHAR(10),\n" +"age INT,\n" +"ts TIMESTAMP(3),\n" +"`p` VARCHAR(20)\n" +") WITH (\n" +"'connector' = 'kafka',\n" +"'topic' = 'writehudi',\n" +"'properties.bootstrap.servers' = 'x.x.x.x:21005',\n" +"'properties.group.id' = 'testGroup1',\n" +"'scan.startup.mode' = 'latest-offset',\n" +"'format' = 'json'\n" +")");tEnv.executeSql("CREATE TABLE stream_mor(\n" +"uuid VARCHAR(20),\n" +"name VARCHAR(10),\n" +"age INT,\n" +"ts timestamp(3),\n" +"`p` VARCHAR(20)\n" +") PARTITIONED BY (`p`) WITH (\n" +"'connector' = 'hudi',\n" +"'path' = 'hdfs://hacluster/tmp/hudi/stream_mor',\n" +"'table.type' = 'MERGE_ON_READ',\n" +"'compaction.delta_commits' = '1'\n" +")");tEnv.executeSql("INSERT INTO stream_mor select * from kafka");env.execute("FlinkSQLJob");附件为完整工程样例,具体执行步骤请参考https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=86598
  • [问题求助] 【鲲鹏性能分析插件】【java性能分析】在kylinv10/毕昇jdk1.8上无法使用采样分析
    【功能模块】java性能【操作步骤&问题现象】1、安装毕昇jdk1.8 2、安装maven3.8.63、本地启动jar包4、登陆鲲鹏性能分析页面5、点击java性能分析6、点击采样分析【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 2021计算机保研经历-转载
    本人是在 9 月 22 日下午开始正式“躺平”,如释重负 !回想起从 5 月开始找实习就一直在面试,到 6 月底才开始准备保研 (太晚开始导致那时候还挺焦虑的 ‍),到 7 月一边夏令营复习一边面试,我的夏令营结束后 (7.22 最后面中科大) 又开始“躺”,8 月下旬又开始一边实习一边刷 PAT,9 月开始新一轮预推免复习和面试,终于熬出头了 !下面我会将我的保研过程 (包括夏令营和预推免) 尽量详细的记录下来,还会推荐很多好用的网站,供学弟学妹们参考。保研术语看一些经验帖或者保研群里会出现一些术语会让人一脸懵,所以很有必要了解一下。借鉴 https://zhuanlan.zhihu.com/p/394491286rk:rank,排名。最常说的就是 rk1,第一名title:学校的牌子 (知名度)强/弱 com:强 committee 指委员会面试占比重,导师没有很大话语权;弱 committee 指导师在夏令营录取中有很大话语权ap:assistant professor,助理教授oq:over qualified,比如一个清北的学生报名西交的夏令营却没入营,说明他 oq 了bar:门槛wl:waiting list,候补队列陶瓷:提前联系老师个人情况专业排名:末9 软件工程 rk1BUFF:四级 500+,六级 500-,无论文,无科研,几个水奖 (网页设计、程序设计、互联网+、天池、人工智能等),一个大创负责人,一个 top2 实习经历 (偏工程),字节实习 (后端)TIPS:因为我有独立完成的项目 (top2实习) 和实习经历 (字节),好几个面试的老师或学长都认为我代码能力很强~ 有些同学会认为实习不要写在简历上,因为有的老师不让、不喜欢想实习的同学,我觉得这是不冲突的。本科实习不代表你研究生也要实习呀,反而能体现出你有一定的工程能力,研究生基本要学术+工程能力兼顾的)。甚至我有的导师还会推荐你去实习。选择:报学校首先要清楚自己的定位,目标可以稍微高一点点,比如你觉得自己可以上浙大,那也不妨报一手清北,不嫌麻烦建议都报。我对自己的定位是纯 rk 选手,优势在于有实习经历,刚开始比较想冲的学校是浙大 cs。在直硕和直博上,想从硕士读起,不太能接受专硕。毕竟没有一段完整的科研经历,不清楚自己是否适合读博。个人认为读直博的话,路比较窄,而且压力会很大,万一导师不好更惨,还可能延毕什么的,而先读硕士就不用考虑那么多。但是如果是 top2 的 cs 还是可以接受直博的 hh (坑导除外)。关于是否直博网上有很多帖子,切记不要为了 title 盲目直博~学校:pku=thu > zju > fdu=sjtu > nju > ustc导师:研究方向 > 人品 > 学术水平 > 待遇地域:深圳=广州 > 杭州 > 其他 > 北京 (能去 top2 的话北京也无所谓)OFFER:总共参加了 11 个学校的夏令营/预推免,到最后除了南大都有 offer最终去向:北京大学信息工程学院 - 计算机学硕 (信科导师)前期准备前面说了我 5 月份基本上一直在找实习,到 6 月又基本在搞大作业或者复习考试,正式开始准备应该在 6 月底。这里建议大家一定要尽早准备材料,尽早复习,甚至可以尽早 (3/4 月就开始) 联系老师!不然就会像那时的我一样老是觉得复习不完然后压力大 这里我还要感谢我小学期导师 w 老师,否则 7 月份将更忙!那该如何进行准备呢?这里先推荐一个计算机保研交流群:605176069。不过因为此群太火,我又不爱水群,被 LRU 好几次了 (进群就懂 LRU 了)。在这个群里你会获得许多最新消息,最新资源,有许多成功保研的学长学姐也在里面,十分推荐!进入正题,我认为保研必须准备:一张好看 (又看得出是你) 的证件照 + 简历。虽然有的学校报名并不需要简历,但是理一遍自己的简历基本上就是理一遍之后要用到的更详细的材料。写在简历上的东西要保证都会而且真实。推荐一个制作简历的网站,选择简单大方的模板填写。新建一个专门存放保研期间素材的文件夹,然后在里面建立以下文件夹:成绩证明:包括英语水平证明 (六级很重要,有 460+ 基本可以报所有学校了,越高分越好),带有教务处盖章的成绩单和排名证明。排名有很多种,如果学校没有特别要求,可以用排名最高的证明个人信息:包括中文个人陈述,英文自我介绍,个人介绍 PPT,身份证复印件,学生证复印件,陶瓷模板推荐信:包括 2-3 位老师的推荐信模板荣誉获奖证明:包括你的各种获奖证明。如果发过论文可以再建一个论文文件夹学校:包括你所报名的每个学校,每个学校又是一个文件夹。因为每个学校需要什么材料是不一样的,所以分学校来存放会比较好上面一些文字性的材料在保研过的学长学姐那或网上都可以找到很多模板。然后这些材料一般会要求以 pdf 格式上传,还有的要合并成一个 pdf,所以这里推荐一个处理 pdf 的免费网站,无需注册,功能丰富且好用!联系老师因为我当时真的没有时间提前联系老师了,所以我基本是入营了,或者拿到 offer 了才联系老师。我建议时间充足情况下可以提前联系老师,尤其是优秀的同学,有些好导师名额确实 3/4 月就满了。联系老师的作用?对于导师权力大的学校,老师要你基本上就稳了。而且有的老师愿意给你提供帮助,比如告诉你要注重复习哪些方面等。但是也有的老师只是回复一些官方回复,例如“欢迎报考”之类的,甚至也会遇到不回复的老师,这些都不要紧,很常见的事情,本文最后也会说到这个事情。了解写在简历上的项目经历或科研经历,这没啥好说的,不要问到又不会,尽量啥都会以体现就是你自己做的,花了心血在上面。至少要复习到以下内容机试:书本推荐看《算法笔记》和《王道机试指南》(需要的可以 dd);实战推荐分类刷 leetcode、pat 甲级,想去北航的刷 csp,也可以针对学校刷往年题库,网上找或者牛客网上有。注意最好用 C/C++ 刷,容错率高。复习过程也可以帮助你回忆基础数据结构和算法。专业课:操作系统,计算机网络,计算机组成原理/计算机系统,数据库,编译原理等 (我还被问到过根本没复习的选修课…)。推荐一个复习网站,这是我当时准备实习时开始用的,后面保研时想快速复习的话也会看一下,不过只看他是远远不够的,cs 黑书 yyds!数学:高数、线代、概率论。如果不报中科院的话,我觉得只需要知道一些基础概念就行。中科院有的实验室笔试要做一些数学题啥的,可能要复习得细致一点。英语:从准备一份详细的英文自我介绍开始,可以让你解决大多数的英文问题。(面试中我最怕就是英文环节了,自认为英语真的很差,问专业课的话多多少少都会有点印象。不过每天多背背自我介绍,等到预推免的时候其实也不怕英文了~) 其他常见的英文问题有 (网上也能找到很多模板) 介绍大学、介绍专业/计科和软件的区别、为什么要读研/读博/适合读博吗等等,大家可以参考我这篇博文,是我当时准备英语的资料,有各种必备问题和模板回答。夏令营情况本人基本报的都是 cs 学硕,只有 top2 我才会选择直博,毕竟 title up++。下面是我的入营和参营情况,没参营的我会大概说一下我了解到的形势 (但不一定真实,有些是有事没事翻绿群看到的)。一开始我对自己的定位是比较高的,部分中九或不是很想去的学校不打算报。只是一些开奖 (入营 offer) 早的、觉得大概率能入营的学校,身边一些优秀同学都没入营,实在没想到那么卷 ,就报了几所保底学校    初审情况    原因 / 结果清华软件学院    ✓直博    未参加。入营 60 人,夏令营是不发 offer 的,感觉对预推免的帮助也不是很大。不过有看过面经说夏令营机试做的太好拿到口头 offer 的。不过经过这次夏令营看到了很多杯具,口头 offer 也不要全信,养鱼这事毕竟都是你养我养大家养 (但我非必要时不养 hhh)北大信科    ✗直博    实习导师的直博名额都给本校了,就被拒了。信科直博名额比较多,外校学硕比较少。不过今年听说信科因为扩招和般昌平变简单了,外校学硕都多了很多武大计算机学院    ✓硕    offer。入营不多不少,武大夏令营有本校保护,优营即 offer。不过优营鸽子应该挺多的,预推免上岸也是希望很大的南开大学计算机学院    ✓硕    面试合格,需要再通过实验室考核才算 offer。入营很多,面试通过的也多,实验室考核听说比较硬核,要复线论文啥的哈工大 (深圳) 计算机    ✓硕    offer。入营 60+人?每个学校均匀分配 1-3 人,据说是为了宣传,最后优营感觉有 30+。最后没听说被鸽穿北航计算机学院    ✓硕    wl 靠前,后来补录到。北航夏令营是给外校的,而且入营了不参加或者没过也不能再报预推免来,在预推免阶段需要和本校生竞争,夏令营入营和优营都很多,不过今年优营减少了,最后同学 wl 60 也上岸了人大高瓴    ✓硕    未参加。学硕入营 120 个左右,参营 80+。人大信院和高瓴没有预推免,想去的要抓住夏令营机会,参加了至少有 wl。高领去年和今年(学硕) 都鸽穿了,今年报直博的 wl 里还可以转硕复旦大学计算机学院    ✗硕    我校软件全军覆没 ,无话可说…华科计算机    ✓硕    offer。985 基本可以入营,听说 211 只给专硕。面试老师感觉很亲和南大计算机    ✓硕    入营很多人,要再做个线上测试 (大概 20 来个选择题,啥题都有,很无语),相当于二次选拔,通过才能正式进入面试,没过 hhh… 而且南大 cs 今年有各种迷惑操作,结果到最后还是被鸽穿了中大计算机    ✓硕    offer。中大 cs 负责招生的李老师特别负责,整个招生流程也很公开。不过最后中大也还是穿了,高中时的梦校啊中科大计算机    ✓硕    wl 靠前,通过了导师面。学院说 wl 靠前的基本可补到学硕,wl 后面的也有机会录到,不过只剩专硕了。科大没有直博,不怎么考察英语,所以也不卡 6 级,我在后面的面经会介绍科大老师给我说的一些面试要点。科大 cs 貌似没穿,可能是因为 wl 太长了吧中科院计算所、软件所    ✓    计算所未参加,软件所参加了线上第一轮面试。因为要线下参加且不管食宿和路费,然后也没有说特别想去中科院,emmm 综合考虑就没参加 中科院是弱 com 吧,即使没入营老师要你也可以去面试 (霸面)。报的学校除了北大和复旦都入营了,最终参加了 7 所学校的面试 (线上夏令营的好处就是可以并发进行 hhh),到最后基本都可以被录取。下面记录一下面经。软件所并行实验室软件所开奖很晚,好像20多号开的,看到自己入营了,入营的是并行实验室,但我记得我好像没选实验室。回去看报名要求发现要在备注写上意向实验室,否则不会报名成功,当时没注意到这个却入营了,觉得也是缘分和机遇,就参加了第一次线上交流和面试。实验室老师都挺亲和的,线上交流就是老师们介绍实验室的发展状况和一些老师的研究方向以及相关招生信息。然后没多久就组织面试,我是第一个面试的,过程还是比较轻松。自我介绍 PPT 10mins怎么了解到并行实验室的怎么理解并行你校用的 csapp 这本书,你喜欢这门课吗?喜欢哪个部分?SIT 项目是什么项目打算读硕士还是直博,如果想读博士要考虑清楚,不然之后转博名额会受限制因为软件所是要线下参加,但是当时疫情和汛情好像有的同学可以线上参加,我是抱着线上参加的心理。结果最后因为我不是疫情和汛情原因无法线下参加,就没有后面的流程了。武汉大学计算机武大也算是高中时期的一个梦校了吧,印象最多的就是校园环境超美。武大 cs 的夏令营有本校保护,有幸入营~ 往年有笔试 (感觉笔试不简单),今年没有,直接上面试记录:3 分钟自我介绍在研究生阶段,你发现你和其他同学有所差距,跟不上了,感到焦虑,你会如何处理一个考政治思想的问题,表现自己爱国爱党就行英文问题:Q:你怎么定义真正优秀的人(自我介绍的时候说到了,给自己挖坑)A:(半天憋出一句话,老师笑了一下 - - 然后说换个问题)Q:你能从哪些方面提升自己?A:(答了准备好的英文自我介绍中的研究计划)Q:你认为哪些性格让你成为优秀的学生A:(还是从英文自我介绍里抠出来了一些,说明一个完整的英文自我介绍多么重要)你参加过哪些比赛?都获得了什么结果呢?————————然后老师那边就断线了十几分钟————————get 和 post 的区别一直问项目体验还是挺不错的,老师都挺和善,就是那边声音有点听不清,一开始他们设备还坏了,面试一半之后耽误了十几分钟接着面试,最终顺利优营。武大后来也是有预推免的。南开大学计算机我们学校入营挺多的,面试合格的也挺多的。我进会议时没准备好,讲 PPT 超时于是潦草结束,总之前面有点拉跨。不过最后还是通过了。南开要先过学院关,再过实验室关才算正式 offer,我不是很想去就没有参加实验室面试 (听说实验室考核也比较硬核)。面试分了好几组进行,不同组的问的问题差距较大,比如我有同学那组问很多数学,我这组问项目偏多。下面是我的面试记录:英文对话 (ppt 故意没写研究兴趣,就是想让老师用英文问研究兴趣)Q:你研究生想做哪些方向A:大数据或人工智能 (hhh 大火方向,其实不太了解)Q:人工智能方向有很多,比如 lr, cv, nlp, rl 等,具体什么方向呢?A:nlpQ:你读过 nlp 相关的论文吗A:一开始以为老师说的是写论文,我答 NO,老师尬住了,我缓过来之后说 YesQ:可以介绍一篇你读过的论文吗(这个问题想到过,但没来得及准备。面完南开之后准补上看了,在之后很多次面试里我都用到这个来回答)A:两三句介绍完了……你的 bert 怎么微调的你说你的是 base 模型,为什么不用 large,它效果更好nlp 方向很多,你想做哪方面知不知道我们学院做知识图谱的老师哈工大深圳计算机网上看了哈深的图片,校园环境真不错!个人觉得是深圳三巨头中最好看的 (之后实地考察了进一步证实了我的看法)。而且近年来了很多厉害的导师,地域也很好,基本上什么互联网公司都有,所以在夏令营结束后,这是我拿到的最满意的 offer (每个人考虑的点不一样,我不是只看title)。一开始会有机试,几十个题,满分150,进入面试应该得 90+ 吧。面经 (20mins 左右):5 分钟PPT讲解,自我介绍用英文,其他部分可以用中文你的科研经历很广泛,很多方向都有,请问哪一个影响最深刻?你更偏向于做什么方向呢?看到你有北大实验室的经历,请问是什么情况下让你有了这样的契机还有报其他学校吗?(我说想在广东发展,就只说了中大)如果哈工大和中大同时给你 offer 你会如何选择分最高的一门专业课是啥?你认为自己学的最好的一门课?你从中收获了什么,学会了什么?对你的项目有什么帮助有什么兴趣爱好在 20 个题中(前面人抽了就没了)抽一道算法题,思考 3 分钟,口述思路感觉面试还是挺舒服的,因为没问太多专业课,最后 offer 了,在 8 月中旬才联系老师。刚开始联系的是 nlp 小牛导 x 老师,当时觉得实验室考核有点麻烦,我又在实习,估计没时间完成。于是换了另一个挺多 A、h37 的 x 老师,面试过后感觉老师还挺帅的,看着也年轻,很为学生考虑,完全没架子,当时还问我要不要去华为实习,哎可实习又注重科研,这谁能拒绝!当时就觉得除了 top2 和浙大就去哈深了!后来鸽老师的时候,老师一点架子也没有,还说“没事儿,反正还在一个校园里,有机会可以一起吃饭” (据说清北深和哈深可以课程互选、学分互认),而且他也认识我的导师,总之我超级推荐 x 老师!在填志愿那几天还看到老师又中了两篇 A,真的又好又强~!哈深也有预推免,并且分好几批,面试过程跟夏令营差不多,设有 wl。哈工大 nlp 是很厉害的,苏大的 zhang min 也到哈深来了,未来想做 nlp 的也可以考虑 z 老师或 x 老师组。中科大计算机中科大出入营结果的时候拖延了两次,第一次出结果时我们专业全军覆没…群里说联系老师就可以入营。于是我联系了一个 l 老师,l 老师回复非常及时,而且完全不是官方回复,他是真的会认真看你给他发的陶瓷信,甚至还找出了我陶瓷信中一个错误!当时说要是我确定去科大就去学院要人 (我认为要坦诚相待,不能因为想入营就欺骗老师)。我当时其实不确定,就说自己还报了哪些学校啥的,如果通过了会斟酌一下。但老师还是捞我了!第二次出入营结果时就有我的名字了,非常感谢老师!至于面试过程挺尴尬:自我介绍 5mins PPT对其中一个项目问了几个问题就没了???(感觉我那组人均10分钟) 凭印象大概是这样的对话,很尴尬:Q:你这个项目你的工作量怎么样A:是我自己一个人做的Q:代码量多少A:前后端加算法端加起来应该是几千?(这个问题没有准备过,当时瞎说的,大家一定要大致统计一下项目的代码量,因为这是体现你工作量的地方!)Q:你这个模型最后的精度怎么样?A:大概 0.85, 0.86 (我天,这个我忘记了,说了个大概的,结果面试完去看记录原来是 0.82 左右…尴尬了)Q:你有没有加入一些额外知识?我记得这个任务当时最高也就是你这个得分呀A:(大概就是说我不记得了之类的)Q:哦,你的意思是你不清楚你自己做的工作?A:(连忙解释确实是自己做的,有点久了忘记了。哎所以大家一定要对自己的项目做到面面俱到呀)Q:忘了… 反正就是尴尬到底科大也是要先过学院关还要再过老师关。于是面试结束后继续联系了 l 老师,老师让我复盘一下我的面试,并且做出了评价 (老师太好了)。他认为我的面试效果会不好,即使我是有能力的。这里总结一下老师的话“自我介绍的 PPT 里要体现自己所做的工作,例如写了哪些代码,代码量多少,看了哪些论文,完成了什么功能模块,要拿出证据出来,有什么收获。即使你只是改了一个代码,甚至是按着源码写了一个 CNN 也可以”。后来按老师所说的改了下 PPT,使用效果真的不错!最后出结果是在 wl 靠前,我就没继续找老师了,有种半放弃的状态。一直到九月时才被催着又重新联系了一个 p 老师,也通过了老师的考核,愿意给学硕。但我也告诉老师过几天会有 thu 的面试,如果过了我会去 thu,老师也理解我,说让我面完再告诉他。p 老师也是非常好的老师,跟他聊天的过程中让我学会了很多。科大 cs 好像没有预推免了,夏令营的 wl 挺长的 (100+),而且群主说 wl 都有机会补录到。北航计算机北航 cs 估计是所有学校里面流程最成熟,结果最公开的吧!第一天上午机试,两题两个小时,难度感觉是 LeetCode 中等和 PAT 甲级左右,对常见数据结构和算法熟练的话是有能力拿高分的 (个人认为 csp250+ 抵机试会高分,因为北航机试不算难的,除非编程基础非常差,200 分就抵机试吧)。下午就开始面试,好像一直到第二天都是面试,然后第二天晚上就出结果,一套流程下来特别顺畅。面试大概 13mins,还挺快:政治问题(10 个题抽一个回答)英文自我介绍(感觉老师没咋听)解释什么是边缘概率密度?什么是大数定律你认为,这些知识 (刚才问的那些数学) 在你的项目中有什么作用用 bert 干了什么操作系统中的页表是干啥用的一个编译好的程序的地址是什么地址编译好的程序到内存运行时,生成地址经过了几次转换ip 到 mac 地址是怎么转换的arp 请求 和 响应报文有什么区别问了一个天池竞赛是干什么的,自己参加的吗vue 前端的一个问题,v-if 和 v-show 的区别….忘了老师好像不会管你答得对不对,看面经就知道北航比较看重专业课和数学。面试完感觉挺好的,当天就有老师打电话给我,说是其中一个面试的老师,希望我加入他的课题组~北航夏令营是给外校的,所以预推免很多本校的参加。想上岸 buaa 最好直接报名夏令营,而且据说夏令营和预推免只能报一个。中山大学计算机中大负责招生的老师很负责任,还很可爱~ 入营挺多人的。先有机试,好像是 10 道题,面向对象、数据结构、算法等都有,我做的还可以。虽然说机试不加入成绩,但是我觉得还是有一定影响的。面经:英文问题,2 分钟说一下最喜欢的一门课自我介绍 PPT 5mins一直问项目操作系统进程和线程区别一个简单的有关数据库设计的题目内存中堆和栈的区别中大也是我高中时的梦校。但中大的面试没怎么准备,最后优营排名前 50,学硕锁定。没有联系老师。到后面九月时想试试联系 lin 佬的,但又觉得可能没名额了就打住了。最后在 9.20 左右放弃了优营名额。中大在后来也有预推免,不够预推免只剩专硕了。中大的 cv 是很强的,未来想做 cv 的不妨考虑下中大。华中科技大学华科夏令营开得非常晚,面试过程也很快,我们学校入营和优营都很多。自我介绍 2-3 分钟对自我介绍中的两个项目的都问了几个问题(好像都没用问技术问题)研究生计划在大学中有没有遇到难以解决的问题,最后是怎么解决的华科今年也是有预推免的,同学参加之后表示当场手撕堆维护代码。预推免情况学校    入营情况    原因 / 结果清华软件学院    ✓ 直博    offer。要交 100¥ 复试费。预推免门槛低于夏令营。情深大数据    ✗ 专硕    情深基本都是报专硕,然后报名官网状态显示我材料没交齐,于是无了…北大信科    ✗ 直博    报的直博,导师没有博士名额了,还是被拒了。北大深圳    ✓ 硕    offer (但是导师有sz学硕名额 )。北深只要导师要就可以入营,完全就是给你机会陶瓷的复旦大学计算机学院    ✗ 硕    软件就别想入营南大计算机    ✓ 硕    没消息,结果穿了 hhh浙大计算机    ✓ 硕    offer。cs 硕士外校入营 230 左右,我们学校入营的比去年多了。由于浙大开的太晚,最后鸽穿了… 浙软也鸽到了wl 100+浙大计算机浙大是我最后一个面的。我把它写在第一个是因为,在开始保研之前,清北这些我就没想过,最多觉得就是报个名体验体验,所以很长一段时间浙大 cs 才是我之前最想去的。但是浙大计算机夏令营只有直博实习,而且时间很长,当时就没考虑,直到夏令营才报。当时看去年的浙大 cs 预推免入营名单,我们院只有两个计科的同学,觉得十分惨淡。但还是抱着一丝希望报了 PAT,往年可以抵浙大的机试,从开始复习 PAT 一直到考试做了 30 来道题,最终很圆满的获得了满分,当时还是挺高兴的,结果最后 cs 没有机试… (虽然去年也没有)关于想刷 PAT 的同学推荐按这个网站复习,然后遇到不会的题可以参考一个在 liuchuo 的大佬的博客。在报名之前可以到这个网站去提交 20 道题就可以获得 50 元代金券浙大面试是 9.22 下午,上午正好是 pku 的面试,赶忙从深圳赶回家,开始面试的前 5 分钟才去网站上看面试流程…我心真大。当然也是因为有更好 offer 了,对我来说就是面个过场,过程不少于 20mins5 分钟左右PPT自我介绍,含 1 分钟左右英文英文问题:某项目用的什么模型,为什么只对我知识图谱的项目比较感兴趣,问了好几个问题,有些答不上(都说的是之后再研究……有点尬)线代:矩阵的逆的定义;伴随矩阵的定义;第三个问题是“求线性方程组,有个xxx,如果控制不好,求的结果会不稳定,xxxx?”,xxx忘记是啥了,我答的是“不好意思我没听过xxx”…问数据库索引的优缺点编程问题:超大数相加。一开始答的每一位存在数组里,模拟相加运算;他说耗内存,然后我就说存在字符串里。好像还有接着问,又好像直接结束了,忘了经常回答完都会静默一段时间,可能是我回答短了?反正我面的挺随意的。但总体面试氛围比南大好多了,也可能是因为我开了共享屏幕,看不见老师的表情是啥样的哈哈哈哈。反正面南大时我觉得老师都是冷冷的没表情好像很累似的…今年浙大 cs 硕士预推免 280+ 参加,拟录取 110+ 人左右,剩下的都是候补,浙大 cs 也是本校保护,去年录取名单中外校 cs 学硕 10- 人,se 学硕 20+ 人。由于浙大开的太晚,貌似鸽穿了,好像有wl前几都补到了 cs 学硕… 浙软也鸽到了wl 100+清华软件清华软件夏令营就挺后悔没参加的,想感受一下 thu 的气氛。我预推免时报直博是觉得外校的直博可能比较简单,毕竟清软夏令营只有直博,而且只有外校的参加。后来去查才知道,直博名额只有 20 来个,本校的人也是占一半;硕士名额差不多百个了,不过外校基本只有专硕。具体的大家可以直接网上搜往年录取公示。所以我觉得清软应该是硕士比较简单。我没有提前联系老师,本来没想报的,是在截止报名的前几个小时才报的,这也导致了我没看清楚情深的报名要求,导致情深材料没交齐…清软先有一场机试,今年机试题目不难,一共四个题 (题目我保存下来了),奈何我最后一题看着会却做不对。据群里的 acm 大佬说要用什么矩阵快速幂?好吧,那我估计不会。报直博的话会有两场面试,第一场是综合面试,第二场是专业面试。对于外校的同学,机试成绩*20% + 综合面试成绩*8% + 专业面试*72% 是最终成绩 (本校同学机试占 10%)。综合面试就是问一下素质品德等,比较好回答,比如为什么要读博 (一定要准备回答这个问题)。专业面试先有 5mins 自我介绍 (可以用 PPT),然后就是根据你的自我介绍问相关问题,涉及经历、项目、导师等。thu 老师感觉都很亲切~ 面试感觉挺好的,没两天就发 offer 了,导师在网上也没有言论,看近年所发的论文也算符合自己的兴趣,圆梦清华!北大深圳拿到 thu offer 那一刻,以为不再有变数。突然在 pku 实习时的导师问我愿不愿意先读学硕,保持成绩可转博。导师在信科直博名额很早就给本校了,听到可以读学硕我特别心动,立马答应。于是北深就给我补发了邮件,我当时没看到邮件,还打电话让我确认。在北深导师权力比较大,如果导师要你基本就稳了。所以我也没太多准备,推荐一个面经,面试流程和里面说到的差不多,可能还会遇到原题。面试是 9.22-9.23 线下,我是第一天上午面试,要求 7 点 20 之前到门口,所以前一天晚上就到深圳了。线下面试不要穿的太随意了,但我觉得也不用正装什么的太正式 (志愿者说穿拖鞋都可以…)。面试顺序是当天到场了才知道,我是上午第 2 个,面试完就可以闪人了~整个过程差不多 20mins英文自我介绍,2 分钟英文问答(好像是根据自我介绍问的)解释一下什么是语言模型抽题:数学类(求矩阵A的秩,带有参数,需要分类讨论)抽题:计算机基础类(一个程序运行在有 4 个 cpu 的计算机和只有 1 个 cpu 的计算机,是否前者比后者快4倍)抽题:编程类(三数之和,伪代码)抽综合类题,综合类题比较杂,可能包含计算或编程题,也有一些开放性题。闲聊:你是xxx大学的?你还面了哪些学校?(答挺多的,于是对面的学长笑了一下)你的那些面试都结束了吧?(我说下午还有浙大,老师还关心一句“那你来得急吗”,我说来得急hhhh)如果我们录取你,你会怎么选择?本来第一次线下面试会有点紧张,但氛围极好一点也不紧张。会先有志愿者领你到面试的地方。面试时对面大概 6/7 个人,一个老师专门负责英语,一个学长负责数学和编程,其他老师就是负责专业课或者其他综合性问题。面试完感觉还挺好的,最终 offer 了。我是挂在一个老师的名下,但实际上信科实验室的那个老师才是我的导师。第一年先在深圳学习,后两年待在北京科研,想想还是不错的。在一番思考过后,对直博还是有所犹豫,还是选择了 pku。南大计算机南大在报预推免之前联系了老师,然后跟学长聊过了几次,讲解过老师学生论文,说如果我通过南大,愿意给学硕。当时很大一部分是因为跟学长聊的不错,感觉实验室氛围会很好才想去南大的,不然已经没那么想去了。1min 左右英语自我介绍英语对话,介绍最喜欢的课程 (自我介绍时我说我是软件工程专业,老师问英文问题时,说我是计科专业…可见她没怎么听…)说一下软件测试,什么是白盒测试和黑盒测试,α 测试和 β 测试 (我的天,根本没准备过,第一个问题靠感觉答的,第二个问题当时根本不会)为什么有数据库范式,怎么判断不符合这些范式。。。等等 (第二个问题一直答得让老师不满意,我也不知道他到底要啥答案,也不给举例子…)介绍一个项目经历研究生期间周末要工作怎么看待三个老师,场子比较冷,一个负责主持和英语,两个负责问专业课。可以在自我介绍中提到一下自己强项课程,老师可能在后面问到。而且中间那个老师有严重的口音!他问的问题我都要让他重复好几遍我才听出来是啥!尴尬  ̄□ ̄面试完之后觉得挺凉的,不过也有一点开心,因为这样就不用鸽老师了。结果也确实一直没收到消息,学长也安慰我说没关系,以后可以去实验室实习哈哈。这里说一下南大 cs 专硕是没有宿舍的,身边挺多同学去了南大的。常见问题总结一下我在保研过程中遇到的一些问题,以及我的看法或解放方法。联系老师、鸽老师等模版参考一下这个仓库:https://github.com/yuezih/King-of-Pigeon一个老师问是否确定读xx学校,确定就捞你,但是你不一定去的情况要怎么回复在整个保研过程中,虽然学生和老师都会养鱼,但我还是会尽量坦诚相待。这时候我会表明自己很喜欢这个学校和老师,但是自己还报了 xx 学校 (比当前这所学校 title 好很多的比如报华五就说清北,报中九就说华五~),如果有机会入营并通过考核会有所斟酌。是否决定捞让老师自己决定。被问你还报了哪些学校?如果给你 offer 你会如何选择?在我有多个 offer 的时候,我只会说比当前学校 title 或实力低或者差不多的的学校,也或者我会说一些比当前学校要好的学校,但是解释说自己未来想在xxx地区发展,自己不是很想去那边等。同时联系多个老师好吗?老师不回邮件怎么办?联系好老师之后发现有更喜欢的老师怎么办?第一个问题虽然我没这么做过,但如果想尽快联系到一个老师,也不要联系同一个组的老师,有的老师会私下相互讨论。3 天不回可以考虑换其他实验室的老师。不过老师不回你邮件的话,联系同个组的应该也没事。最后一个问题我也遇到过,后来发现有更 的老师,我觉得我是会直接和原来的老师说研究方向感觉还是不合适之类的。毕竟读研还是要做自己喜欢的、合适的方向比较好,老师能理解。如何对比 offer 去哪个更好我的排序是:研究方向、导师 > 专硕/学硕/直博 > title > 地域、待遇。每个人排序不一样,一般从这几个方面去评判。提醒大家不要因为纯 title 耽误了自己的青春ENDING在 9.26 释放 thu 后,手里只剩一个 pku 的 offer 了,其实这里有点草率吧,感觉周围的同学都会留一个保底的 (留个保底比较好,万一呢)。而且在九推阶段上岸清北、捡漏 C9、华五完全有可能,可以填多几个学校再选择,何况今年很多学校还是穿了。今年的保研感觉比去年卷吧,很多人预推免都难以上岸,dalao 们人手几个 offer。最终身边的同学也都获得了理想的 offer,男朋友也去了北京 ~ 记得在计算机保研群里,9.28 就像新年一样,到点一群人一起喊“新年快乐”,不水群的我也发了一句 ,群友是真的很有意思。我认为想要通过初审,rk 是最重要的,尤其是报名人数多的学校,一个个筛选费时费力,直接看 rk 筛选是最暴力的。所以最重要的就是先保持成绩,然后就是各种项目或科研经历,最好是有完整的科研经历而且有产出,这样面试的时候大多数都会问你的科研成果就不问专业课啥的了。如果啥都没有也只能问专业课了对吧。有的同学会问如何平衡成绩和科研呢?我认为只能选择一个的时候,一定是成绩。在保持成绩前提下去拓展科研,不然营都入不了还保什么研 ‍。我身边也有同学科研做的十分出色,导师也愿意接收,但是最后没有拿到保研名额。而且到那个时候再准备考研也是不太可能了。还有很重要的就是六级,有见过一些同学的六级没过导致有些学校不能报,或者说导师不要的情况。总的来说,我的保研路还是很佛的,每次都压线复习,好在预推免有较好结果。对我帮助最大的经历就是在 top2 的实习,认识了导师和学长,学长也会给你许多建议,也能让你更了解导师和实验室的工作。所以大家有机会一定要试试去 top 实习,不管是学术类还是工程类的,都会给你的保研加很大的 buff。最后的最后,我要感谢这一路支持和帮助我的同学、学长学姐和老师。也祝愿未来的保研人保研成功,上岸梦校!————————————————版权声明:本文为CSDN博主「inicho」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_43280818/article/details/123450451
  • [问题求助] 鲲鹏性能分析插件部署完成后java性能分析无法点击在线分析
    【功能模块】【操作步骤&问题现象】1、部署完成鲲鹏性能分型插件2、Java性能分析添加了目标环境3、添加了ca证书并且重启了vscode4、点击在线分析和采样分析均不行并且还是弹出保存ca证书页面【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 鲲鹏性能分析插件部署完成后,java性能分析无法点击在线分析
    【功能模块】【操作步骤&问题现象】1、部署完成鲲鹏性能分型插件2、Java性能分析添加了目标环境3、添加了ca证书并且重启了vscode4、点击在线分析和采样分析均不行并且还是弹出保存ca证书页面【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 蔚来笔试(7.13)-转载
    一、前言首先是笔试形式:监考:单摄像头、手机扫码监考(只能使用内置计算器)题目:15道选择+3道编程要求:选择题期间不能离开页面,编程题可以使用自己的编译器,采用ACM模式。选择和编程分为两部分,答题结束后才能开始下一阶段,且不能再查看已提交部分。与上一次笔试了解到的信息差不多,选择题方向比较多,java、计网、线程、数学等等方面都有出到。还是以蒙为主,甚至还有求数学期望(乐,如果我在高三…但现在…三碗饭!)编程题方面难度一般,难点在于溢出和剪枝,在题干和解题方式上并没有为难。这里先说说溢出,其实打过几次比赛的朋友一定知道,溢出其实是很常见的坑,这里再给这次踩坑了的朋友们提个醒,看到没超时没报错却有很多点过不了的情况,别去算给的范围会不会溢出,先试着换个long,没准就过了。二、编程题注意:题目中的注释都是笔试结束后加的,可能有问题,大家参考即可。第一题题目: 给定一个矩阵,选出一个边长大于等于2的正方形,让它四个角之和最大。思路: 直接尝试三个循环遍历,变量为边长k、当前坐标(i,j),就能遍历所有可能的四个角的组合,暴力求最大即可。发现过了40%,考虑改成long即可(下面代码中使用了BigDecimal,使用long应该也是没问题的)。第一题也算用整整60%的点,给到一个思路——注意溢出。不过,要是一直没注意到溢出的话,三道题可能会丢掉差不多三分之一的分,个人感觉这么出题还是不太合理的。import java.math.BigDecimal;import java.util.*;public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int m = sc.nextInt();        int[][] num = new int[n][m];        //初始化数组        for(int i=0;i<n;i++){            for(int j=0;j<m;j++){                num[i][j] = sc.nextInt();            }        }        //记得题干中约束了m和n,此处不加大概也行        if(m<2||n<2){            System.out.println(0);            return;        }        BigDecimal ans = new BigDecimal(0);        int maxLength = Math.min(n,m);        //三层遍历:遍历所以四个角的组合        for(int k=1;k<maxLength;k++){            for(int i=0;i<n;i++){                //i+k>=n会越界,提前结束                if(i+k>=n) break;                for(int j=0;j<m;j++){                    //j+k>=m会越界,提前结束                    if(j+k>=m) break;                    //求和,求最大                    BigDecimal sum = new BigDecimal(0);                    sum = sum.add(new BigDecimal(num[i][j]));                    sum = sum.add(new BigDecimal(num[i][j+k]));                    sum = sum.add(new BigDecimal(num[i+k][j]));                    sum = sum.add(new BigDecimal(num[i+k][j+k]));                    if(sum.compareTo(ans)>0){                        ans = sum;                    }                }            }        }        System.out.println(ans);    }}第二题题目: 给定x,y,a,b四个数,用a乘x或y,找到让a等于b的最小次数,无结果输出-1。思路: 应该比较容易的就能拿到93%,剩下的7%要靠剪枝拿到。可以让a先乘x和y中大的那个,这样,得到的第一个结果一定是次数最小的。这样就可以排除剩下的结果,直接return即可。注意还是要用long。import java.util.*;public class Main {    static long ans = Integer.MAX_VALUE;    //flag:记录是否找到结果    static boolean flag = false;    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        long x = sc.nextInt(), y = sc.nextInt(), a = sc.nextInt(), b = sc.nextInt();        //让a先乘xy中较大的        if(x>=y){            fun(x, y, a, b, 0);        }else{            fun(y, x, a, b, 0);        }        if(ans==Integer.MAX_VALUE){            System.out.println(-1);        }else{            System.out.println(ans);        }    }    private static void fun(long x, long y, long a, long b, long num){        //flag为true,说明已经找到了结果,其他的情况可以直接排除        if(flag) return;        if(a>b){            return;        }        if(a==b){            //这一步多余,当时没有注意,直接ans = num就行。            ans = Math.min(ans, num);            //标记            flag = true;            return;        }        fun(x, y, a*x, b, num+1);        fun(x, y, a*y, b, num+1);    }}第三题题目: n个城市,每个城市包含距离x,快乐值y。小明想去任意个城市,找出一些城市,满足其中任意两个城市之间距离小于k,快乐值的和最大,输出快乐值和。思路: 这道题用滑动窗口,评论区有朋友问为什么用滑动窗口,个人感觉首先是从一个不确定范围中找目标值,并且左右边界的变化也是不确定的,大概就是要用滑动窗口吧,希望有明白的朋友能详细解答一下。整体思路就是先给二维数组按距离排序,窗口的边界差小于k,那么范围内任意两个距离的差一定也是小于k的。然后如果大于等于k了,左边界移动,小于k则移动右边界,继续扩大范围。在这个过程中随着边界改变记录范围内快乐值的总和,找到最大值。同样记得使用long。import java.util.*;public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt(), k = sc.nextInt();        int[][] num = new int[n][2];        for(int i=0;i<n;i++){            num[i][0] = sc.nextInt();            num[i][1] = sc.nextInt();        }        //按距离排序        Arrays.sort(num, new Comparator<int[]>() {            @Override            public int compare(int[] o1, int[] o2) {                return o1[0]-o2[0];            }        });//        for(int i=0;i<n;i++){//            System.out.println(num[i][0]+" "+num[i][1]);//        }        int L = 0, R = 0;        long sum = 0, ans = 0;        while(L<n&&R<n){            //差值大于等于k,该移动左边界缩小范围了            if(num[R][0]-num[L][0]>=k){                sum -= num[L][1];                L++;//                System.out.println("-="+L);                continue;            }            //差值小于k,继续扩大范围,寻找更大的结果            sum += num[R][1];//            System.out.println("+="+R);            ans = Math.max(ans, sum);            R++;        }        System.out.println(ans);    }}好了,这就是本此蔚来笔试的一些个人理解,以及三道编程题的解题思路,希望参加了面试的朋友能拿到面试机会,还没参加的朋友能有所收获。最后祝大家都能早日拿到心仪的offer~————————————————版权声明:本文为CSDN博主「OAOII」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/OAOII/article/details/125772091
  • [技术干货] Java线程池多线程查询数据库提高查询效率[转载]
    需求公司数据统计报表查询,几张大表关联查询,包含跨库查询,数据联查,数据过滤,数据统计。问题主表数据1    主表数据2    …    统计数据1    统计数据2    …数据    数据        数据    数据    报表结构是主表数据+统计数据,只查主表数据速度很快,统计数据需要跨库联查,且表数据量大,拖慢了速度。一开始的做法是,每次分页请求都先获取主表list,再foreach主表list,根据主表字段去查询统计数据并进行计算,再合并到主表进行返回,查询速度不理想。分页查响应时间=1次主表查询时间+10次统计数据查询时间思路复杂的报表数据统计不应全部由DB层面去解决,而是SQL仅负责数据过滤,返回统计所需的字段,SQL尽量简单高效,service层拿到DB返回的结果集,由代码层面去进行较为复杂的数据合并与统计。最总给到前端的是一个分页,那么优化的话是基于分页去进行,分页10条,线程池开启10个线程去并行查询,最总汇总返回给前端。分页查响应时间=1次主表查询时间+1次统计数据查询时间(10条中最慢的一条)代码线程池工具类package com.youxue.weliao.utils;import com.google.common.util.concurrent.ThreadFactoryBuilder;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.Future;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;/** * @Author lhy * @Date 2022/5/13 */@Slf4jpublic class ThreadUtil {    private volatile static ThreadUtil threadUtil;    private ThreadPoolExecutor executor;    /**     * 单例     */    private ThreadUtil() {    }    public static ThreadUtil getThreadUtilInstance() {        if (null == threadUtil) {            synchronized (ThreadUtil.class) {                if (null == threadUtil) {                    threadUtil = new ThreadUtil();                }            }        }        return threadUtil;    }    /**     * 提交任务     *     * @param task     */    public Future<?> submit(Runnable task) {        if (executor == null) {            // 初始化线程池            executor = initialize();        }        // 执行线程        return executor.submit(task);    }    /**     * 初始化线程池     *     * @return     */    private synchronized ThreadPoolExecutor initialize() {        ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 0L,            TimeUnit.MILLISECONDS,            new LinkedBlockingQueue<>(1024),            new ThreadFactoryBuilder()                .setNameFormat("task-admin-getlist--%d")                .build(),            new ThreadPoolExecutor.CallerRunsPolicy());        log.info("===================>ThreadUtil线程池初始化");        return executor;    }    /**     * 关闭线程池     */    public void shutdown() {        if (executor != null) {            executor.shutdown();        }    }}service层实际调用,这里我就不把全部业务代码放出来了,简化后如下    @Override    public IPage<ManageDto> getManageDto(IPage<ManageDto> page, String str, String end, List<Integer> taskAdminIds) {        // 主表查询        IPage<ManageDto> manageDtos = baseMapper.getManageDto(page, str, end, taskAdminIds);        if (manageDtos.getTotal() > 0) {            // 主表查询结果集            List<ManageDto> manageDtoList = manageDtos.getRecords();            // 异步线程Future集合            List<Future<?>> futures = new ArrayList<>();            for (ManageDto manageDto : manageDtoList) {                // 本页有几条数据便开启几条线程去进行统计数据查询                futures.add(ThreadUtil.getThreadUtilInstance().submit(() -> {                    // 统计数据查询                    List<ManageVo> manageVos = groupCyberArmyService.getManageVos(manageDto.getProcessAdminUserId(), manageDto.getTaskAdminId());                    // 业务逻辑运算后合并到主表Dto                }))            }            this.waitFinish(futures);            manageDtos.setRecords(manageDtoList);            return manageDtos;        }        return null;    }        /**     * 线程池内线程是否已全部执行结束     *      * @param futures 异步线程Future集合     */    @SneakyThrows    private void waitFinish(List<Future<?>> futures) {        for (Future<?> future : futures) {            future.get();        }    }解析future.get方法线程池线程是异步提交的,但是返回分页结果是需要同步返回,Future的get是个阻塞方法。只有所有的任务全部完成,我们才能用get按照任务的提交顺序依次返回结果,调用future.get()方法查看线程池内所有方法是否已执行完成,达到线程异步提交,结果集同步返回的效果。线程池工具类单例就不多解释了,这里用的是DCL单例,线程池根据自身需求配置核心线程等参数。————————————————版权声明:本文为CSDN博主「幸福往往是摸得透彻」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_43840809/article/details/124767908
  • [技术干货] 新手小白学JAVA 面向对象之多态[转载]
    1. 概念多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。比如,你的女盆友让你买点水果回来,不管买回来的是苹果还是西瓜,只要是水果就行,这个就是生活中多态的体现再比如,小猫、小狗、小猪我们可以把他们都归纳成小动物,每种小动物都需要吃东西,所以我们可以统一设置他们都必须吃,但是每种小动物的习性不一样,那这个就可以设置成小动物自己特有的功能,多态对象只能调用父类中定义子类中重写的功能,并不能调用子类的特有功能,这样就实现了代码的统一2 . 特点多态的前提1:是继承多态的前提2:要有方法的重写父类引用指向子类对象,如:Animal a = new Cat();多态中,编译看左边,运行看右边3. 练习:多态入门案例创建包: cn.tedu.oop创建类: TestDemo.javapackage cn.tedu.oop2;/*本类用作多态的入门案例*/public class TestDemo {    public static void main(String[] args) {        //6.创建“纯纯的”对象用于测试        Animal a = new Animal();        Cat c = new Cat();        Dog d = new Dog();        a.eat();//小动物Animal吃啥都行~调用的是父类自己的功能        c.eat();//小猫爱吃小鱼干~调用的是子类重写后的功能        d.eat();//小狗爱吃肉骨头~调用的是子类重写后的功能        /*2.父类对象不可以使用子类的特有功能*/        //a.jump();//报错,Animal类里并没有这个方法        //a.run();//报错,Animal类里并没有这个方法        c.jump();//小猫Cat跳的老高啦~,子类可以调用自己的功能        d.run();//小狗Dog跑的老快啦~,子类可以调用自己的功能        //7.创建多态对象进行测试        /*3.口诀1:父类引用指向子类对象        * 解释:创建出来的子类对象的地址值,交给父类类型的引用类型变量来保存*/        Animal a2 = new Cat();//Cat类对象的地址值交给父类型变量a2来保存        Animal a3 = new Dog();//Dog类对象的地址值交给父类型变量a3来保存        //8.测试多态对象        /*4.口诀2:编译看左边,运行看右边        * 解释:必须要在父类定义这个方法,才能通过编译,把多态对象看作是父类类型        *      必须要在子类重写这个方法,才能满足多态,实际干活的是子类*/        a2.eat();//小猫爱吃小鱼干~,多态对象使用的是父类的定义,子类的方法体    }}/*1.多态的前提:继承+重写*///1.创建父类class Animal{    //3.创建父类的普通方法    public void eat(){        System.out.println("小动物Animal吃啥都行~");    }}//2.1创建子类1class Cat extends Animal{    //4.1添加重写的方法    public void eat(){        System.out.println("小猫爱吃小鱼干~");    }    //5.1添加子类的特有功能    public void jump(){        System.out.println("小猫Cat跳的老高啦~");    }}//2.2创建子类2class Dog extends Animal{    //4.2添加重写的方法    @Override    public void eat(){        System.out.println("小狗爱吃肉骨头~");    }    //5.2添加子类的特有功能    public void run(){        System.out.println("小狗Dog跑的老快啦~");    }}4. 多态的好处多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法提高了程序的可扩展性和可维护性5. 多态的使用前提:多态对象把自己看做是父类类型成员变量: 使用的是父类的成员方法: 由于存在重写现象,所以使用的是子类的静态成员: 随着类的加载而加载,谁调用就返回谁的6. 练习:多态成员使用测试创建包: cn.tedu.oop创建类: TestDemo2.javapackage cn.tedu.oop2;/*本类用于测试多态成员的使用情况*/public class TestDemo2 {    public static void main(String[] args) {        //7.创建纯纯的子类对象        Dog2 d = new Dog2();        System.out.println(d.sum);//20,子类自己的属性        d.eat();//小狗爱吃肉包子,子类自己的方法        //8.创建多态对象        /*口诀1:父类引用指向子类对象*/        /*口诀2:编译(保存)看左边,运行(效果)看右边*/        Animal2 a = new Dog2();        /*多态中,成员变量使用的是父类的*/        System.out.println(a.sum);//10        /*多态中,方法的声明使用的是父类的,方法体使用的是子类的*/        a.eat();//小狗爱吃肉包子        /*多态中,调用的静态方法是父类的,因为多态对象把自己看作是父类类型        * 直接使用父类中的静态资源*/        a.play();//没有提示,玩啥都行~        Animal2.play();    }}//1.创建父类class Animal2{    //3.创建父类的成员变量    int sum = 10;    //4.创建父类的普通方法    public void eat(){        System.out.println("吃啥都行~");    }    //9.1定义父类的静态方法play    public static void play(){        System.out.println("玩啥都行~");    }}//2.创建子类class Dog2 extends Animal2{    //5.定义子类的成员变量    int sum = 20;    //6.重写父类的方法    @Override    public void eat(){        System.out.println("小狗爱吃肉包子");    }    //9.2创建子类的静态方法play    //@Override    /*这不是一个重写的方法,只是恰巧在两个类中出现了一模一样的两个静态方法    * 静态方法属于类资源,只有一份,不存在重写的现象    * 在哪个类里定义,就作为哪个类的资源使用*/    public static void play(){        System.out.println("小狗喜欢玩皮球~");    }}7 拓展7.1 设计汽车综合案例创建包: cn.tedu.oopexec创建类: DesignCar.javapackage cn.tedu.oop2;/*本类用于完成汽车设计案例*/public class DesignCar {    public static void main(String[] args) {        //9.创建一个纯纯的父类对象进行测试        Car c = new Car();        System.out.println(c.getColor());//null        c.start();        c.stop();        //c.swim();//报错,父类对象不可以调用子类的特有功能        //10.创建纯纯的子类对象做测试        BMW b = new BMW();        System.out.println(b.color);//五彩斑斓的黑        System.out.println(b.getColor());//null        b.start();//都让开,我的车要起飞啦~        b.stop();//唉呀妈呀熄火了~        //11.创建多态对象进行测试        Car c2 = new TSL();        //System.out.println(c2.color);        System.out.println(c2.getColor());        c2.stop();        c2.start();        //c2.swim();    }}//1.通过分析,抽象形成一个汽车类class Car{    //2.定义并封装汽车类的属性--成员变量    private String brand;//品牌    private String color;//颜色    private int id;//编号    private double price;//价格    //3.定义功能    public void start(){        System.out.println("我的小车车启动啦~");    }    public void stop(){        System.out.println("唉呀妈呀熄火了~");    }    public String getBrand() {        return brand;    }    public void setBrand(String brand) {        this.brand = brand;    }    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }}//4.创建子类class BMW extends Car{    String color = "五彩斑斓的黑";    //5.重写父类的方法    @Override    public void start(){        System.out.println("都让开,我的车要起飞啦~");    }}//6.创建子类2class TSL extends Car{    //7.重写父类的方法    @Override    public void stop(){        System.out.println("唉呀妈,怎么停不下来呢");    }    //8.添加子类的特有功能    public void swim(){        System.out.println("没想到吧,我还是个潜水艇");    }}7.2 多态为了统一调用标准package cn.tedu.oop2;public class TestFruit {    public static void main(String[] args) {        Fruit f = new Fruit();        Apple a = new Apple();        Orange o = new Orange();        get(f);        get(a);        get(o);    }    //只需要创建一个方法,就可以执行截然不同的效果    //忽略子类对象的差异统一看作父类类型    public static void get(Fruit f){        f.clean();    }}class Fruit{    public void clean(){        System.out.println("水果要洗洗再吃");    }}class Apple extends Fruit{    @Override    public void clean(){        System.out.println("苹果需要削皮");    }}class Orange extends Fruit{    @Override    public void clean(){        System.out.println("橙子需要剥皮");    }}7.3 静态变量和实例变量的区别在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。7.4 向上转型和向下转型在JAVA中,继承是一个重要的特征,通过extends关键字,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。那么在这个过程中就存在着多态的应用。存在着两种转型方式,分别是:向上转型和向下转型。向上转型:可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。比如:父类Parent,子类Child父类的引用指向子类对象:Parent p=new Child();说明:向上转型时,子类对象当成父类对象,只能调用父类的功能,如果子类重写了父类中声明过的方法,方法体执行的就是子类重过后的功能。但是此时对象是把自己看做是父类类型的,所以其他资源使用的还是父类型的。比如:花木兰替父从军,大家都把花木兰看做她爸,但是实际从军的是花木兰,而且,花木兰只能做她爸能做的事,在军营里是不可以化妆的。向下转型(较少):子类的引用的指向子类对象,过程中必须要采取到强制转型。这个是之前向上造型过的子类对象仍然想执行子类的特有功能,所以需要重新恢复成子类对象Parent p = new Child();//向上转型,此时,p是Parent类型Child c = (Child)p;//此时,把Parent类型的p转成小类型Child其实,相当于创建了一个子类对象一样,可以用父类的,也可以用自己的说明:向下转型时,是为了方便使用子类的特殊方法,也就是说当子类方法做了功能拓展,就可以直接使用子类功能。比如:花木兰打仗结束,就不需要再看做是她爸了,就可以”对镜贴花黄”了————————————————版权声明:本文为CSDN博主「程序媛 泡泡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_43884234/article/details/116593803
  • [业务动态] 关于《GaussDB入门级开发者认证-Java》等3个开发者认证正式上线通知
    尊敬的客户:您好!为帮助您深入了解华为云产品,探索新的技术场景,我们非常高兴地与您分享一个好消息:为了更好地服务千万开发者,华为云推出开发者认证,真正让开发者在云上作业,懂开发会开发,与开发者共成长。由华为资深研发团队精心打磨,潜心研发的《GaussDB入门级开发者认证-Java》、《华为云云原生工作级开发者认证-基础设施》、《数据仓库工作级开发者认证》于2022年6月30日正式上线!届时请进入华为云开发者学堂-开发者认证查看产品详情,体验使用,我们非常期待您的宝贵建议。以下为该开发者认证详情,您可提前了解:产品名称: 《GaussDB入门级开发者认证-Java》适合人群: 高校学生、开发工程师等;培训方案: 基础技能+综合实践,培训华为云云数据库服务能力及技能;技术能力: 掌握数据库原理、数据库SQL语言、基于高斯数据库的Java编程实操及云上开发实践能力;认证价值: 通过理论结合实践,使软件开发相关从业者具备数据库基础的理论知识和实操能力。产品名称: 《华为云云原生工作级开发者认证-基础设施》适合人群: 开发工程师、运维工程师、架构师等;培训方案: 云原生关键基础设施能力及华为云相关服务的增强特性;技术能力: 熟练掌握应用容器化改造、服务网格、多集群等云原生核心基础设施理论及云上实践能力 ;认证价值: 通过理论结合实践,使云原生相关从业者深入理解关键理论提升工作场景下的实践能力。产品名称: 《数据仓库工作级开发者认证》适合人群: 数仓工程师、架构师、数仓平台开发和管理人员、对数仓技术感兴趣的爱好者;培训方案: 通过对GaussDB(DWS)的深入解析完成对数据仓库的开发运维及数据分析实践;技术能力: 掌握GaussDB(DWS)的数据库设计、SQL开发与优化、应用开发、安全设计、集群及运维管理能力;认证价值: 通过理论结合实践,使GaussDB(DWS)从业者具备数据库开发运维和数据分析能力。届时我们还将开展相关开发者认证上新活动,详情请关注华为云开发者学堂论坛-热门活动 相关通知。发布日期:2022年6月30日
  • [使用说明] CodeArts常见问题
    Java SmartAssist开发套件常用设置      语言服务启动成功后,设置弹窗中会出现Java SmartAssist开发套件的设置,即语言服务相关的所有设置,包含Java功能相关的设置、Maven及Gradle相关的设置和Validation设置。Maven相关设置1.什么是Bundled(Maven 3)?       Maven home默认版本为Bundled(Maven 3),即CodeArts预安装的Maven,版本为3.6.3,同时会兼容maven2。2.如何修改Maven home?       Maven home配置中,您可以选择自带的Bundled Maven版本或已解析的系统变量(如MAVEN_HOME),也可以指定安装在计算机上的其他Maven版本。同时,CodeArts还支持手动输入目录或点击browse按钮并在打开的对话框中选择所需的目录。3.如何指定User settings file?       用户特定配置的文件,默认读取%HomePath%/.m2目录下的settings.xml文件。如果您需要指定另一个文件,请手动输入文件目录或点击browse按钮并在打开的对话框中选择所需的文件。4.如何指定Local repository?       Local repository默认的本地仓库路径为%HomePath%/.m2/repository,该目录存储下载配置文件。如果您需要指定另一个目录,请手动输入目录或点击browse按钮并在打开的对话框中选择所需的路径。5.如何设置Maven SDK?        默认为Project JDK,您可以点击下拉框选择其它版本的JDK(CodeArts会自动识别本地已安装的JDK)。6.Work offline的作用是什么?        如果选中此复选框,Maven 将在离线模式下工作,并且仅使用本地可用的资源。7.Print exception stack trace的作用是什么?        如果选中此复选框,则会生成异常堆栈跟踪。8.Use plugin registry的作用是什么?        如果选中此复选框,以启用对 Maven 的插件注册表的引用。9.Excute goals recursively的作用是什么?        如果选中此复选框,则将构建递归到嵌套项目中。Gradle相关设置1.什么是Gradle User Home?        Gradle User Home 用于存储全局配置属性和初始化脚本以及缓存、日志文件等。默认设置路径为%HomePath%/.gradle。2.可以修改Gradle User Home吗?        可以通过以下方式之一覆盖默认路径:您可以设置GRADLE_USER_HOME环境变量(例如,%APPDATA%/.gradle)。变量的值是自动获取的,新路径自动显示在Gradle User Home设置里。您可以手动指定位置:手动输入目录或点击browse按钮并在打开的对话框中选择所需的目录。3.如何设置Gradle SDK?        默认为Project JDK,您可以点击下拉框选择其它版本的JDK(CodeArts会自动识别本地已安装的JDK)。其他语言服务相关设置1.Project SDK默认是哪个版本?        如果JDK已安装在您的计算机上,项目初始化时,默认选择最高的JDK版本。2.Language level是什么?        Language level定义了编辑器提供的编码辅助功能。Language level可以与Project SDK 不同。例如,您可以使用 JDK 11并将Language level设置为 8。这使得字节码与 Java 8 兼容,同时检查确保您不使用 Java 11 中的constructs。CodeArts运行和调试常见问题1.如何在运行主类main方法前配置更多的运行参数?        CodeArts支持配置更多的运行参数来调试程序,点击右上角调试工具栏default选择Edit,在属性对话框中添加和修改,目前已支持配置主类、命令行参数、环境变量、JVM配置参数及缩短运行命令行配置,将来我们会有更多的支持。2.如何启动多个调试?        CodeArts暂不支持并行运行和调试,新启动一个调试的时候会提示是否结束已启动的调试进程并启动当前的调试。Maven下载依赖代理问题1、CodeArts设置的代理和Maven的settings.xml中的代理相比,哪个优先级更高?        CodeArts设置的代理优先级更高。Maven的settings.xml中的代理配置如下图:2、如果下载依赖,报407状态码错误,该如何处理?        当代理设置在配置文件settings.xml中时,需要在settings.xml中配置username和password。        当代理设置在CodeArts的设置项中时,在设置中搜索proxy,找到proxy Username和proxy Password设置项,并进行相应的配置。 Gradle下载依赖代理问题1、下载Gradle的zip包时怎么配置代理?        在CodeArts设置中配置代理即可。Gradle工程自动下载gradle/wrapper/gradle-wrapper.properties文件的distributionUrl的zip包,需要提前配置好CodeArts设置代理2、CodeArts设置的代理和Gradle的gradle.properties中的代理相比,哪个优先级更高?       CodeArts设置的代理优先级更高。Gradle的gradle.properties中的填写代理信息,如下图:CodeArts登录激活CodeArts登录激活会走CodeArts代理配置吗?当CodeArts设置配置代理时,在登录激活时会生效。华为云API开发常见问题1、如何解决证书问题?       在使用华为云API开发时,遇到如下报错时,即为jdk证书问题引起。解决办法:1>代码中忽略ssl校验        参考代码:        HttpConfig config = HttpConfig.getDefaultHttpConfig();        config.withIgnoreSSLVerification(true);2>jdk导入代理服务器证书或者代理服务器的所有父级证书       方法步骤(以华为证书为例):       (1)、请用windows自带的cmd窗口,且使用管理员方式       (2)、安装命令:cd /d %JAVA_HOME%\jre\lib\security curl https://cmc-szver-artifactory.cmc.tools.huawei.com/artifactory/CMC-Release/certificates/HuaweiITRootCA.cer -o HuaweiITRootCA.cer curl https://cmc-szver-artifactory.cmc.tools.huawei.com/artifactory/CMC-Release/certificates/HWITEnterpriseCA1.cer -o HWITEnterpriseCA1.cer keytool -keystore cacerts -importcert -alias HuaweiITRootCA -file HuaweiITRootCA.cer -storepass changeit -noprompt keytool -keystore cacerts -importcert -alias HWITEnterpriseCA1 -file HWITEnterpriseCA1.cer -storepass changeit -noprompt(3)、检验:         声明:findstr命令执行后会有返回值cd /d %JAVA_HOME%\jre\lib\security keytool -list -V  -keystore cacerts -storepass changeit | findstr /n  huaweiitrootca keytool -list -V  -keystore cacerts -storepass changeit | findstr /n  hwitenterpriseca1(4)、清楚冗余:del  HuaweiITRootCA.cer del  HWITEnterpriseCA1.cer2、如何使用临时AK/SK调用华为云API        在使用华为云API开发时,华为云API插件提供的补全模板往往是使用永久AK/SK进行调用,代码如下:        如果使用临时AK/SK,相比于永久AK/SK多一个x-security-token参数,我们只需要在创建credentials的时候使用withSecurityToken()方法即可,参考如下代码:
  • [技术干货] 我们与Java的不解之缘---Java27岁生日快乐[转载]
    前言:直至今日,距离Java语言的产生以及有27年了。也许我们陪伴Java的时间可能仅有三四年,甚至仅有一两年,但是她在我们心中的地位是至高无上的。从第一个“hello world”开始,我们就与Java结下了不解之缘,这也意味着我们要与她“结伴一生”。因此,在Java这个特殊的27岁,小威将与各位小伙伴儿一起经历Java的发展之路以及今后对Java的学习。在这里,先谢谢各位小伙伴儿的支持了嘿嘿文章目录Java语言的特点Java语言的发展史Java框架及云原生个人用Java做过的小项目Java语言的特点Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。简单性:Java语言继承了C++语言的优点,去掉了C++中学习起来比较难的多继承、指针等概念,所以Java语言学习起来更简单,使用起来也更方便。面向对象:Java是一种面向对象的编程语言。分布性:Java设计成支持在网络上应用,它是分布式语言。所以只要用Java编写了一个程序,就可以到处应用。可以节省大量人力物力。编译和解释性:Java编译程序生成字节码,而不是通常的机器码,这使得Java开发程序比用其他语言开发程序快很多。稳健性:Java刚开始被设计出来就是为了写高可靠和稳健的软件的。所以用Java写可靠的软件很容易。目前许多第三方交易系统、银行平台的前台和后台电子交易系统等都会用Java语言开发。安全性:Java的存储分配模型是它防御恶意代码的主要方法之一。所以很多大型企业级项目开发都会选择用Java开发。可移植性:Java并不依赖平台,用Java编写的程序可以运用到任何操作系统上。高性能:Java是一种先编译后解释的语言,所以它不如全编译性语言快。但Java设计者制作了“及时”编译程序,这样就可以实现全编译了。多线索性:Java是多线索语言,它可以同时执行多个程序,能处理不同任务。动态性:Java语言设计成适应于变化的环境,它是一个动态的语言。Java语言的发展史1995年,Sun公司推出了Java,但只是一种语言,还没有一个强大的开发类库;1996年,第一个JDK1.0的发布(包括运行环境JRE和开发环境JDK);1997年2月,SUN公司紧接着推出了JDK 1.1;1998年12月8日,JDK1.2——第二代Java平台的企业版J2EE发布;1999年6月,Java第二代平台2.0发布,并且Sun公司把Java体系分为三个方向:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器;注意:Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及。2000年5月,JDK1.3、JDK1.4和J2SE1.3相继发布,都大幅度的提高了Java的性能;2002年2月26日,J2SE1.4发布;2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0;2005年6月,在Java One大会上,Sun公司发布了Java SE 6。此时,Java的各种版本已经更名,已取消其中的数字2(Java6最经典,流传最久的版本)。如下所示:J2EE更名为JavaEEJ2SE更名为JavaSEJ2ME更名为JavaME2009年,Oracle收购Sun公司,每半年更新一次;2014年,JavaSE8.0发布,企业级开发。Java框架及云原生随着Java的发展,开发Java程序也变得越来越简单,Java框架也慢慢地流行了起来。我们学了Java基础,就要开始Java框架的学习了。那么,Java的框架主要有哪些呢?Java框架主要有:轻量级且开源的Spring,WEB界面SpringMVC,数据库持久化的MyBatis,SpringBoot,SpringCloud,jQuery,Netty,Log4j,Quartz,Redis,RabbitMQ等等。学过了Java基础的小伙伴儿们可以开始Java框架的学习了。下面介绍一下云原生Java和云原生有着很密集的联系,以后我们Java工程师也会朝着云原生发展。云原生是基于分布部署和统一运管的分布式云,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系。云原生应用也就是面向“云”而设计的应用,在使用云原生技术后,开发者无需考虑底层的技术实现,可以充分发挥云平台的弹性和分布式优势,实现快速部署、按需伸缩、不停机交付等。个人用Java做过的小项目在之前的Java学习中,自己大一的时候也曾做过几个小项目和小游戏,之前做完了保存了下来,今天就来分享给大家。用Map集合写的考试系统package java小项目;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Random;import java.util.Scanner;import java.util.Set;public class 考试系统 {    public static void main(String[] args) {        // TODO 自动生成的方法存根        ArrayList <String>arr=new ArrayList<>();        ArrayList <Integer>arrl=new ArrayList();//存题号用,防止有重复题        String [][] a=new String[10][6];        HashMap <Integer,String>hm=new HashMap<>();                hm.put(0,"公共厕所()一国家首都:\n"+"A:美国\n"+"B:英国\n"+"C:中国\n"+"D:伦敦");        arr.add("D");        hm.put(1,"用什么拖地最干净:\n"+"A:拖把\n" +"B:扫帚\n"+"C:铲斗\n"+"D:用力");        arr.add("D");        hm.put(2,"老王的头发已经掉光了,为什么还一直去理发?\n"+"A:他有洁癖\n"+"B:他是理发师\n"+"C:他讲究男人的风度\n"+"D:他好久没洗头了");        arr.add("B");        hm.put(3,"失败为成功之母,那么成功为失败的什么?\n"+"A:之父\n" +"B:反义词\n"+"C:之儿\n"+"D:之母");        arr.add("B");        hm.put(4,"小白加小白等于什么?\n"+"A:小白俩\n" +"B:俩小白\n"+"C:大灰狼\n"+"D:小白兔");        arr.add("D");        hm.put(5,"历史上那个人物跑得最快?\n"+"A:曹操\n" +"B:刘备\n"+"C:诸葛亮\n"+"D:关羽");        arr.add("A");                hm.put(6,"蚊子咬在什么地方你不会觉得痒?\n"+"A:脚上\n" +"B:腿毛上\n"+"C:别人身上\n"+"D:背上");        arr.add("C");                hm.put(7,"汽车在右转弯时,哪个轮胎不转?\n"+"A:前轮胎\n" +"B:后轮胎\n"+"C:左轮胎\n"+"D:备用轮胎");        arr.add("D");        hm.put(8,"什么光会给人们带来痛苦?\n"+"A:黑光\n" +"B:暗光\n"+"C:强光\n"+"D:耳光");        arr.add("D");        hm.put(9,"什么情况下人会有两双眼睛?\n"+"A:睡觉的时候\n" +"B:变异的时候\n"+"C:两个人的时候\n"+"D:吃饭的时候");        arr.add("C");        int daxunhuan=0;        int kaoshi=0;//考试结束条件        while(daxunhuan!=999){        System.out.println("--------------------------------------");        System.out.println("单选题:");        System.out.println("--------------------------------------");        System.out.println("1:考试;      2:试题管理;      3:退出。");        System.out.println("     (请输入操作的代码1,2或3)"   );        Random r=new Random();        Scanner s=new Scanner(System.in);        int c=s.nextInt();        switch(c){        case 1:while(kaoshi!=888){            System.out.println("请问要答几道题");//要答e道题            int e=s.nextInt();            double f=100.0/e;//f为每一道题占多少分            int g=r.nextInt(10);            arrl.add(g);            for(int i=1;i<e;i++){                int h=r.nextInt(10);                if(arrl.contains(h)){                    i--;                }                else{                    arrl.add(h);                }                            }            int j=1;//j记录题号            int x=0;//x表示正确的题数,y反之            int y=0;            double sum=0;                for(Integer it:arrl){                    System.out.println("第"+j+"题");                    System.out.println(hm.get(it));                    System.out.println("请输入您的答案:");                    String str=s.next();                    j++;                    if(str.equals(arr.get(it))){                        sum+=f;                        x++;                        System.out.println("恭喜你,这道题答对了!");                    }                    else{                        y++;                        System.out.println("很抱歉,这道题你答错了!");                    }                }                System.out.println("您的得分是:"+sum);                System.out.println("正确的有"+x+"道");                System.out.println("错误的有"+y+"道");                if(sum>=60){                    System.out.println("恭喜你,成绩合格,请问还想继续答题吗?");                }                else{                    System.out.println("别学了,重开吧!");                }                System.out.println("-------------------------------");                System.out.println("若想退出考试请输入888,不想退出输入其他字符");                int k=s.nextInt();                kaoshi=k;                System.out.println("若想退出用户操作界面请输入999,若不想请随意输入");                int kk=s.nextInt();                daxunhuan=kk;                if(kk==999){                    System.out.println("您已成功退出用户操作界面!");                }            }        break;        case 2:System.out.println("-------------------------------");        System.out.println("试题管理:");        System.out.println("11,添加试题;  22,删除试题;  33,修改试题;  44,查找试题;  55,遍历试题。");        System.out.println("请输入您想操作的编号");        int l=s.nextInt();        switch(l){          case 11:System.out.println("请问您想添加几道题");        int m=s.nextInt();        int n=arr.size();        for(int w=n;w<=m+n-1;w++){            System.out.println("请添加题目:");                        String str=s.next();            hm.put(w, str);            System.out.println("请添加本题答案:");            String str2=s.next();            arr.add(str2);        }        System.out.println("您的题目已增加完毕");            break;         case 22:  System.out.println("请问要删除第几道题?");         int tishu=arr.size();         int p=s.nextInt();         arr.remove(p-1);         System.out.println("已删除答案!");         hm.remove(p-1);         for(int i=p;i<tishu;i++){             String str1=hm.get(i);                        hm.put(i-1, str1);              }         System.out.println("-------------------------------");         System.out.println("已删除试题!");         break;         case 33:System.out.println("-------------------------------");         System.out.println("请问要修改第几道题?");         int xiugai=s.nextInt();         System.out.println("-------------------------------");         System.out.println("您选择修改第"+xiugai+"道题,请修改题目:");         String str=s.next();         hm.put(xiugai-1, str);         System.out.println("题目修改完毕");         System.out.println("===============================");         System.out.println("请修改答案");         String str3=s.next();         arr.set(xiugai-1, str3);         System.out.println("答案修改完毕!");         break;         case 44:System.out.println("请问要查询第几题?");         int z=s.nextInt();         System.out.println("该题题目为:");         System.out.println(hm.get(z-1));         System.out.println("该题答案为:");                  System.out.println(arr.get(z-1));         System.out.println("-------------------------------");        break;         case 55:int jj=0;             Set set=hm.entrySet();         Iterator it =set.iterator();         while(it.hasNext()){             Map.Entry me=(Map.Entry)(it.next());             int ii=(int) (me.getKey());            jj=ii+1;             System.out.println("第"+jj+"题题目:");             System.out.println(me.getValue());             System.out.println("第"+jj+"题答案:");             System.out.println(arr.get(ii));             System.out.println("-------------------------------");         }         break;         default : daxunhuan=999;         System.out.println("您的输入有错误,已退出,请重开!");         break;        }//5选1括号        break;        case 3:System.out.println("若想退出请输入999");            int xx=s.nextInt();             daxunhuan=xx;             System.out.println("您已退出!");             break;               }//3选一括号            }//daxunhuan括号                }        }文章到这里就结束了,如果文章有什么需要改进的地方,还请大佬指正制作不用,感谢各位小伙伴儿们的支持小威在这里谢谢大家✨✨✨最后,各位陪伴了Java多少年了呢,可以在评论区里互相交流哟————————————————版权声明:本文为CSDN博主「小威要向诸佬学习呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_53847859/article/details/125012673
  • [其他] 浅谈python和java的区别
    1、java的商业化公司支持多,如sap,oracle,ibm等,有商业化的容器,中间件,企业框架ejb。python的开源组织支持多,如qt,linux,google,很多开源程序都支持python, 如pyqt,redis,spark等。2、java主要用于商业逻辑强的领域,如商城系统,erp,oa,金融,保险等传统数据库事务领域,通过类似ssh框架事务代码,对商业数据库,如oralce,db2,sql server等支持较好,软件工程理念较强,适合软件工程式的多人开发模式。python主要用于web数据分析,科学计算,金融分析,信号分析,图像算法,数学计算,统计分析,算法建模,服务器运维,自动化操作,快速开发理念强,适合快速开发团队或个人敏捷模式。3、python有很多虚拟机实现,如cython,Pyston,pypy,jython, IronPython等等,适合用于业务语言,或插件语言,或面向领域语言,而java因为虚拟机巨大,很少用于插件语言,发布也不方便。4、python虚拟机没有java强,java虚拟机是java的核心,python的核心是可以很方便地使用c语言函数或c++库。5、python是全动态性的,可以在运行时自己修改自己的代码,java只能通过变通方法实现。python的变量是动态的,而java的变量是静态的,需要事先声明,所以java ide的代码提示功能优于python ide。6,python的产生几十年了,几十年前面向过程是主流,所以用python有好多程序用的是面向过程设计方法,很多概念从c语言过来的,class在python中是后加入的,而java是为了实现没有指针的c++(当年com组件用的引用记数,java用的虚拟机),主要采用面向对象的设计方法,很多概念是oop的概念。面向过程,相对简洁直观,但容易设计出面条程序,面向对象,相对抽象优雅,但容易过度抽象。7,在实际使用的python入门简单,但要学会用python干活,需要再学习python各种库,pyhton的强大在于库,为什么python的库强大,原因是python的库可以用python,c语言,c++等设计,再提供给python使用,所以无论gpu运行,神经网络,智能算法,数据分析,图像处理,科学计算,各式各样的库在等着你用。而java没有python那么多的开源库,很多库是商业公司内部使用,或发布出来只是一个jar包,看不到原始代码。python虚拟机因为编译性没有java的支持的好(或者说故意这么设计的),一般直接使用源码(linux),或源码简单打个包(如pyexe)。实例:在java类中直接执行python语句如:maven添加依赖<dependency>    <groupId>org.python</groupId>    <artifactId>jython-standalone</artifactId>    <version>2.7.0</version></dependency>在java类中写python语句PythonInterpreter interpreter = new PythonInterpreter();interpreter.exec("menu=[1,2,3,5,6,7]; ");interpreter.exec("print(sorted(menu));"); interpreter.exec("print sorted(menu);");
  • [技术干货] Java,自从看了你一眼,就再也无法忘怀[转载]
    文章目录一、初识Java二、我与Java差点擦肩而过三、我的第一个Java项目四、我用过的开发工具五、Java经久不衰的关键总结转眼间Java已经27岁了,Java在1995年5月23日诞生,诞生之后在到现在以经27年了,但依旧保持旺盛的活力,那是因为Java语言作为静态面向对象编程语言的代表,极好的实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程,Java具有简单性,面向对象,分布式,健壮性,安全性,平台独立与可移植性,多线程,动态性等特点,总的来说,Java是一门非常方便的语言,只要你能想到的方法,都有大佬已经帮你写好了,非常的方便,我相信Java在后续的发展中,一定会越来越好,我自己本身也是一个大学生,学习的也是Java语言,未来也会在Java这个领域一直干下去一、初识Java我首次接触Java的时候还是在我大学的时候第一节JavaSE课程,我们的Java老师给我们介绍Java的产生和发展,我对Java产生了憧憬,在课后敲下了我的第一行Java代码:public class Main {    public static void main(String[] args) {    System.out.println("hello world!!!");    }}我相信大部分的Java生涯都是从这行代码开始的,这是我Java生涯的起点,也是我和Java的故事的起点二、我与Java差点擦肩而过我现在是一名大三的学生,不准备考研的我当然是准备学习一门专业知识,出社会后找到一个满意的工作,对于我的专业来说,计算机科学与技术的学生,从事编程工作无非就是C/C++,Java,还有python,我就在考虑我到时候到底从事哪个领域,我在Java和C++ 中犹豫了很久,最终选择了Java,既然选择了它,我就要认真的对待它,毕竟我可是一个很专一的人,但是在我Java相处的时间里,开始的相处,我对它还不是很熟悉,我完全看不明白它,在一段时间里,我甚至觉得我和它不合适,我和它的在一起就是一个错误,但是再后来我发现之前是因为我不够了解它,在我和Java后面的陆续相处中,我发现Java非常的有意思,你越了解它越觉得它有意思三、我的第一个Java项目我的第一个Java项目,是一个很简单的命令行实现的图书管理系统,就这么一个很简单的小项目对于当时的我来说就觉得非常的困难,但是当你真的完成了它的时候,那种成就感是任何事情都带不来的,这个项目几乎包含了JavaSE基础语法部分,这也是对基础知识的一个检验四、我用过的开发工具在我上大学时的Java课上,我们的Java老师给我们推荐的是一款叫eclipse的软件,这也是我第一次使用开发工具,在当时连安装JDK,搭建环境对我来说都还是一个难题,我也是在这个开发工具上敲的我的第一行Java代码,后来在朋友的推荐下,我使用了IDEA这款开发工具,这款工具相对于eclipse来说要好用很多,非常的方便,而JDK,我一直使用的是JDK8五、Java经久不衰的关键1.无处不在、免费Java是免费下载和简单易用的,因此它对有远见卓识的开发人员和企业很有吸引力,而且可能只花很少的预算。因为Java无处不在,所以很容易向你的CTO或客户销售可靠、无风险的产品。开发人员和项目团队可以找到并指出许多基于Java的站点示例,以减轻高级管理人员或客户的担忧。想学习java的同学不妨报个Java培训班,可以节省学习时间,提高学习效率,在短时间内学有所成,还能找到一份不错的工作。2.平等机会申请Java编程语言支持分布式环境、internet使用和将在具有多个服务器和客户端的网络上运行的应用程序。它可以用于网站、移动应用程序、智能设备等,在小程序或应用程序模块中也同样有效。它适用于网络浏览器、在线商店、投票和论坛、表单处理、手机应用程序和消费产品。总结我的Java学习之路还很漫长,后面要学习的东西还很多,在后续我也会一直从事Java领域,希望Java会一直越来越好。原文链接:https://blog.csdn.net/weixin_57011679/article/details/124946316
  • [毕昇JDK] 【技术剖析】14. Java反射机制清空字符串导致业务异常分析
    > 编者按:笔者在处理业务线问题时遇到接口返回的内容和实际内容不一致的现象。根因是业务方通过Java反射机制将String类型敏感数据引用的value数组元素全部设置为'0',从而实现清空用户敏感数据的功能。这种清空用户敏感数据的方法会将字符串常量池相应地址的内容修改,进而导致所有指向该地址的引用的内容和实际值不一致的现象。 ## 背景知识 JVM为了提高性能和减少内存开销,在实例化字符串常量时进行了优化。JVM在Java堆上开辟了一个字符串常量池空间(StringTable),JVM通过ldc指令加载字符串常量时会调用 StringTable::intern 函数将字符串加入到字符串常量池中。 - StringTable::intern函数代码 ```c oop StringTable::intern(Handle string_or_null, jchar* name, int len, TRAPS) { unsigned int hashValue = hash_string(name, len); int index = the_table()->hash_to_index(hashValue); oop found_string = the_table()->lookup(index, name, len, hashValue); // Found if (found_string != NULL) { ensure_string_alive(found_string); return found_string; } debug_only(StableMemoryChecker smc(name, len * sizeof(name[0]))); assert(!Universe::heap()->is_in_reserved(name), "proposed name of symbol must be stable"); Handle string; // try to reuse the string if possible if (!string_or_null.is_null()) { string = string_or_null; } else { string = java_lang_String::create_from_unicode(name, len, CHECK_NULL); } #if INCLUDE_ALL_GCS if (G1StringDedup::is_enabled()) { // Deduplicate the string before it is interned. Note that we should never // deduplicate a string after it has been interned. Doing so will counteract // compiler optimizations done on e.g. interned string literals. G1StringDedup::deduplicate(string()); } #endif // Grab the StringTable_lock before getting the_table() because it could // change at safepoint. oop added_or_found; { MutexLocker ml(StringTable_lock, THREAD); // Otherwise, add to symbol to table added_or_found = the_table()->basic_add(index, string, name, len, hashValue, CHECK_NULL); } ensure_string_alive(added_or_found); return added_or_found; } ``` - StringTable::intern 函数处理流程 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/20/1655693680014556176.png) - 字符串的创建方式 根据StringTable::intern函数处理流程,我们可以简单描绘如下6种常见的字符串的创建方式以及引用关系。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/20/1655693721592211530.png) ## 现象 某业务线使用fastjson实现Java对象序列化功能,低概率出现接口返回的JSON数据的某个属性值和实际值不一致的现象。正确的属性值应该为"null",实际属性值却为"0000"。 ## 原因分析 为了排除fastjson自身的嫌疑,我们将其替换jackson后,依然会低概率出现同样的现象。由于两个不同三方件同时存在这个问题的可能性不大,为此我们暂时排除fastjson引入该问题的可能性。为了找到该问题的根因,我们在环境中开启远程调试功能。待问题复现,调试代码时我们发现只要是指向"null"的引用,显示的内容全部变成"0000",由此我们初步怀疑字符串常量池中的"null"被修改成"0000"。 一般导致常量池被修改有两种可能性: 1. 第三方动态库引入的bug导致字符串常量池内容被修改; 2. 在业务代码中通过Java反射机制主动修改字符串常量池内容; 业务方排查项目中使用到的第三方动态库,未发现可疑的动态库,排除第一种可能性。排查业务代码中使用到Java反射的功能,发现清空密码功能会使用到Java反射机制,并且将String类型密码的value数组元素全部设置为'0'。 业务出现的现象可以简单通过代码模拟: 1. 在TestString对象类中定义一个nullStr属性,初始值为"null"; 2. 定义一个带有password属性的User类; 3. 在main方法中创建一个密码为"null"的User对象,使用Java反射机制将密码字符串的所有字符全部修改为'0',分别在密码修改前后打印TestString对象nullStr属性值; ## 复现代码 ```java import java.lang.reflect.Field; import java.util.Arrays; public class TestString { private String nullStr = "null"; public String getNullStr() { return nullStr; } static class User { private final String password; User(String password) { this.password = password; } public String getPassword() { return password; } } private static void clearPassword(User user) throws Exception { Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] chars = (char[]) field.get(user.getPassword()); Arrays.fill(chars, '0'); } public static void main(String[] args) throws Exception { User user = new User("null"); TestString testString = new TestString(); System.out.println("before clear password >>>>"); System.out.println(" User.password:" + user.getPassword()); System.out.println("TestString.nullStr:" + testString.getNullStr()); System.out.println("--------------------------------"); clearPassword(user); System.out.println("after clear password >>>>"); System.out.println(" User.password:" + user.getPassword()); System.out.println("TestString.nullStr:" + testString.getNullStr()); } } ``` 复现代码字符串引用关系如下图所示。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/20/1655693744310705244.png) User对象的password属性和TestString的nullStr属性引用都同时指向常量池中的"null"字符串,"null"字符串的value指向 {'n','u','l','l'} char数组。使用Java反射机制将User对象的password属性引用的value数组全部设置为'0',导致 TestString的nullStr属性值也变成了 "0000"。 输出结果如下: ``` before clear password >>>> User.password:null TestString.nullStr:null -------------------------------- after clear password >>>> User.password:0000 TestString.nullStr:0000 ``` 通过输出结果我们可以发现在通过Java反射机制修改某一个字符串内容后,所有指向原字符串的引用的内容全部变成修改后的内容。 ## 总结 在保存业务敏感数据时避免使用String类型保存,建议使用byte[]或char[]数组保存,然后通过Java反射机制清空敏感数据。 ## 后记 如果遇到相关技术问题(包括不限于毕昇 JDK),可以通过 Compiler SIG 求助。Compiler SIG 每双周周二举行技术例会,同时有一个技术交流群讨论 GCC、LLVM 和 JDK 等相关编译技术,感兴趣的同学可以添加如下微信小助手入群。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/20/1655693821688262524.jpg) ----- 原文转载自毕昇编译-[Java反射机制清空字符串导致业务异常分析](https://mp.weixin.qq.com/s/jLkof6Z1MMzBJ7eODV0pWQ) 关注毕昇编译获取编译技术更多信息 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/20/1655693932992153146.jpg)
  • [技术干货] 这是啥SQL,室友看了人傻了[转载]
    文章目录SQLite适应常规基本应用场景SQLite面对复杂场景尚有不足SPL全面支持各种数据源SPL的计算能力更强大优化体系结构SPL资料可以在Java应用中嵌入的数据引擎看起来比较丰富,但其实并不容易选择。Redis计算能力很差,只适合简单查询的场景。Spark架构复杂沉重,部署维护很是麻烦。H2\HSQLDB\Derby等内嵌数据库倒是架构简单,但计算能力又不足,连基本的窗口函数都不支持。相比之下,SQLite在架构性和计算能力上取得了较好的平衡,是应用较广的Java嵌入数据引擎。SQLite适应常规基本应用场景SQLite架构简单,其核心虽然是C语言开发的,但封装得比较好,对外呈现为一个小巧的Jar包,能方便地集成在Java应用中。SQLite提供了JDBC接口,可以被Java调用:Connection connection = DriverManager.getConnection("jdbc:sqlite::memory:");Statement st = connection.createStatement();st.execute("restore from d:/ex1");ResultSet rs = st.executeQuery("SELECT * FROM orders");1234SQLite提供了标准的SQL语法,常规的数据处理和计算都没有问题。特别地,SQLite已经能支持窗口函数,可以方便地实现很多组内运算,计算能力比其他内嵌数据库更强。SELECT x, y, row_number() OVER (ORDER BY y) AS row_number FROM t0 ORDER BY x;SELECT a, b, group_concat(b, '.') OVER ( ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS group_concat FROM t1;12SQLite面对复杂场景尚有不足SQLite的优点亮眼,但对于复杂应用场景时还是有些缺点。Java应用可能处理的数据源多种多样,比如csv文件、RDB、Excel、Restful,但SQLite只处理了简单情况,即对csv等文本文件提供了直接可用的命令行加载程序:.import --csv --skip 1 --schema temp /Users/scudata/somedata.csv tab1对于其他大部分数据源,SQLite都没有提供方便的接口,只能硬写代码加载数据,需要多次调用命令行,整个过程很繁琐,时效性也差。以加载RDB数据源为例,一般的做法是先用Java执行命令行,把RDB库表转为csv;再用JDBC访问SQLite,创建表结构;之后用Java执行命令行,将csv文件导入SQLite;最后为新表建索引,以提高性能。这个方法比较死板,如果想灵活定义表结构和表名,或通过计算确定加载的数据,代码就更难写了。类似地,对于其他数据源,SQLite也不能直接加载,同样要通过繁琐地转换过程才可以。SQL接近自然语言,学习门槛低,容易实现简单的计算,但不擅长复杂的计算,比如复杂的集合计算、有序计算、关联计算、多步骤计算。SQLite采用SQL语句做计算,SQL优点和缺点都会继承下来,勉强实现这些复杂计算的话,代码会显得繁琐难懂。比如,某只股票最长的上涨天数,SQL要这样写:select max(continuousDays)-1from (select count(*) continuousDaysfrom (select sum(changeSign) over(order by tradeDate) unRiseDaysfrom (select tradeDate,case when price>lag(price) over(order by tradeDate) then 0 else 1 end changeSign from AAPL) )group by unRiseDays)123456这也不单是SQLite的难题,事实上,由于集合化不彻底、缺乏序号、缺乏对象引用等原因,其他SQL数据库也不擅长这些运算。业务逻辑由结构化数据计算和流程控制组成,SQLite支持SQL,具有结构化数据计算能力,但SQLite没有提供存储过程,不具备独立的流程控制能力,也就不能实现一般的业务逻辑,通常要利用Java主程序的判断和循环语句。由于Java没有专业的结构化数据对象来承载SQLite数据表和记录,转换过程麻烦,处理过程不畅,开发效率不高。前面提过,SQLite内核是C程序,虽然可以被集成到Java应用中,但并不能和Java无缝集成,和Java主程序交换数据时要经过耗时的转换才能完成,在涉及数据量较大或交互频繁时性能就会明显不足。同样因为内核是C程序,SQLite会在一定程度上破坏Java架构的一致性和健壮性。对于Java应用来讲,原生在JVM上的esProc SPL是更好的选择。SPL全面支持各种数据源esProc SPL是JVM下开源的嵌入数据引擎,架构简单,可直接加载数据源,可以通过JDBC接口被Java集成调用,并方便地进行后续计算。SPL架构简单,无须独立服务,只要引入SPL的Jar包,就可以部署在Java环境中。直接加载数据源,代码简短,过程简单,时效性强。比如加载Oracle:A1    =connect("orcl")2    =A1.query@x("select OrderID,Client,SellerID,OrderDate,Amount from orders order by OrderID")3    >env(orders,A2)对于SQLite擅长加载的csv文件,SPL也可以直接加载,使用内置函数而不是外部命令行,稳定且效率高,代码更简短:=T(“/Users/scudata/somedata.csv”)多种外部数据源。除了RDB和csv,SPL还直接支持txt\xls等文件,MongoDB、Hadoop、redis、ElasticSearch、Kafka、Cassandra等NoSQL,以及WebService XML、Restful Json等多层数据。比如,将HDSF里的文件加载到内存:A1    =hdfs_open(;"hdfs://192.168.0.8:9000")2    =hdfs_file(A1,"/user/Orders.csv":"GBK")3    =A2.cursor@t()4    =hdfs_close(A1)5    >env(orders,A4)    JDBC接口可以方便地集成。加载的数据量一般比较大,通常在应用的初始阶段运行一次,只须将上面的加载过程存为SPL脚本文件,在Java中以存储过程的形式引用脚本文件名:Class.forName("com.esproc.jdbc.InternalDriver");Connection conn =DriverManager.getConnection("jdbc:esproc:local://");CallableStatement statement = conn.prepareCall("{call init()}");statement.execute();1234SPL的计算能力更强大SPL提供了丰富的计算函数,可以轻松实现日常计算。SPL支持多种高级语法,大量的日期函数和字符串函数,很多用SQL难以表达的计算,用SPL都可以轻松实现,包括复杂的有序计算、集合计算、分步计算、关联计算,以及带流程控制的业务逻辑。丰富的计算函数。SPL可以轻松实现各类日常计算:A    B1    =Orders.find(arg_OrderIDList)    //多键值查找2    =Orders.select(Amount>1000 && like(Client,\"*S*\"))    //模糊查询3    = Orders.sort(Client,-Amount)    //排序4    = Orders.id(Client)    //去重5    =join(Orders:O,SellerId; Employees:E,EId).new(O.OrderID, O.Client,O.Amount,E.Name,E.Gender,E.Dept)    //关联标准SQL语法。SPL也提供了SQL-92标准的语法,比如分组汇总:$select year(OrderDate) y,month(OrderDate) m, sum(Amount) s,count(1) cfrom {Orders}Where Amount&gt;=? and Amount&lt;? ;arg1,arg2123函数选项、层次参数等方便的语法。功能相似的函数可以共用一个函数名,只用函数选项区分差别,比SQL更加灵活方便。比如select函数的基本功能是过滤,如果只过滤出符合条件的第1条记录,可使用选项@1:T.select@1(Amount>1000)二分法排序,即对有序数据用二分法进行快速过滤,使用@b:T.select@b(Amount>1000)有序分组,即对分组字段有序的数据,将相邻且字段值相同的记录分为一组,使用@b:T.groups@b(Client;sum(Amount))函数选项还可以组合搭配,比如:Orders.select@1b(Amount>1000)结构化运算函数的参数有些很复杂,比如SQL就需要用各种关键字把一条语句的参数分隔成多个组,但这会动用很多关键字,也使语句结构不统一。SPL使用层次参数简化了复杂参数的表达,即通过分号、逗号、冒号自高而低将参数分为三层:join(Orders:o,SellerId ; Employees:e,EId)更丰富的日期和字符串函数。除了常见函数,比如日期增减、截取字符串,SPL还提供了更丰富的日期和字符串函数,在数量和功能上远远超过了SQL,同样运算时代码更短。比如:季度增减:elapse@q(“2020-02-27”,-3) //返回2019-05-27N个工作日之后的日期:workday(date(“2022-01-01”),25) //返回2022-02-04字符串类函数,判断是否全为数字:isdigit(“12345”) //返回true取子串前面的字符串:substr@l(“abCDcdef”,“cd”) //返回abCD按竖线拆成字符串数组:“aa|bb|cc”.split(“|”) //返回[“aa”,“bb”,“cc”]SPL还支持年份增减、求季度、按正则表达式拆分字符串、拆出SQL的where或select部分、拆出单词、按标记拆HTML等大量函数。简化有序运算。涉及跨行的有序运算,通常都有一定的难度,比如比上期和同期比。SPL使用"字段[相对位置]"引用跨行的数据,可显著简化代码,还可以自动处理数组越界等特殊情况,比SQL窗口函数更加方便。比如,追加一个计算列rate,计算每条订单的金额增长率:=T.derive(AMOUNT/AMOUNT[-1]-1: rate)综合运用位置表达式和有序函数,很多SQL难以实现的有序运算,都可以用SPL轻松解决。比如,根据考勤表,找出连续 4 周每天均出勤达 7 小时的学生:A1    =Student.select(DURATION>=7).derive(pdate@w(ATTDATE):w)2    =A1.group@o(SID;~.groups@o(W;count(~):CNT).select(CNT==7).group@i(W-W[-1]!=7).max(~.len()):weeks)3    =A2.select(weeks>=4).(SID)简化集合运算,SPL的集合化更加彻底,配合灵活的语法和强大的集合函数,可大幅简化复杂的集合计算。比如,在各部门找出比本部门平均年龄小的员工:A1    =Employees.group(DEPT; (a=~.avg(age(BIRTHDAY)),~.select(age(BIRTHDAY)<a)):YOUNG)2    =A1.conj(YOUNG)计算某支股票最长的连续上涨天数:A1    =a=0,AAPL.max(a=if(price>price[-1],a+1,0))简化关联计算。SPL支持对象引用的形式表达关联,可以通过点号直观地访问关联表,避免使用JOIN导致的混乱繁琐,尤其适合复杂的多层关联和自关联。比如,根据员工表计算女经理的男员工:=employees.select(gender:“male”,dept.manager.gender:“female”)方便的分步计算,SPL集合化更加彻底,可以用变量方便地表达集合,适合多步骤计算,SQL要用嵌套表达的运算,用SPL可以更轻松实现。比如,找出销售额累计占到一半的前n个大客户,并按销售额从大到小排序:A    B2    =sales.sort(amount:-1)    /销售额逆序排序,可在SQL中完成3    =A2.cumulate(amount)    /计算累计序列4    =A3.m(-1)/2    /最后的累计即总额5    =A3.pselect(~>=A4)    /超过一半的位置6    =A2(to(A5))    /按位置取值流程控制语法。SPL提供了流程控制语句,配合内置的结构化数据对象,可以方便地实现各类业务逻辑。分支判断语句:A    B2    …    3    if T.AMOUNT>10000    =T.BONUS=T.AMOUNT*0.054    else if T.AMOUNT>=5000 && T.AMOUNT<10000    =T.BONUS=T.AMOUNT*0.035    else if T.AMOUNT>=2000 && T.AMOUNT<5000    =T.BONUS=T.AMOUNT*0.02循环语句:A    B1    =db=connect("db")    2    =T=db.query@x("select * from sales where SellerID=? order by OrderDate",9)3    for T    =A3.BONUS=A3.BONUS+A3.AMOUNT*0.014        =A3.CLIENT=CONCAT(LEFT(A3.CLIENT,4), " co.,ltd.")5         …与Java的循环类似,SPL还可用break关键字跳出(中断)当前循环体,或用next关键字跳过(忽略)本轮循环,不展开说了。计算性能更好。在内存计算方面,除了常规的主键和索引外,SPL还提供了很多高性能的数据结构和算法支持,比大多数使用SQL的内存数据库性能好得多,且占用内存更少,比如预关联技术、并行计算、指针式复用。优化体系结构SPL支持JDBC接口,代码可外置于Java,耦合性更低,也可内置于Java,调用更简单。SPL支持解释执行和热切换,代码方便移植和管理运营,支持内外存混合计算。外置代码耦合性低。SPL代码可外置于Java,通过文件名被调用,既不依赖数据库,也不依赖Java,业务逻辑和前端代码天然解耦。对于较短的计算,也可以像SQLite那样合并成一句,写在Java代码中:Class.forName("com.esproc.jdbc.InternalDriver");Connection conn =DriverManager.getConnection("jdbc:esproc:local://");Statement statement = conn.createStatement();String arg1="1000";String arg2="2000"ResultSet result = statement.executeQuery(=Orders.select(Amount>="+arg1+" && Amount<"+arg2+"). groups(year(OrderDate):y,month(OrderDate):m; sum(Amount):s,count(1):c)");123456解释执行和热切换。业务逻辑数量多,复杂度高,变化是常态。良好的系统构架,应该有能力应对变化的业务逻辑。SPL是基于Java的解释型语言,无须编译就能执行,脚本修改后立即生效,支持不停机的热切换,适合应对变化的业务逻辑。方便代码移植。SPL通过数据源名从数据库取数,如果需要移植,只要改动配置文件中的数据源配置信息,而不必修改SPL代码。SPL支持动态数据源,可通过参数或宏切换不同的数据库,从而进行更方便的移植。为了进一步增强可移植性,SPL还提供了与具体数据库无关的标准SQL语法,使用sqltranslate函数可将标准SQL转为主流方言SQL,仍然通过query函数执行。方便管理运营。由于支持库外计算,代码可被第三方工具管理,方便团队协作;SPL脚本可以按文件目录进行存放,方便灵活,管理成本低;SPL对数据库的权限要求类似Java,不影响数据安全。内外存混合计算。有些数据太大,无法放入内存,但又要与内存表共同计算,这种情况可利用SPL实现内外存混合计算。比如,主表orders已加载到内存,大明细表orderdetail是文本文件,下面进行主表和明细表的关联计算:A1    =file("orderdetail.txt").cursor@t()2    =orders.cursor()3    =join(A1:detail,orderid ; A2:main,orderid)4    =A3.groups(year(main.orderdate):y; sum(detail.amount):s)SQLite使用简单方便,但数据源加载繁琐,计算能力不足。SPL架构也非常简单,并直接支持更多数据源。SPL计算能力强大,提供了丰富的计算函数,可以轻松实现SQL不擅长的复杂计算。SPL还提供多种优化体系结构的手段,代码既可外置也可内置于Java,支持解释执行和热切换,方便移植和管理运营,并支持内外存混合计算。原文链接:https://blog.csdn.net/m0_60264772/article/details/125273709
总条数:2301 到第 页
上滑加载中