-
2020年末,华为云为开发者送福利来了!认证成为华为云开发者,开启个人技能画像,点亮开发者勋章,多重好礼等你来拿。已开启Java、Python、前端开发、API、低代码开发、敏捷教练六个通道,哪个才是你的菜,是你未来的方向。赶快来测一测吧!获奖情况将于12月15日在论坛公布,请持续关注。【活动时间】活动已结束(11月11日-12月15日)【活动内容】活动整体分三个阶段进行,认证成为华为云开发者后,专属福利逐级开启。 学习礼——争当开发者,不做尾款人 开启时间:11月11日 认证通过点亮专属勋章,开启个人技能画像。勋章查看地址:https://devcloud.huaweicloud.com/expert/assessment/skill获得会员中心200码豆,限量240000码豆,先到先得,发完即止。每个ID限领一次。码豆查看地址:https://devcloud.huaweicloud.com/bonususer/home/converge邀请5人以上(含5人)参加测评,将获得知识大礼包一份。同时获得抽奖资格,有机会获得50元京东卡和锦鲤大奖。测评完成后参与主题帖活动,还有机会获得时尚卫衣、电动牙刷等精美礼品。详情请点击链接参加:学习周 ——争当开发者,不做尾款人 抢兑礼——感恩回馈,限时兑换 开启时间:11月17日认证通过后,即可开启会员中心开发者专区优惠购资格,参与1码豆抢兑、5折/8折码豆优惠购,数量有限,先到先得。活动详情请点击:https://bbs.huaweicloud.com/forum/thread-87785-1-1.html测评完成后参与主题帖活动,还有机会获得时尚卫衣、机械键盘等精美礼品。详情请点击链接参加:抢兑周—— 感恩回馈,限时兑换更多活动信息和礼品详情,扫码可知。狂欢礼——大奖来袭,谁是锦鲤 开启时间:11月29日邀请5人以上(含5人)参与评测获得抽奖资格,将抽取幸运奖和锦鲤大奖。邀请人数统计截止于12月10日,12月14日结果公示,12月15日获奖公布。测评完成后参与主题帖活动,还有机会获得时尚卫衣、移动快充等精美礼品。详情请点击链接参加:狂欢周——大奖来袭,谁是锦鲤 (即将开启,敬请期待)【参与方式】根据自己的特长,选择下方任一测评题目,参与评测并认证通过即可参与。API测评通道Java测评通道Python测评通道前端开发测评通道低代码开发测评通道敏捷教练测评通道【活动说明】1.本次活动为华为云开发者身份测评认证,参与者首先要注册成为华为云用户,才能参与本次活动。2.活动期间,每位开发者可以多次参与答题,分数以最高成绩为准。3.每个华为云账号只能被邀请一次。4.本次活动所有回帖内容需满足华为云论坛发帖规范:https://bbs.huaweicloud.com/forum/thread-23077-1-1.html5.不得使用各类非正常渠道或方式注册账号参与,违者取消活动参与及获奖资格;获奖人收件信息与实名信息不一致者或获奖人从未参与过测评,亦不予发奖。5.获奖情况的公示和获奖通知后续会在论坛发出,请关注本帖。6.所有获奖礼品将于12月30日前寄出。7.如您在测评活动中遇到相关问题,可点击下方链接反馈,请于12月15日24时前反馈,过期反馈视为无效,望周知。 反馈链接>>8.华为云开发者生态DevCloud专家服务团队对本活动规则有最终解释权。
-
2020年末,华为云为开发者送福利来了!认证成为华为云开发者,开启个人技能画像,点亮开发者勋章,多重好礼等你来拿。已开启Java、Python、前端开发、API、低代码开发、敏捷教练等多个通道,哪个才是你的菜,是你未来的方向。赶快来测一测吧!【活动时间】2020年11月11日-2020年12月10日【活动内容】活动整体分三个阶段进行,认证成为华为云开发者后,专属福利逐级开启。 学习礼——争当开发者,不做尾款人 开启时间:11月11日 认证通过点亮专属勋章,开启个人技能画像。勋章查看地址:https://devcloud.huaweicloud.com/expert/assessment/skill获得会员中心200码豆,限量240000码豆,先到先得,发完即止。每个ID限领一次。码豆查看地址:https://devcloud.huaweicloud.com/bonususer/home/converge邀请5人以上(含5人)参加测评,将获得知识大礼包一份。同时获得抽奖资格,有机会获得50元京东卡和锦鲤大奖。测评完成后参与主题帖活动,还有机会获得时尚卫衣、电动牙刷等精美礼品。详情请点击链接参加:学习周 ——争当开发者,不做尾款人 抢兑礼——感恩回馈,限时兑换 开启时间:11月17日测评完成后参与主题帖活动,还有机会获得时尚卫衣、机械键盘等精美礼品。详情请点击链接参加:抢兑周—— 感恩回馈,限时兑换狂欢礼——大奖来袭,谁是锦鲤 开启时间:11月29日邀请5人以上(含5人)参与评测获得抽奖资格,将抽取幸运奖和锦鲤大奖。邀请点亮勋章人数排行榜的前3名获得排行奖,限量大狮运动套装、数码套装和京东卡200元奖励。测评完成后参与主题帖活动,还有机会获得时尚卫衣、移动快充等精美礼品。 活动详情请点击链接查看:狂欢周——大奖来袭,谁是锦鲤 当前论坛集赞和邀请排行榜请点击查看:排名帖链接。【参与方式】可以点击测评通道链接或者 扫描下方二维码参与测评【邀请好友方法】生成邀请链接和邀请好友参加方法如下:第一步:完成问卷填写,并提交。第二步:在问卷结束页,点击下面那个黄色按钮“邀请好友答卷 免费领取 知识大礼包”第三步:点击之后,会提示你需要在浏览器中打开分享页面,请点击右上角“...”按钮,选择“在浏览器打开”第四步:在浏览器中打开会显示如下页面,保存您的专属海报图片,分享出去即可,只要有朋友也答卷完成,即可获得相应的礼品和抽奖资格。后续也可以再打开此页面,查看你的邀请进度(页面最下方)。【活动说明】1.本次活动为华为云开发者身份测评认证,参与者首先要注册成为华为云用户,才能参与本次活动。2.活动期间,每位开发者可以多次参与答题,分数以最高成绩为准。3.每个华为云账号只能被邀请一次。4.本次活动所有回帖内容需满足华为云论坛发帖规范:https://bbs.huaweicloud.com/forum/thread-23077-1-1.html5.不得使用各类非正常渠道或方式注册账号参与,违者取消活动参与及获奖资格;获奖人收件信息与实名信息不一致者或获奖人从未参与过测评,亦不予发奖。5.获奖情况的公示和获奖通知后续会在论坛发出,请关注本帖。6.所有获奖礼品将于12月30日前寄出。7.如您在测评活动中遇到相关问题,可点击下方链接反馈,请于12月15日24时前反馈,过期反馈视为无效,望周知。 反馈链接>>
-
1 调优概述华为鲲鹏性能优化工具是一款针对鲲鹏平台的性能调优工具,包含系统性能优化工具和Java性能优化工具。本文使用Java性能优化工具对运行中的Java程序进行了基于Profiling的GC和内存分析、结合Sampling分析,找到程序问题,并根据分析结果进行优化修改,从而实现Java程序最佳运行。2 环境要求项目说明服务器TaiShan 200 服务器(型号2280)CPU鲲鹏920 4826处理器OSCentOS 7.6应用Java应用程序性能分析工具Hyper Tuner 2.2.T2.SPC1003 前提条件1. 服务器和操作系统正常运行。2. PC端已经安装SSH远程登录工具3. 需要优化的Java程序4 调优思路1、 检查Java程序的基础参数;2、 使用Java性能优化工具对Java进程进行GC分析以及内存分析;3、 使用Java性能优化工具对Java进程进行Sampling分析4、 针对性能的瓶颈点进行性能优化;5、 观察优化后的Java程序,判断性能是否提升5 调优过程5.1 检查Java程序的基础参数步骤1 登录Java性能优化工具步骤2 创建Guardian (说明:部署的需要优化的Java进程的服务器)步骤3 启动Profiling分析获取到的Java程序的基础参数如下图:只配置最大堆大小可继续通过工具其他功能分析5.2 查看Profiling概览概览分析:通过概览功能页面查看Java进程发现内存占用很高、GC活动也频繁5.3 查看Profiling GC步骤1 点击页面上方的【GC】页签步骤2 查看GC的活动详情GC分析:发现在几分钟内多次出现old GC,后续old GC频繁old GC 频繁的原因分析:5.4 查看Profiling内存转储该Java进程的内存在old GC之后回收的内存较少,且频繁GC,继续使用工具其他功能分析步骤1 页面上方的【内存转储】页签步骤2 等待执行内存转储的结果内存转储分析:下图为内存转储的【直方图】,展示了Java进程中堆内存分配,可以发现第一行的Object[] 与其他数据的浅堆大小不在一个数量级,此时需要结合支配树继续分析 支配树分析:下图中的第一行非常直观的可以发现该ScheduleTask类的浅堆大小占据了整个堆的98.27%,继续查看该类的下级支配数据,最终发现该类支配了大量的Object[]类,Object[]类下支配最多的即Student类5.5 优化 Java程序分析:通过上述四步骤的Profiling分析,可以发现堆内存被大量的ScheduleTask类支配的Student类所占据,因此回归Java程序本身发现该ScheduleTask类是一个作为缓存功能的类,自己检视代码发现该类使用的HashMap作为缓存对象,在构建代码时忽略了缓存的过期时间,导致历史的数据一直在该缓存对象中导致内存泄露,GC无法回收对象。优化: 优化代码,加入缓存过期策略;5.6 优化后的 Java程序优化后的程序通过概览页即可发现内存使用正常、GC活动正常6 实践总结本次实践中,对一Java程序进行了性能分析,通过Profiling GC分析和内存转储分析发现了程序中的内存泄漏点,进而优化程序中的内存泄漏点达到优化程序性能的目的,解决了程序中内存持续占满且频繁old GC的问题。在进行其他程序调优时,需要根据华为鲲鹏性能优化工具采集分析的实际结果和对应的优化建议进行调优操作。具体的调优思路可以参考本次实践。
-
2020-11-04:java里,总体说一下集合框架。#福大大架构师每日一题#
-
请教一个问题,需要华为专业的帮助:我要遍历所有桶名,直接用官方提供obs的API代码,复制粘贴,然后直接运行就报错。错误是在huaweicloud-sdk-dotnet-obs-master源代码里抛出的。需要说明的是:这个.net版本的代码,在连接了互联网的机器上能够正常执行,是不会报错的。但是,由于我们的内网服务器不能连接互联网,是通过专线IPsec来实现对华为云的连接(在此条件下用obs客户端可以连接上并能正常操作云上的对象),并且用obs的java版本的代码也是可以正常执行。但是用obs的.net版本的程序执行却会报错!百思不得其解。报错情况,如下图:我调用执行的API代码,如下图:
-
一、创建项目1.点击菜单栏File->New->Project...2.从左边栏找到Java,例如我这里是Java Enterprise(每个人的可能不一样,因为IDE版本可能不同),然后选择project SDK,没有的话点击Download JDK...,有的话点击Add JDK...3. Download JDK是这个界面,Vendor我这里选择Oracle OpenJDK(各位可以根据需要选择),Version是版本,Location是位置4.下载或者添加之后,点击Next,这里可以选择Specification和Implementation,大家根据需要选择,我这里直接Next5.创建项目和名称二、编写代码1.项目结构如下2.我们打开src的main,右键点击main里的java,选择New->Package,输入包的名字,我这里是Hello3.新建一个class,输入名字,我这里是Hello4.输入代码package Hello; public class Hello { public static void main(String []args){ System.out.println("Hello!"); } }
-
2020-10-30 10:48:28.386 WARN 23931 --- [pool-5-thread-1] c.o.s.internal.RestStorageService : com.obs.services.internal.ServiceException: Request Error: java.net.UnknownHostException: bc5d5fe30c3f4da0ac355a56add071d5.obs.cn-north-4.myhuaweicloud.com: Temporary failure in name resolution PUT 'http://bc5d5fe30c3f4da0ac355a56add071d5.obs.cn-north-4.myhuaweicloud.com/' on Host 'bc5d5fe30c3f4da0ac355a56add071d5.obs.cn-north-4.myhuaweicloud.com'com.obs.services.internal.ServiceException: Request Error: java.net.UnknownHostException: bc5d5fe30c3f4da0ac355a56add071d5.obs.cn-north-4.myhuaweicloud.com: Temporary failure in name resolutionat com.obs.services.internal.RestStorageService.handleThrowable(RestStorageService.java:274) ~[esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.internal.RestStorageService.performRequest(RestStorageService.java:812) ~[esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.internal.RestStorageService.performRestPut(RestStorageService.java:998) ~[esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.internal.RestStorageService.performRestPut(RestStorageService.java:987) ~[esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.internal.ObsService.createBucketImpl(ObsService.java:1483) ~[esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.ObsClient.access$200(ObsClient.java:211) [esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.ObsClient$1.action(ObsClient.java:758) [esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.ObsClient$1.action(ObsClient.java:751) [esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.ObsClient.doActionWithResult(ObsClient.java:3929) [esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.ObsClient.createBucket(ObsClient.java:750) [esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.ObsClient.createBucket(ObsClient.java:738) [esdk-obs-java-3.20.6.1.jar!/:na]at com.obs.services.ObsClient.createBucket(ObsClient.java:708) [esdk-obs-java-3.20.6.1.jar!/:na]at com.pcl.service.obs.OBSFileService.createBucketName(OBSFileService.java:94) [classes!/:0.0.1-SNAPSHOT]at com.pcl.service.obs.OBSFileService.unZipFileToMinio(OBSFileService.java:865) [classes!/:0.0.1-SNAPSHOT]at com.pcl.service.DataSetService$2.run(DataSetService.java:670) [classes!/:0.0.1-SNAPSHOT]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]Caused by: java.net.UnknownHostException: bc5d5fe30c3f4da0ac355a56add071d5.obs.cn-north-4.myhuaweicloud.com: Temporary failure in name resolutionat java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) ~[na:1.8.0_161]at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) ~[na:1.8.0_161]at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) ~[na:1.8.0_161]at java.net.InetAddress.getAllByName0(InetAddress.java:1276) ~[na:1.8.0_161]at java.net.InetAddress.getAllByName(InetAddress.java:1192) ~[na:1.8.0_161]at java.net.InetAddress.getAllByName(InetAddress.java:1126) ~[na:1.8.0_161]at okhttp3.Dns$1.lookup(Dns.java:39) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:170) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java:136) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.connection.RouteSelector.next(RouteSelector.java:81) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:171) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) ~[okhttp-3.7.0.jar!/:na]at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) ~[okhttp-3.7.0.jar!/:na]at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185) ~[okhttp-3.7.0.jar!/:na]at okhttp3.RealCall.execute(RealCall.java:69) ~[okhttp-3.7.0.jar!/:na]at com.obs.services.internal.RestStorageService.performRequest(RestStorageService.java:634) ~[esdk-obs-java-3.20.6.1.jar!/:na]
-
这里中断的意思是:访问cse的时候报“Failed to create SSL connection”2020-09-17 02:17:53.370 | [vert.x-eventloop-thread-11] | ERROR | o.a.s.t.rest.client.http.RestClientInvocation | Failed to send request, local:not connected, remote:/10.31.31.29:20001.io.vertx.core.http.impl.NoStackTraceTimeoutException: The timeout period of 5000ms has been exceeded while executing POST /mgmt/v2/queryUserConfigs for server 10.31.31.29:200012020-09-17 02:17:53.374 | [vert.x-eventloop-thread-8] | ERROR | o.a.s.t.rest.client.http.RestClientInvocation | Failed to send request, local:not connected, remote:/10.31.31.29:20001.javax.net.ssl.SSLHandshakeException: Failed to create SSL connection at io.vertx.core.net.impl.ChannelProvider$1.userEventTriggered(ChannelProvider.java:115) at io.netty.channel.AbstractChannelHandlerContext.invokeUserEventTriggered(AbstractChannelHandlerContext.java:344) at io.netty.channel.AbstractChannelHandlerContext.invokeUserEventTriggered(AbstractChannelHandlerContext.java:330) at io.netty.channel.AbstractChannelHandlerContext.fireUserEventTriggered(AbstractChannelHandlerContext.java:322) at io.netty.handler.ssl.SslUtils.handleHandshakeFailure(SslUtils.java:347) at io.netty.handler.ssl.SslHandler$5.run(SslHandler.java:2004) at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748)Caused by: javax.net.ssl.SSLException: handshake timed out at io.netty.handler.ssl.SslHandler$5.run(SslHandler.java:2001) ... 9 common frames omittedrun log:2020-09-16 11:07:48.689 | ERROR | [http-nio-10.31.31.13-8080-exec-1408] | 10.31.31.13 | V295217425-3f7b-48f | failed to handle request,exception is:InvocationException: code=408;msg=CommonExceptionData [message=Request Timeout. Details: The timeout period of 5000ms has been exceeded while executing POST /channel/v2/ability/queryAbilityDetail for server 10.31.31.29:20000]2020-09-16 11:07:48.698 | ERROR | [http-nio-10.31.31.13-8080-exec-1412] | 10.31.31.13 | V2f56eee1c-cb57-4ce | failed to handle request,exception is:InvocationException: code=408;msg=CommonExceptionData [message=Request Timeout. Details: The timeout period of 5000ms has been exceeded while executing POST /channel/v2/recommend/newCardList for server 10.31.31.29:20000]
-
首先看到时间复杂度要求就可以确定使用折半查找的思想。由于数组下标是从0开始计数,我们可以将k也定义为从0开始,那么原本题目中的第k小(k从1开始),在我们算法中就表示成第k-1小(k从0开始)。注意每次取mid1和mid2时,都应该考虑有没有越界情况的发生。public class ex_2 {public static void main(String[] args) {int[] arr1 = new int[]{1, 2, 3};int[] arr2 = new int[]{0, 4, 5, 6, 7, 8};System.out.println(findKth(arr1, arr2, 2));}public static int findKth(int[] arr1, int[] arr2, int k) {if (arr1 == null || arr1.length < 1) {return arr2[k - 1];}if (arr2 == null || arr2.length < 1) {return arr1[k - 1];}return findKth(arr1, 0, arr1.length - 1, arr2, 0, arr2.length - 1, k - 1);}public static int findKth(int[] arr1, int l1, int r1, int[] arr2, int l2, int r2, int k) {if (l1 > r1) {return arr2[l2 + k];}if (l2 > r2) {return arr1[l1 + k];}if (k == 0) {return Math.min(arr1[l1], arr2[l2]);}int mid1 = l1 + k / 2 < r1 ? l1 + k / 2 : r1;int mid2 = l2 + k / 2 < r2 ? l2 + k / 2 : r2;if (arr1[mid1] < arr2[mid2]) {return findKth(arr1, mid1 + 1, r1, arr2, l2, r2, k - (k / 2) - 1);} else if (arr1[mid1] > arr2[mid2]) {return findKth(arr1, l1, r1, arr2, mid2 + 1, r2, k - (k / 2) - 1);} else {return arr2[mid2];}}}
-
1、认识frame类a、这是一个窗口类b、常用方法setSize();## 标题//设置大小setVisible();//显示窗口setTitle();//设置标题setResizable();//设置是否能改变窗口大小addWIndowListener //创建窗口监听器package tank;import java.awt.Frame;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class mainActivity {public static void main(String[] args) {// TODO Auto-generated method stubFrame f=new Frame(); //调用jar包awt下的Frame窗口类进行实例化f.setVisible(true); //调用显示窗口的方法,设置窗口可见参数为truef.setSize(1000,800); //设置窗口大小,括号内为窗口大小参数,单位为像素f.setResizable(false); //设置是否能改变窗口大小,是为true,否为falsef.setTitle("坦克世界"); //设置标题 f.addWindowListener(new WindowAdapter() {//使用匿名内部类创建窗口监听器@Overridepublic void windowClosing(WindowEvent e) {//被监听者// TODO Auto-generated method stubSystem.exit(0);//系统退出} });}}这样就可以点击自己创建好的窗口的“❌”号关闭这个窗口了。其实还可以重新创建一个class文件命名为tankfram ,使其继承自Frame,在tankframe类中还应该创建一个无参的构造方法在这个无参的构造方法中写入属性设置**package tank;import java.awt.Frame;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class tankfram extends Frame {public tankfram() {setVisible(true); //调用显示窗口的方法,设置窗口可见参数为truesetSize(800,600); //设置窗口大小,括号内为窗口大小参数,单位为像素setResizable(false); //设置是否能改变窗口大小,是为true,否为falsesetTitle("̹坦克世界"); //设置标题 addWindowListener(new WindowAdapter() {//使用匿名内部类创建窗口监听器@Overridepublic void windowClosing(WindowEvent e) {//被监听者// TODO Auto-generated method stubSystem.exit(0);//系统退出}}); }}接着在mainActivity中调用这个无参的构造方法即可2、重写paint方法,使用Graphics画笔工具画一个矩形这个画笔工具其实就是一个Frame类中的方法,我们需要早tankframelei中重写这个方法@Overridepublic void paint(Graphics g) {//Graphics 可以理解为画笔g.fillRect(200, 200, 50, 50);//使用画笔在窗口的横向距离200像素点,纵向距离200200像素点的地方创建一个长50像素宽50像素的矩形}在这个方法中x轴也就是横向是标题栏从左至右依次增大,y轴也就是纵向是标题栏从上往下依次增大3、让我们画出的矩形动起来要让我们画出的矩形动起来一般我们需要设置一个线程,但是考虑到我是一个初学者,我准备使用一个循环来完成它。首先,需要介绍一个监听器,这个监听器是KeyAdapter,这个监听器中有两个方法,一个是keyPressed,这个方法是监听键盘的按下活动的,另一个是keyReleased方法,这个方法是监听键盘抬起活动的class mykeyListener extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e) { //键盘按下// TODO Auto-generated method stub}@Overridepublic void keyReleased(KeyEvent e) { //键盘抬起// TODO Auto-generated method stub}}这两个方法都是从键盘适配器类KeyAdapter重写的,我们可以在这个两个冲写的方法中写入我们所需要实现的内容。要想让我们画出的图形动起来直接在tankfram类中定义两个变量,让着两个变量替换掉paint放发中的参数,然后在键盘监听这个类中重新定义方块的坐标并宠幸显示方块即可,说到这里系统又一个放是是专门用来完成界面刷新的一个方法那就是repaint()。但是呢,我们又不可能以值收在电脑旁按键盘,这时候我想到了用循环来做这个功能。将mykeyListener中的功能给注释掉,(注意:不要直接删除,后面可能会用到),然后在paint方法中写入 x=+10,接着会带mainAvcivity类中写入一个while死循环,这时编辑器会提示报异常,我们直接将这个异常用throw语句抛出即可,在这个循环中写入更新界面的方repaint()方法,这样我们方块就动起来了public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub tankfram tf=new tankfram();//对tankfram进行实例化while(true) {Thread.sleep(100);tf.repaint();}}public void paint(Graphics g) {//Graphics 可以理解为画笔g.fillRect(x, y, 50, 50);//使用画笔在窗口的横向距离200像素点,纵向距离200像素点的地方创建一个长50像素宽50像素的矩形x+=10;}
-
乐乐老师的问答集锦Q:自己能写代码,但是看不懂别人的代码,如何理解别人的语法?A:首先需要解决的问题是为什么没办法理解别人的语法,是不了解相关技术基础,还是不了解业务逻辑,还是其他人的代码确实写的有点难以理解。针对上面不同的原因,我给出以下建议:一、不理解相关技术,不妨就直接找实现这段代码的同事,请他给你简单brief一下相关技术,往深了学还是要靠你自己。或者是更高效的做法就是在code review或者tech session中请他分享一下有关技术,这样整个知识就在团队内部显式化。二、不了解业务逻辑,不清楚这个逻辑为什么这样做,那就需要去找当时需求的提出人,自己团队内部的产品经理或者业务分析师,或者是写这段代码的人,找他们了解业务上下文,弄清楚这里为什么这样做,这个逻辑解决了什么样的问题,达成了什么样的目的;其他人的代码确实有bad smell,这时候事情就变得有意思起来了,我希望你可以checkout一个新分支,大胆的补齐测试然后对这段代码进行重构,在code review的时候给出自己重构的理由,show一把自己的技术。 Q:如何将知识点搭配起来完成一个比较复杂的项目?A:如果是学了一个知识点,打算在项目中使用的话,一定要保证自己首先能完成一个最基本的项目,从0-1让一个项目先跑起来,然后再去考虑如何将所学的知识点(比如redis,分布式锁,zookeeper,MQ等)去和这个项目进行集成,当然如果是对于这些知识点是否真正工作,还需要自己想清楚集成了之后如何观察和测试。大部分项目都会在官网有demo,如果看不懂英文官网的文档的话,先好好学习英语哟! Q:从简单敲一段代码到项目级的进阶之路怎么走?A:项目是由一段段代码组成的,在我看来如果关注项目级别的事情,那么说明自己选择的是程序员,TL,架构师这条路而不是纯管理岗,当你能完成一个简单的CURD业务逻辑,让一个功能run起来之后,就可以开始关注架构设计方面的知识,了解当前项目痛点,寻找如何通过更好的架构设计,引入新技术来解决。我最近在阅读的《架构整洁之道》,《大型网站技术架构-核心原理与案例分析》,《大型网站系统与Java中间件实践》都是不错的书籍,推荐需要的同学阅读。乐乐老师的四个一内容回顾一份技能图谱(文末自取)由诸多一线大厂开发人员和技术负责人共同整理的Growing技能图谱一条学习线路(文末自取)大佬珍藏,迭代至今的学习线路一个知识点——压力测试压力测试:在软件测试中,压力测试(Stress Test),也称为强度测试、负载测试。压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷,长时间或超大负荷地运行测试软件,来测试被测系统的性能、可靠性、稳定性等。一个实战案例——应对双十一百万PV挑战双十一马上就要到了,便宜用户拿了,利润商家收了,剩下的这一大波突如其来的流量留给了我们的开发者,如何在限量秒杀,限时支付,拼团拼购等玩法下维护服务系统的正常运行,成了横亘在乐乐老师和双十一之间必须要攻克的挑战。他们在怎么做呢?——优化性能利用Gatling对加购,结算,支付,退款,订单生成以及限量秒杀,红包卡券等功能进行了详尽的性能测试,生成了服务SLA的同时利用Arthas对热点代码进行监控,结合业务逻辑提出了很多优化方案。例:在架构上:分别在网关层(Nginx,API Gateway),容器层(Tomcat)和服务层进行了限流配置和流量监控,使用了诸如令牌桶,流速控制以及最大连接数控制等方案保证服务稳定性。代码层面:结合业务逻辑减少了锁粒度并适当对锁进行了降级来减少锁争用情况。简单来说就是减少被锁住的代码块,只去对该同步的地方同步。基础设施层面:配置动态扩容规则,并且准备了备用机器以防单点故障,增加备用数据库配置级别,对数据库等服务进行了适当实例增强准备,同时进行了详细的基础设施故障演练,应对突发状况制定响应规则和响应策略。想要更多资源,请持续关注我们的活动……扫码加微信群,仅限200人开始时间10月29日 20:00活动介绍云享MindTalks是由华为云DevCloud团队携手云享专家共同策划进行的系列技术交流活动。各业界大咖纷纷现身群聊,以即时对话形式,来进行最直接的技术交流和思想碰撞。为保证极简极高效,活动仅二十分钟,开始即高潮,结束即群散。针对上一期问卷反馈,这期由张常乐老师,在双十一大促前夕忙于技术支撑的前主播,来和我们进行面对面的分享:在大家节衣缩食养精蓄锐准备买买买的时候,他和他的团队为何忙于Java程序无法自拔?从模特成功转行开发者的技能图谱如何点亮?专家介绍忙于技术支撑的前主播,华东区Tech Lead;拥有5年Java开发经验,现役CSDN博客专家,华为云云享专家,Thoughtworks咨询师。热爱分享的常乐君,还喜欢leetcode打野,是一个凭实力进入周赛前排的模特。活动规则1.扫码加入群聊,仅限200人,手慢者即无。2.未能即时回复问题,由助手收集集中回答。3.微信群聊将于活动结束后三天内原地解散。4.抽奖的奖品为荣耀魔方蓝牙音箱(树莓红)和华为云定制礼品HE2E知识卡牌。
-
迷宫项目实现设计文档项目介绍:一个网格迷宫由n行m列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示)。你的任务是找一条从起点到终点的移动序列,其中只能上下左右移动到相邻单元格。任何时候都不能在有障碍物的单元格中,也不能走到迷宫之外。起点为左上角和终点右下角。项目功能:解决迷宫路径查找问题,寻找一条从左上角迷宫入口到右下角迷宫出口的一条有效路径,0代表可走,1代表不能行走,找到请输出最终的迷宫和路径信息,找不到请输出不存在有效路径。项目所用知识点:采用Java面向对象思想,二维数组以及非递归栈进行实现项目实现思路:定义一个迷宫节点类型(MazeNode)的二维数组初始化每个格子中的value值。给二维数组每个格子存放对象。对象的value值只能为0(当前格子可以走)或者1(当前格子不能走)创建围墙,可以有效防止越界问题。根据当前节点周围四个方向格子中的value值,判断当前节点的上下左右四个方向是否可走(0是可走,1不可走)。开始走迷宫。采用栈操作,记录行走的路径,将元素入栈,判断当前栈顶元素的哪个方向可走,将其中一个可走方向进行入栈操作,直到右下角元素停止。栈中保存走过的路径。 注意: 如果遇到走入死胡同问题,此时需要将是栈顶元素并且栈顶元素的四个方向都不能行走,此时将其出栈,选择新方向再次入栈,直到右下角元素停止。项目实现 :Maze类import java.util.Scanner; public class Maze { private MazeNode[][] mazenode; private int row ;//行 private int colum;//列 public Maze(){ } public void innode(){//添加迷宫路径; Scanner scanner=new Scanner(System.in); System.out.println("请输入迷宫行数和列数"); row=scanner.nextInt()+2;//为后面加围墙 colum=scanner.nextInt()+2; System.out.println("请输入迷宫路径:"); mazenode=new MazeNode[row][colum]; build(mazenode);//创建一个row行colum列的mazenode并且把value值都给1 for(int i=1;i<row-1;i++){//为围墙内value赋值; for(int j=1;j<colum-1;j++){ mazenode[i][j].value=scanner.nextInt(); } } } //创建围墙; public void build(MazeNode[][] mazenode){ for(int i=0;i<row;i++){ for(int j=0;j<colum;j++){ mazenode[i][j]=new MazeNode(1,i,j); } } } public void goMaze(){//走迷宫 innode(); MyStack route=new MyStack();//存放路径的盏 if(mazenode[1][1].value==0){//判断入口是否可走; route.push(mazenode[1][1]); }else {System.out.println("迷宫入口路径错误"); } if(mazenode[row-2][colum-2].value!=0){//判断终点是否正确 System.out.println("迷宫终点错误"); } for(int i=1,j=1;;){//起点 i=route.gettop().index1;//赋值栈顶元素的下标一给i j=route.gettop().index2;//赋值栈顶元素的下标二给j if(i==row-2&&j==colum-2){ break; }//抵达终点退出循环 if(mazenode[i][j].right(mazenode,i,j+1)){//判断右边是否可走 if(route.contain(route,mazenode,i,j+1)){//判断右边是否在栈内 mazenode[i][j].changeValue(mazenode,i,j); route.pop(mazenode[i][j]);//如果存在退栈 }else { route.push(mazenode[i][j+1]);//如果不存在入栈的右边 } } else if(i+1<row&&mazenode[i][j].down(mazenode,i+1,j)){ if(route.contain(route,mazenode,i+1,j)){//判断下边是否在栈内 mazenode[i][j].changeValue(mazenode,i,j); route.pop(mazenode[i+1][j]);退栈 }else { route.push(mazenode[i+1][j]); } }else if(i+1<row&&mazenode[i][j].left(mazenode,i,j-1)){ if(route.contain(route,mazenode,i,j-1)){//判断左边是否在栈内 mazenode[i][j].changeValue(mazenode,i,j); route.pop(mazenode[i][j]);退栈 }else{ route.push(mazenode[i][j-1]); } }else if(i+1<row&&mazenode[i][j].up(mazenode,i-1,j)){ if(route.contain(route,mazenode,i-1,j)){//判断上边是否在栈内 mazenode[i][j].changeValue(mazenode,i,j); route.pop(mazenode[i][j]);退栈 }else{ route.push(mazenode[i-1][j]); } } } route.toRoute();//修改路径的值 for(int i=1;i<row-1;i++){//进行打印 for(int j=1;j<colum-1;j++){ System.out.print(mazenode[i][j].value+" "); } System.out.println(); } } }mazenode类public class MazeNode { public int index1; public int index2; public int value; public MazeNode(int value,int index1,int index2) { this.value=value; this.index1=index1;//下标1 this.index2=index2;//下标2 } //改变找个点的值为2 public void changeValue(MazeNode[][] mazeNode,int index1,int index2){ mazeNode[index1][index2].value=2; } //判断左边是否可走 public boolean left(MazeNode[][] mazeNode,int index1,int index2){ if(mazeNode[index1][index2].value==0){ return true; }return false; } //判断上边是否可走 public boolean up(MazeNode[][] mazeNode,int index1,int index2){ if(mazeNode[index1][index2].value==0){ return true; }return false; } //判断右边是否可走 public boolean right(MazeNode[][] mazeNode,int index1,int index2){ if(mazeNode[index1][index2].value==0){ return true; }return false; } //判断下边是否可走 public boolean down(MazeNode[][] mazeNode,int index1,int index2){ if(mazeNode[index1][index2].value==0){ return true; }return false; } }MyStake类//栈import java.util.Arrays; import java.util.EmptyStackException; public class MyStack { private PuzzleValue[]array2; private MazeNode[]array; private int size; private final int INITSIZE=10; public MyStack(){ array=new MazeNode[INITSIZE]; array2=new PuzzleValue[INITSIZE]; } //查找栈内是否存在此路径 public boolean contain(MyStack stack,MazeNode[][] mazeNode,int index1,int index2){ for(int i=0;i<size;i++){ if(array[i].index1==index1&&array[i].index2==index2){ return true; } } return false; } //入栈 public void push(MazeNode mazeNode){ if(array.length==size){ array= Arrays.copyOf(array,array.length+(array.length>>1)); }else { array[size]=mazeNode; size++; } } //出栈 public void pop(MazeNode mazeNode){ if(size==0){ return; }else{ array[size]=null; size--; } } //获得栈顶元素 public MazeNode gettop(){ return array[size-1]; } //改变栈内的value值 public void toRoute(){ for(int i=0;i<size;i++){ array[i].value=3; } } }
-
HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)
-
【功能模块】鲲鹏性能分析工具中Java性能分析子工具【操作步骤&问题现象】1、正常安装工具同一个java进程,Profiling分析可用,Sampling分析不可用。【截图信息】第一台服务器Sampling分析不可用第二台服务器Sampling分析也不可用两台服务器都安装了高版本jdk第一台安装了bisheng JDK11第二台安装了open jdk11两台服务器都是鲲鹏云ECS
-
使用鲲鹏性能分析工具中Java性能分析子工具在服务器kunpeng(192.168.0.113)上添加Guardian后,Guardian是运行状态,可以执行某些分析操作,如图所示:此时把kunpeng服务器重启,Guardian就变为连接超时状态,如下图所示:按照常用习惯,大家还是希望Guardian所在服务器重启后能自动连接上,就算不能自动连接,手动连接也行,但是在上面的工具按钮里也没有重新连接的按钮。估计大部分人的做法是删除了重新安装。当然,经过多次试验后会发现,这时候选择修改节点,重新输入用户名和密码,这个Guardian节点是会自动连上的,不过这一点不太直观,很难第一时间想到。所以,建议这里改进一下业务逻辑或者界面形式:能实现自动重新连接最好。实在不能自动连接,可以Guardian区域按钮栏加一个“连接”的图标按钮,让使用者可以手动输入登录信息。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签