arraylist命名空间,Java程序员最常用的技术有哪些?
从事Java Web开发,具备三年工作经验,我来尝试回答这个问题,供读者参考。Java程序员最常用的技术,从中可以看出Java基础是先决条件,而要从事完整的Java开发,数据库知识,框架开发能力是不可或缺的,而要升职加薪,与之匹配的JVM调优,常见框架和中间件的源码阅读拓展是一大加分项。

首先说Java基础,最简单的语法、语句、使用场景等不必说,常用的类和方法、集合数据结构(如set,list,map)使用常用方法字符串查找、正则匹配等等问题,还有异常处理、文件读写与解析,更高级的的多线程并发处理等,都需要去实践并有一定经验。
接着说数据库,没有数据库的Java开发是无源之水,枯燥而乏味。这里的数据库指数据的载体,常见的mysql、orcale等关系型数据库,用作缓存的redis、memcached等key-value型数据库,用作文档类型存储的hbase,用作搜索引擎的elasticsearch,这些从广义上来说都可以作为数据库,要学会根据不同的业务场景灵活选用。与之相对应的安装、启动、可视化工具等都需要了解,其个别的实现原理和集群同步机制也需要有一定的认识。
再来说说用于Java Web开发的框架,就我所用的、也是被广泛使用的轻量级的开源的Java开发框架,不可不学,不可不会,强大的spring生态圈具备强大的生产力,从Spring MVC到Spring Cloud时不时有令人惊艳的产品,其完备的企业级解决方案受到各个公司的追捧,几乎不约而同的选择spring作为基础框架。在Spring的基础上,Spring Boot+Spring Cloud和Spring MVC+Dubbo,这两条主流的技术栈用到的相关技术也都是常用的内容。
再来说说JVM调优,用到的次数不多,但是面试过程中总会被问到,是一个定薪资水平的重要参考。JVM就是Java虚拟机,与底层架构、操作系统联系紧密。JVM相关知识就与虚拟机、底层相关了,这部分知识包括:JVM内存模型和JVM内存管理,感兴趣的同学可以深入了解。
最后说说常见框架和中间件的源码阅读拓展,这部分的层次比较高,需要你对JDK源码有所了解,在此基础上看框架和中间件的源码,如Spring源码、Zookeeper的源码等,在读源码的同时,深入了解其实现原理和架构思想,读一些简单的spring-boot-starter,能够写自己常用的starter,这样就说明你读了,并且有所收获。
上面的很多内容都是泛泛而谈,除了这些内容,还有很多没有讲到,比如大数据处理组件Hadoop生态圈、Storm流处理组件、高性能消息服务Kafka等也或多或少需要了解,并具备相应的开发能力。
作者:夕阳雨晴,欢迎关注我的头条号:偶尔美文,主流Java,为你讲述不一样的码农生活。
软件开发的新潮流低代码开发平台如OutSystemsMendix?
随着低代码概念的火热,相关的技术及产品也是层出不穷,不管是老牌行业软件厂商还是开放平台厂商,不论是互联网行业企业SAAS软件新动向还是新兴的低代码创新产品服务,都在第一时间打出了低代码这张牌。各个平台虽然各有优势,但大多又是自成体系,真正在企业方面进行选择时却一时难以抉择。对于低代码平台的功能评价,以及各平台组件间的互联互通则成为了市场上迫切需求。
在刚刚过去的2022年,在平台互联互通的方面,阿里在第二季度推出开源引擎 “LowCodeEngin”,国家队信通院也应市场需求在第四季度推出了《低代码开发平台通用技术要求》,针对低代码相关概念以及功能点新型了进一步的规范和梳理。在全面开放的大背景下,CodeBee团队,推出了基于开源LGPL协议 低代码引擎(LowCodeEngine)。二,产品组成低代码引擎,由界面设计器、OneCode通码框架以及,DSM领域建模工具 三部分支撑体系相互支撑的部分来组成,通过开放标准的组件协议完成相互继承支持。(1) 视图设计器引擎设计器,采用的是拖拽引擎+插件的构造模型,用户可以通过开放的低代码协议编写插件。支持JS和JAVA两种扩展语言。样式构建提供了标准CSS3编辑器,支持事件动作以及函数动态扩展。支持自定义函数库扩展,支持阿里字体图片等资源库。(2)OneCode通码编辑器:OneCode,是一款为低代码语言定制的统一语法体系,采用Java语言作为原生语言,运行在JVM环境中,用户可以通过Java语言与低代码应用进行交互,也可以通过Java语言完成引擎插件,调用代码引擎完成编译部署应用。(3)DSMEngine领域建模:DSMEngine 是独立于设计器的OneCode建模工具,平台采用领域建模模型,支持仓储管理、聚合应用,以及CodeFactory输出为OneCode代码编译输出。DSM模型支持三种建模模式:(1)CodeFrist 代码优先模式通过Java语言 OneCode 模式原生撰写。(2)ViewFrist 视图优先通过视图引擎拖拽完成前期的交互模型,反向完成DSM模型。(3)ModuleFrist 模型优先通过数据库,微服务接口等模式,构建基础模型。DSM逆向转换通过不同方式完成的DSM模型,可以通过OneCode 在视图、Code 、以及Module 三种方式之间自由切换,利用相关工具完成仿真调试以及部署运行。DSM第三方语言转换DSM出码模块采用了独立的模板架构,除了可以以OneCode形式存在,还可以支持独立的出码模块定制独立的第三方语言模型输出。三,设计器引擎介绍(1)功能概览(2)设计器布局设计器引擎是低代码引擎前端的SDK,面向开发人员,他本身不是一套可以适应所有人的低代码平台,而是技术开发人员可以通过扩展插件,周边生态,完成自身业务的定制,实现协同办公,CRM客户管理、物联网平台等通过低代码能力赋能业务系统(3)物料库"物料":低代码引擎的核心目的之一是建设跨行业的低代码框架,而每个行业由于其应用的领域不同,使用的人员以及方法方式不同,在一些底层组件方面会有会有加大差距。比如:政府业务中会大量使用的非规则表单元素,企业应用中各个行业自有的图标体系,物联网行业大量的设备图标图片以及实时联网图。(4)组件库组件定义:可以用于低代码平台的组件,包含了搭建体验增强配置,可以在设计器中 进行拖拽、配置等操作。有两种分类方式:按照场景可以分为基础组件、业务组件、图 表组件、布局组件和复合组件等。通常用户可以自主完成相关设定,并根据业务特点在视图引擎中进行自行扩展(后续章节中会演示实际注册示例)组件通常是一组完成特定功能的可交互组件,根据不同的引擎模式,在引擎中完成加载渲染配置。配置示例Code转换组件调试导入(5)支撑管理公共资源导入(6)样式体系DOM树透视样式盒DOM树透视添加图片注释,不超过 140 字(可选)配图示例代码{ "alias":"BuildTreeTreeView", "key":"xui.UI.TreeView", "host":this, "properties":{ "name":"BuildTreeTreeGrid", "items":[ { "borderType":"none", "caption":"JAVA树", "dynDestory":false, "hidden":false, "id":"getBuildTree", "imageClass":"bpmfont bpmgongzuoliuxitongpeizhi", "tagVar":{ } } ], "iniFold":false, "dynDestory":true }, "CS":{ "KEY":{ "color":"#000000", "font-weight":"lighter", "border-radius":"0px 2px 0px 0px" }, "BAR":{ "font-family":"tahoma,geneva,sans-serif" } } }
动态样式盒添加图片注释,不超过 140 字(可选)代码配置示例{ "alias":"xui_ui_cssbox1", "key":"xui.UI.CSSBox", "host":this, "properties":{ "className":"xui-css-ame", "normalStatus":{ "color":"#eeeeee", "border-radius":"6px", "box-shadow":"inset 0px 1px 0px #87C1DD", "text-shadow":"0 1px 0 #297192", "$gradient":{ "stops":[ { "pos":"0%", "clr":"#4BA3CC" }, { "pos":"70%", "clr":"#3289B2" } ], "type":"linear", "orient":"T" }, "cursor":"pointer", "border-top":"solid #3899C6 1px", "border-right":"solid #3899C6 1px", "border-bottom":"solid #3899C6 1px", "border-left":"solid #3899C6 1px" }, "hoverStatus":{ "border-radius":"0px 3px 0px 0px" } } }
(7)事件框架添加图片注释,不超过 140 字(可选)配置代码示例:{ "alias":"BuildTreeTreeView", "key":"xui.UI.TreeView", "host":this, "properties":{ "name":"BuildTreeTreeGrid", "items":[ { "borderType":"none", "caption":"JAVA树", "dynDestory":false, "hidden":false, "id":"getBuildTree", "imageClass":"bpmfont bpmgongzuoliuxitongpeizhi", "tagVar":{ } } ], "iniFold":false, "dynDestory":true }, "events":{ //获取数据 "onGetContent":{ "actions":[ { "args":[ "{page.ReloadChild.setQueryData()}", null, null, "{args[1].tagVar}", "" ], "desc":"设置扩展参数", "method":"setQueryData", "redirection":"other:callback:call", "target":"ReloadChild", "type":"control" } ] }, //数据项选择 "onItemSelected":{ "actions":[ { "args":[ "{args[1].id}" ], "conditions":[ { "symbol":"non-empty", "right":"", "conditionId":"_nonempty_{args[1].className}", "left":"{args[1].className}" } ], "desc":"删除存在页", "method":"removeItems", "target":"BuildTreeTab", "type":"control" } ] } } }
(8)动作调用功能概览添加图片注释,不超过 140 字(可选)添加图片注释,不超过 140 字(可选)配置实例代码:{ "args":[ "{page.ReloadChild.setQueryData()}", null, null, "{args[1].tagVar}", "" ], "desc":"设置扩展参数", "method":"setQueryData", "redirection":"other:callback:call", "target":"ReloadChild", "type":"control" }, { "args":[ "{page.ReloadChild.invoke()}", "temp", null, "{args[2]}" ], "desc":"子节点装载", "method":"invoke", "redirection":"other:callback:call", "return":false, "target":"ReloadChild", "type":"control" } ] }
(9)插件体系插件是嵌入到设计器的内置管理功能,不同于业务组件,插件更多的是系统极的扩展功能。在实际应用中也比较常见,如系统运行期我们要根据用户不同显示不同内容数据,这就需要权限插件来完成,而业务用户在使用过程也会涉及到大量的业务和数据的流转功能而这些功能则需要动态的来管理页面的属性,甚至动态生成注入页面。这就需要流程插件来辅助完成。 在实际开发过程中特别是真实项目的工程开发时,我们往往要针对工程方面的进行很多的宏操作比如批量的修改特定组件样式,按特定条件检索复制组件特性,自动添加动作等等。这些都需要类似的宏插件来完成,OneCode 在整合后端运行以及服务部署方面也是按插件体系来规范的。分别针对,DSM建模提供了DSM插件,发布管理及运行提供了OPS插件, API整合方面提供了代理服务器插件,系统插件部分采用全开源方式共有需要的用户自行修改方便用户后期可以参照插件体系来修改自身的插件体系。添加图片注释,不超过 140 字(可选)添加图片注释,不超过 140 字(可选)四,OneCode中后台OneCode 本身基于JAVA语言体系,是在Java Spring 注解基础上的一套扩展子集,可以在普通额Java程序中通过添加注解,来实现前后台与低代码引擎的交互处理。(1)渲染原理(2)示例展示添加图片注释,不超过 140 字(可选)(3)完整模块OneCode添加图片注释,不超过 140 字(可选)添加图片注释,不超过 140 字(可选)@Controller @RequestMapping("/admin/org/person/") @MethodChinaName(cname = "人员管理", imageClass = "spafont spa-icon-login") @Aggregation(sourceClass = PersonService.class) public class PersonAPI { @RequestMapping(method = RequestMethod.POST, value = "Persons") @GridViewAnnotation() @ModuleAnnotation( caption = "人员列表") @APIEventAnnotation(autoRun = true, bindMenu = {CustomMenuItem.reload}) @ResponseBody public ListResultModel<List<PersonGridView>> getPersons(String orgId) { ListResultModel<List<PersonGridView>> resultModel = new ListResultModel<List<PersonGridView>>(); List<Person> personList = new ArrayList<>(); try { personList = getService().getPersons(orgId); resultModel = PageUtil.getDefaultPageList(personList, PersonGridView.class); } catch (Exception e) { e.printStackTrace(); } return resultModel; } @MethodChinaName(cname = "人员信息") @RequestMapping(method = RequestMethod.POST, value = "PersonInfo") @NavGroupViewAnnotation() @APIEventAnnotation(callback = {CustomCallBack.ReloadParent, CustomCallBack.Close}, bindMenu = {CustomMenuItem.editor}) @DialogAnnotation @ModuleAnnotation(caption = "编辑人员信息", width = "800", height = "550") @ResponseBody public ResultModel<PersonNav> getPersonInfo(String personId) { ResultModel<PersonNav> resultModel = new ResultModel<PersonNav>(); return resultModel; } @MethodChinaName(cname = "添加人员") @RequestMapping(method = RequestMethod.POST, value = "AddPersonView") @FormViewAnnotation @APIEventAnnotation(bindMenu = {CustomMenuItem.add}, autoRun = true) @Disabled @ModuleAnnotation( caption = "添加人员信息", width = "370", height = "260") @ResponseBody public ResultModel<AddPerson> AddPerson(String orgId) { ResultModel<AddPerson> resultModel = new ResultModel<AddPerson>(); CtPerson person = new CtPerson(); person.setOrgId(orgId); resultModel.setData(new AddPerson(person)); return resultModel; } @MethodChinaName(cname = "保存成员信息") @RequestMapping(value = {"savePerson"}, method = {RequestMethod.GET, RequestMethod.POST}) @APIEventAnnotation(callback = {CustomCallBack.ReloadParent, CustomCallBack.Close}, bindMenu = CustomMenuItem.save) public @ResponseBody ResultModel<Boolean> savePerson(@RequestBody CtPerson person) { ResultModel<Boolean> userStatusInfo = new ResultModel<Boolean>(); getService().savePerson(person); return userStatusInfo; } @MethodChinaName(cname = "删除人员") @RequestMapping(value = {"delPerson"}, method = {RequestMethod.GET, RequestMethod.POST}) @APIEventAnnotation(callback = {CustomCallBack.Reload, CustomCallBack.ReloadParent}, bindMenu = CustomMenuItem.delete) public @ResponseBody ResultModel<Boolean> delPerson(String iD) { ResultModel<Boolean> userStatusInfo = new ResultModel<Boolean>(); getService().delPerson(iD); return userStatusInfo; } PersonService getService() { return EsbUtil.parExpression(PersonService.class); } } @PageBar // @GridAnnotation(event = CustomGridEvent.editor, customService = PersonService.class, customMenu = {GridMenu.Add, GridMenu.Delete, GridMenu.Reload}) public class PersonGridView { @CustomAnnotation(pid = true, hidden = true) String orgId; @CustomAnnotation(pid = true, hidden = true) String roleId; @CustomAnnotation(uid = true, hidden = true) String iD; @CustomAnnotation(caption = "用户名称", required = true) String name; @CustomAnnotation(caption = "账户信息", required = true) String account; @CustomAnnotation(caption = "邮箱") String email; @InputAnnotation(inputType = InputType.password) @CustomAnnotation(caption = "密码", required = true) String password; @CustomAnnotation(caption = "手机") String mobile; @CustomAnnotation(caption = "部门名称") String orgName; public PersonGridView(Person person) { this.iD = person.getID(); this.orgId = person.getOrgId(); this.name = person.getName(); this.account = person.getAccount(); this.password = person.getPassword(); this.mobile = person.getMobile(); this.email = person.getEmail(); Org org = null; try { org = OrgManagerFactory.getOrgManager().getOrgByID(person.getOrgId()); this.orgName = org.getName(); } catch (OrgNotFoundException e) { e.printStackTrace(); } } } @BottomBarMenu @FormAnnotation(bottombarMenu = {CustomFormMenu.Save, CustomFormMenu.Close}, customService = PersonService.class, col = 1) public class AddPerson { @CustomAnnotation(uid = true, hidden = true) String iD; @CustomAnnotation(caption = "用户名称", required = true) String name; @CustomAnnotation(pid = true, hidden = true) String orgId; @CustomAnnotation(pid = true, hidden = true) String roleId; @CustomAnnotation(caption = "账户信息", required = true) String account; @CustomAnnotation(caption = "邮箱") String email; @InputAnnotation(inputType= InputType.password) @CustomAnnotation(caption = "密码", required = true) String password; @CustomAnnotation(caption = "手机") String mobile; public AddPerson(Person person) { this.iD = person.getID(); this.orgId = person.getOrgId(); this.name = person.getName(); this.account = person.getAccount(); this.password = person.getPassword(); this.mobile = person.getMobile(); this.email = person.getEmail(); } }
(五)DSM建模工具DSM建模,百度百科是这样定义的:特定域建模(Domain-specific modeling,DSM),是一种设计和开发系统(如电脑软件)的软件工程方法学。它系统使用图形化特定域语言(DSL),表现系统的各个方面。DSM的语言倾向于支持比通用建模语言更高级别的抽象,因此需要较少的努力和更少的底层细节来描述特定系统。低代码技术应用可以通过提供更强的工具,提升程序员的代码效率。但其本质上也是一种特定场景下的软件描述方法,这个层面上低码技术和DSM思想是有其相通相同之处的,产品在设计之初就将DSM建模语言的构建以及工具支撑作为了底层支撑设计,将应用中积累的建模应用采用DSM的思想进行重构整合在底层打通。我们将现有的资源类的工具,统一到仓库应用中,包括统一的物料库导入,统一的数据源(数据库,外部存储)管理。并通代码工厂的辅助构建统一到Contenxt(OneCode)的当前环境技术模型中。在各个特定的业务模型中,完成独立的聚合实体整合,以及相应的服务管理,并为相关的方法模型透视管理服务。在OneCode 的基础之上,摆脱传统的 代码模板与生成机制。实现代码向模型的逆向能力。将DSM设计能贯穿整个项目开发实施管理过程,打造结余真实的代码之上的建模语言。(1)仓储建模(2)聚合应用(3)视图工厂(4)支撑域添加图片注释,不超过 140 字(可选)(5)流程建模添加图片注释,不超过 140 字(可选)六,应用集成(1)内核最小集合集成(JS离线应用)设计器内核完全采用JS脚本完成,是独立的前端框架。内核版本包括:RAD 页面设计编辑器,xui运行运行脚本两部分。添加图片注释,不超过 140 字(可选)最小集合仅包含,页面设计及器以及插件框架。设计界面集成:下载开源包后,运行debug.html 即可打开编辑器。添加图片注释,不超过 140 字(可选)集成到自由应用时只需要,引入两个关键的js lib包即可集成到自有的应用。<script type="text/javascript" src="/RAD/xui.js"></script> <script type="text/javascript" src="/RAD/index.js"></script> <script type="text/javascript"> var lang = (function () { var dft = 'zh-cn', map = { 'en-us': 'en', 'zh-cn': 'cn' }, n = navigator, l = (n.language || n.browserLanguage || '').toLowerCase(); return map[l] || map[dft]; })(); xui.include("xui.Locale." + lang + '.doc', "/RAD/Locale/" + lang + ".js", function () { xui.Module.load('RAD', function () { SPA = this; }, lang); });
运行支撑环境集成:打开:设计完成的文件再应用环境中引入如下代码即可<script type="text/javascript" src="/xui/js/xui-all.js"></script> <script type="text/javascript" src="./xuiconf.js"></script> <script type="text/javascript" src="/xui/Locale/cn.js"></script>
(2)团队协作版团队协作版是独立的服务器部署版,在官网上申请账号后,可以在独立的服务器上运行。启动后通过浏览器访问 http://demoserver:83 用管理员 sysadmin 登录:首次登录 会进入默认的工程配置界面配置工程关联API设定团队管理员怎么样才能学好java编程?
答案分为 学生版 与 非学生版(光收藏不点赞可耻,拒绝伸手党,从点赞做起!)
学生版
哈工大本硕985,北京公司,收到去哪儿(13K*16),华为,vipkid(18*14),茄子快传(20*16),创新工厂(12*13),秒针(18*16)offer,目前最低的月薪12K*13,最高的华为优招20K*16,最终还是签了百度毕竟bat,职位java开发工程师今年给的还挺多。
可以说我应该达到了题目中所说的北京java开发月薪2W的标准,来答一发。
--------------------------------------------------------------------------------
为了避免知乎大佬觉得我吹逼,把目前收到的offer图贴出来(应评论区建议,已经把名字打码,谢谢提醒)。有人需要联系方式,放一下微信公众号 程序员乔戈里 个人微信在公众号里面可获得。另外我要有3T的编程资料,需要的可以加我微信!!!
-----------------------------------------------------------------------------
会在offer图的后面附上java自学找工作的经验,并解答评论区的一些问题!!!
会在offer图的后面附上java自学找工作的经验,并解答评论区的一些问题!!!
会在offer图的后面附上java自学找工作的经验,并解答评论区的一些问题!!!
3T的编程资料!!!!!!关注公众号 程序员乔戈里 免费分享 !!!
3T的编程资料!!!!!!关注公众号 程序员乔戈里 免费分享 !!!
3T的编程资料!!!!!!关注公众号 程序员乔戈里 免费分享 !!!
-----------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
以下开始讲述一些我找工作的经验,希望对大家有帮助(觉得有帮助的,记得点个赞关注走一波,谢谢大家)
----------------------------------------------------------------------------------------------
一.简历篇
我是使用的乔布简历,在里面买了一个模板,本科还是免费的,研究生阶段就收费了,呵呵。
(1)个人联系方式
简历的话要把电话,email这些重要的信息放到显眼的位置,方便联系。
(2)技能掌握
熟悉 精通等词汇慎用(精通应届生就不要用了),我举一下我的java为何用了熟悉的例子,java看了《java核心技术卷1》《java编程思想》前几章《深入了解java虚拟机》前7章,《java并发编程的艺术》《java多线程编程核心技术》还看了一堆网上的博客,看了这么多我才写上了熟悉java。
了解的话适用于只是看过一点书,只是一种浅尝辄止的感觉,比如你只是通过刷了刷面经,了解了一些数据库的面试常见的问题,那么这种就应该用了解。一般都写上了解吧,你应聘啥工程师,对应的语言写上熟悉。
(3)荣誉奖励
奖学金,优秀干部,竞赛获奖,paper啥的都往上怼,多多益善。
(4)项目
项目篇很重要,基本面试的第一个环节都是扣你的项目。
项目一定要准备1到2个亮点(难点)!!!
项目一定要准备1到2个亮点(难点)!!!
项目一定要准备1到2个亮点(难点)!!!
有些人看到这里就会说,我这项目水的一批,一点亮点都没有,咋整,全完了呀,别慌,听我给你吹一波。
一开始我第一次面试的时候(第一次就去面阿里,我也是胆贼大),阿里面试官上来就怼项目,
问我这是啥,那是啥,我说了以后,他就问着玩意底层是咋实现的,我用的是一个开源的爬虫,然后我就说我只会用,底层没有看过,他估计很失望;然后他问我的项目亮点是啥,我当时一下愣住了,扯了一些有的没的,都是失败的惨痛的教训,大家参考参考就好,不一定就一定要照着我学,非要知耻而后勇,咋提前准备好也是不错的。
经过这次惨痛的教训以后,我就开始有意识地去想一些项目的亮点,即使不是我遇到的问题,我强行把这些问题加到我的项目上面,当做我的项目亮点。
亮点举例:我的第一个项目的我说我负责舆情监控项目的地域分析,这个模块其实平平无奇,很水,就是利用一个开源的NER命名实体识别的包去识别出来新闻正文的地点,然后统计地点出现的次数这样的一个简单的模块。我就这样吹:最深刻的一个项目就是最近做的网络舆情监控项目,其中我在里面有负责一个地域分析模块,就是从最新爬进来的新闻数据里面提取出来地域信息,最后在地图上显示出来,当时把后台模块写好了以后,是可以在本地的windows系统上运行的,然后导出jar包的时候,想把jar包在linux系统上运行起来,但是一运行就显示OOM内存溢出错误,当时遇到的这个问题的时候第一时间想起来了以前看的关于虚拟机方面的书,于是我在虚拟机的配置上添加了一个-XX:+HeapDumpOnOutOfMemoryError,尝试将dump文件保留到本地,然后采用了jmap命令去分析这个dump文件,发现代表老年代的参数Old Generation每次一启动都是一直满着的,然后去看了虚拟机的配置参数,发现虚拟机中的-xmx参数只有256M,而程序需要的内存大小为500M(因为需要加载一个MIT的提取名词的包),所以最后通过设置成1024M解决了这个问题,我感觉通过这个学到了很多。在项目中扮演了核心角色,独立完成了地域分析模块。
示例看不懂也没关系,这个得有一定的java虚拟机的知识才可以看懂,推荐看《深入了解java虚拟机》
看到这里,你完全可以把我的这个项目的这个亮点融合到你自己的项目里面,换个背景就是你的项目亮点了,我上面推荐的《深入了解java虚拟机》里面也有很多虚拟机调优的经验,你可以看懂之后,把这些融合到自己的项目里面,完全是可以的。
除此之外,关于项目还有一个问题:就是你看了我的简历,会发现许多项目都是与爬虫相关的,面试管会问你在爬虫上你遇到了啥问题,这种完全可以上网去搜爬虫和反爬虫的技术博客,然后理解记忆,说给面试官听。说到这里,其实也就是在说,你的项目可能涉及到的点你都得有准备,有备无患,你如果不知道自己项目涉及到哪些点,那么可以通过一些公司练练手,他问到的一些问题,就有可能是你的项目需要准备的点。
-------------------------------------------------------------------------------------------
二.简历投递篇
(1)官方网申
学历不好的,不建议这走这条路,容易被刷,985/211也有一定几率被刷。
(2)内推
关注 牛客网- 互联网求职神器和备考学习平台 的内推信息,都是真实可靠的,虽然不一定免笔试,但是可以保证你简历不被刷啊!!!
微信公众好 互联派 也有很多内推的信息,值得关注。
(3)内推完之后的添加个人信息
强推 牛客网简历助手 助手介绍_牛客简历助手-简历一次填写,N网闪填__牛客网
爽的一批,谁用谁知道,你填写完牛客网的简历助手,进来其它求职网站的时候,可以把插件调出来,如果调不出来,多点几下,自己摸索哈。
三.笔试面试篇
提前批:一般公司的提前批是面笔试的,这个机会一定要抓住,提前批不耽误正常网申流程,相当于多了一次机会。(其实你每次应聘都是会有记录的,现在的面试官可以看到你所有的过往的面试记录,但我觉得影响不大,你这次能过和上次没过还是取决于你自己的实力,能不能打动面试官)
笔试:就算你内推成功了,也会有极大可能笔试,如果你算法功力强,可以独当一面,那么不用看这里,直接跳过,如果你算法一般的话,我说一下我在秋招过程中看到的一些其他人是怎么办的。周围人一般都是三五成群,算法题互相说思路,基本知道思路就知道咋写了,也有的比如他1道题AC了,他是C++版本的,其他人把这个AC代码改成了java版本等等,也可以请周围大神帮忙A几道等等,其实周围同学的算法功底真的说不上多强,反正是通过这种方法也算是把笔试给过了。其实笔试题吧,你把剑指offer刷一刷,leetcode刷个几百道(建议一个tag一个tag的刷),问题不大,我是通过刷leedcode,然后感觉这些公司的笔试题也就那么回事,还OK,当然阿里笔试题另说,还是A不了,真的变态!!!
面试:面试这个就看平时积累了。电话面试视频面试其实还是有一定操作空间的,现场面全凭自己实力。
四.平时积累篇
-------------------------------------------------------------------------------------------
下文中截图来源于我做的一个pdf版本的面经,把所以知识点的答案整理了下来,耗费我将近至少1个月时间,在本文最后部分把这个pdf分享给大家,觉得有用的麻烦点赞关注走一波,谢谢!!!面经中有我的知识点的答案,如下图示例,非常详细!!!
下文中截图来源于我做的一个pdf版本的面经,把所以知识点的答案整理了下来,耗费我将近至少1个月时间,在本文最后部分把这个pdf分享给大家,觉得有用的麻烦点赞关注走一波,谢谢!!!面经中有我的知识点的答案,如下图示例,非常详细!!!
下文中截图来源于我做的一个pdf版本的面经,把所以知识点的答案整理了下来,耗费我将近至少1个月时间,在本文最后部分把这个pdf分享给大家,觉得有用的麻烦点赞关注走一波,谢谢!!!面经中有我的知识点的答案,如下图示例,非常详细!!!
--------------------------------------------------------------------------------------------
1.数据结构与算法篇
你是java开发你就用java代码去实现,是C++开发就用C++去实现。
书籍参考:
(0)《图解算法》入门
(1)《剑指offer》 剑指Offer_编程题_牛客网
(2)《程序员代码面试指南 IT名企算法与数据结构题目最优解》参考左神视频
(3)leetcode LeetCode - The World's Leading Online Programming Learning Platform
leedcode注意去英文官网,别去中国区,中国区讨论区讨论的少。
leedcode 注意一个tag一个tag的刷,例如动态规划,就把动态规划下的题目都刷了,基本刷个10多道,其它也基本有思路了,而且动态规划的题目笔试面试也常出。其次就是二叉树,链表,数组,回溯的题目。
(4)数据结构(严蔚敏)/大话数据结构 //如果觉得教材无聊就可以看大话系列
需要掌握的知识点:
数组、链表、二叉树、队列、栈的各种操作(性能,场景)二分查找和各种变种的二分查找(循环有序数组找最大值最小值找n,有序数组找最左下标,最右下标)各类排序算法以及复杂度分析(快排、归并、堆、冒泡、直接选择、插入排序)各类算法题(手写)理解并可以分析时间和空间复杂度。动态规划(笔试回回有。。)、贪心。红黑树、AVL树、Hash树、Tire树、B树、B+ 树(除了红黑树,其它要会插入删除查找,红黑树如果会更好,也算一个亮点)。图算法(克鲁斯卡尔算法、普林母算法、迪克拉斯算法)树的前序后序中序遍历的递归非递归实现,层次遍历,深度优先遍历,广度优先遍历递归与非递归实现排序算法总结:常见排序算法小结 - CSDN博客
排序算法递归与非递归的java实现版本:
Lintcode 快排递归与非递归实现 464. 整数排序 II java
Lintcode 464. 整数排序 II 冒泡排序三种实现 直接插入排序 直接选择排序 java
Lintcode 464. 整数排序 II 归并排序递归与非递归实现 java
2.海量数据篇
看这一篇就足够用了,什么bitmap,布隆过滤器都得知道。
教你如何迅速秒杀掉:99%的海量数据处理面试题 - CSDN博客
3.计算机网络篇
参考书籍:《图解http》《图解TCP/IP》《TCP/IP详解卷1》《计算机网络(谢希仁)》
知识点:
所有的知识点,需要做到,不看面经,能知道答案是啥,自己可以用嘴说出来!!!
所有的知识点,需要做到,不看面经,能知道答案是啥,自己可以用嘴说出来!!!
所有的知识点,需要做到,不看面经,能知道答案是啥,自己可以用嘴说出来!!!
4.数据库篇
参考书籍:《高性能MySQL》 《MySQL技术内幕:InnoDB存储引擎(第2版)》
知识点:
5.操作系统篇
参考书籍:
知识点:《操作系统精髓与设计原理(原书第6版)》
LRU会手写一个LRU的set与get的时间复杂度是o(1)的代码
6.Linux命令篇
参考书籍:《linux 鸟哥的私房菜》
7.安全加密
8.重头戏java篇
基础篇:
推荐书籍:《Java程序员面试笔试宝典-何昊》突击java面试的好书啊!!!
《写给大忙人看的JavaSE8》 《深入理解Java虚拟机:JVM高级特性与最佳实践》
《JAVA并发编程实战》《Java多线程编程核心技术》《java核心技术卷1》
1.基础篇:
2.集合篇:
3.锁
4.多线程
多看看《Java多线程编程核心技术》这块就没问题
5.jdk中的concurrent 俗称juc包
都要搞懂底层原理!!!
都要搞懂底层原理!!!
都要搞懂底层原理!!!
6.java虚拟机
主要看《深入理解java虚拟机》
7.设计模式
参考书籍:《大话设计模式》
知道每种设计模式是啥意思,可以手写一个单例模式,手写适配器模式,工厂模式,观察者模式,装饰器模式。
知识点:
----------------------------------------------------------------------------------------------
基本把我上面列的知识点都搞懂,算法题都刷地明明白白的,不说battmd这些公司,至少我觉得互联网前50+
如果没有项目经验,想做项目,可以推荐你去淘宝上去买黑马视频,照着整个java web的项目、
-----------------------------------------------------------------------------------
附上我呕心沥血整理的java面经,觉得有用的点赞关注走一波!!!
附上我呕心沥血整理的java面经,觉得有用的点赞关注走一波!!!
附上我呕心沥血整理的java面经,觉得有用的点赞关注走一波!!!
关注我的公众号 现名字:程序员乔戈里
在后台回复:面经 按照要求即可获取到我的面经,也算是对我继续输出干货的一种鼓励。谢谢大家!!!
-------------------------------------------------------------------------------------------
1.实习对于找工作的作用???
答:很重要,也不重要。很重要:实习经历的作用:1.面试都是有固定的时间,比如一些公司规定一次面试最短时间是40分钟,你如果做过实习,可以好好加工一下你的实习经历,使劲吹,可以占个10分钟多点时间,然后后来问你的东西就少了些;2.学历不好的可以通过一些实习经历获得大公司的笔试面试的机会;3.在同等面试表现的前提下,有实习经历的优先考虑
不重要:
春招的暑期实习和提前批的时间冲突,春招的暑期实习和提前批的时间冲突,春招的暑期实习和提前批的时间冲突,(如果你现在距离秋招的8月还有挺长时间,如果获得实习机会直接就去,如果是7月和8月的实习得慎重,实习也不一定能留用)所以你如果春招找到的实习不是自己想最后工作的小公司,那么不建议去实习,不如好好准备秋招。如果是心仪的部门和岗位比如BAT之类的可以去实习。假如去实习了,一定要关注转正的事,好好努力,同时也别忘准备秋招,晚上和周末看书刷题看面经。没转正立马走人准备秋招。(实习的时候也可以投提前批电话面试,楼主当初没投,其实可以投几个单独招聘的提前批,比如百度很多部门都是自己招聘提前批的,不走系统,过了才录入系统)
完全可以用实习这段时间,好好复习,准备提前批也是个不错的选择,当然如果你前期准备充分,那么可以去实习,如果你时间已经非常紧了,比如你6月份才开始准备,人家8月份就提前批了,你去不去实习就得好好衡量了,大厂的实习一定要去,秋招加成不少。
2.啥时候开始准备?
现在!!!现在!!!现在!!!
3.没有java开发的项目咋办???
答:0.关注我的公众号:原名字:HIT程序猿的日常 现名字:程序员乔戈里
在我的公众号有我做过的一些项目的源码分享,以及一些练手项目的视频教程。
1.去淘宝买黑马的视频,照着做一个javaweb的项目,然后使劲扣项目,到时候就是和面试官吹,30元左右,没钱买的话,大家可以在我评论下众筹一波,哈哈哈啊哈哈哈。
2.淘宝买牛客网的项目视频,听说叶神的项目不错;
4.HR面试
一顿跪舔就行,就是你们公司真好,你自己罗列个123哪里好;女朋友,有也说没有(也可以说有,女朋友就在xx公司的地方上班/上学);父母不干涉决定;薪资,互联网的普遍薪资就行(适用于第一份offer,以及非常想去的公司)。总之就是求生欲强一些。
5.答主,我选算法还是开发呀?
你如果是北京时间2018.10.3号看见了我这篇回答,而且自己本身的学历不错本硕985/211专业都是计算机相关的,那么我强烈建议你选算法。原因有:1.算法工资比开发高;2.算法比开发轻松;你会说算法难啊,不好找啊!!!我不知道你怕啥,你就硬着头皮去整(每天高三一般的生活,如果你每天吊儿郎当的,最后没找到,怪我了,那你滚一边去哈,我不背这锅),你本身条件不错,最后肯定会有offer。而且有的公司,就算你算法不行,会问你可以转开发不,所以搞算法何乐而不为呢???
如果你是距离2019年或者8021年的临近秋招前的2-3个月时间看到我这篇回答,而且你学历不是很好,那么我建议你去整开发。
上述说的情况也不完全适用,反正就是follow your heart!!!
6.答主你咋不回复我评论啊???
你都不赞我,我也不想回复你。。。。
7.java开发需要看的书籍推荐???
具体请查看我的专栏文章
Java后端书架
非学生版
一、基础篇JVM
JVM内存结构
堆、栈、方法区、直接内存、堆和栈区别
Java内存模型
内存可见性、重排序、顺序一致性、volatile、锁、final
垃圾回收
内存分配策略、垃圾收集器(G1)、GC算法、GC参数、对象存活的判定
JVM参数及调优Java对象模型
oop-klass、对象头
HotSpot
即时编译器、编译优化
类加载机制
classLoader、类加载过程、双亲委派(破坏双亲委派)、模块化(jboss modules、osgi、jigsaw)
虚拟机性能监控与故障处理工具
jps, jstack, jmap、jstat, jconsole, jinfo, jhat, javap, btrace、TProfiler
编译与反编译
javac 、javap 、jad 、CRF
Java基础知识
阅读源代码
String、Integer、Long、Enum、BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、ArrayList & LinkedList、 HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet & TreeSet
Java中各种变量类型熟悉Java String的使用,熟悉String的各种函数
JDK 6和JDK 7中substring的原理及区别、
replaceFirst、replaceAll、replace区别、
String对“+”的重载、
String.valueOf和Integer.toString的区别、
字符串的不可变性
自动拆装箱
Integer的缓存机制
熟悉Java中各种关键字
transient、instanceof、volatile、synchronized、final、static、const 原理及用法。
集合类
常用集合类的使用
ArrayList和LinkedList和Vector的区别
SynchronizedList和Vector的区别
HashMap、HashTable、ConcurrentHashMap区别
Java 8中stream相关用法
apache集合处理工具类的使用
不同版本的JDK中HashMap的实现的区别以及原因
枚举
枚举的用法、枚举与单例、Enum类
Java IO&Java NIO,并学会使用
bio、nio和aio的区别、三种IO的用法与原理、netty
Java反射与javassist
反射与工厂模式、
Java序列化
什么是序列化与反序列化、为什么序列化
序列化底层原理
序列化与单例模式
protobuf
为什么说序列化并不安全
注解
元注解、自定义注解、Java中常用注解使用、注解与反射的结合
JMS
什么是Java消息服务、JMS消息传送模型
JMX
、
泛型
泛型与继承
类型擦除
泛型中K T V E
object等的含义、泛型各种用法
单元测试
junit、mock、mockito、内存数据库(h2)
正则表达式
常用的Java工具库
,
什么是API&SPI异常
异常类型、正确处理异常、自定义异常
时间处理
时区、时令、Java中时间API
编码方式
解决乱码问题、常用编码方式
语法糖
Java中语法糖原理、解语法糖
Java并发编程
什么是线程,与进程的区别阅读源代码,并学会使用
Thread、Runnable、Callable、ReentrantLock、ReentrantReadWriteLock、Atomic*、Semaphore、CountDownLatch、、ConcurrentHashMap、Executors
线程池
自己设计线程池、submit() 和 execute()
线程安全
死锁、死锁如何排查、Java线程调度、线程安全和内存模型的关系
锁
CAS、乐观锁与悲观锁、数据库相关锁机制、分布式锁、偏向锁、轻量级锁、重量级锁、monitor、锁优化、锁消除、锁粗化、自旋锁、可重入锁、阻塞锁、死锁
死锁volatile
happens-before、编译器指令重排和CPU指令重
synchronized
synchronized是如何实现的?
synchronized和lock之间关系
不使用synchronized如何实现一个线程安全的单例
sleep 和 waitwait 和 notifynotify 和 notifyAllThreadLocal写一个死锁的程序写代码来解决生产者消费者问题守护线程
守护线程和非守护线程的区别以及用法
二、 进阶篇Java底层知识
字节码、class文件格式CPU缓存,L1,L2,L3和伪共享尾递归位运算
用位运算实现加、减、乘、除、取余
设计模式
了解23种设计模式会使用常用设计模式
单例、策略、工厂、适配器、责任链。
实现AOP实现IOC不用synchronized和lock,实现线程安全的单例模式nio和reactor设计模式
网络编程
tcp、udp、http、https等常用协议
三次握手与四次关闭、流量控制和拥塞控制、OSI七层模型、tcp粘包与拆包
http/1.0 http/1.1 http/2之前的区别Java RMI,Socket,HttpClientcookie 与 session
cookie被禁用,如何实现session
用Java写一个简单的静态文件的HTTP服务器
实现客户端缓存功能,支持返回304 实现可并发下载一个文件 使用线程池处理客户端请求 使用nio处理客户端请求 支持简单的rewrite规则 上述功能在实现的时候需要满足“开闭原则”了解nginx和apache服务器的特性并搭建一个对应的服务器用Java实现FTP、SMTP协议进程间通讯的方式什么是CDN?如果实现?什么是DNS?反向代理
框架知识
Servlet线程安全问题Servlet中的filter和listenerHibernate的缓存机制Hiberate的懒加载Spring Bean的初始化Spring的AOP原理自己实现Spring的IOCSpring MVCSpring Boot2.0
Spring Boot的starter原理,自己实现一个starter
Spring Security
应用服务器
JBosstomcatjettyWeblogic
工具
git & svnmaven & gradle
三、 高级篇新技术
Java 8
lambda表达式、Stream API、
Java 9
Jigsaw、Jshell、Reactive Streams
Java 10
局部变量类型推断、G1的并行Full GC、ThreadLocal握手机制
Spring 5
响应式编程
Spring Boot 2.0
性能优化
使用单例、使用Future模式、使用线程池、选择就绪、减少上下文切换、减少锁粒度、数据压缩、结果缓存
线上问题分析
dump获取
线程Dump、内存Dump、gc情况
dump分析
分析死锁、分析内存泄露
自己编写各种outofmemory,stackoverflow程序
HeapOutOfMemory、 Young OutOfMemory、MethodArea OutOfMemory、ConstantPool OutOfMemory、DirectMemory OutOfMemory、Stack OutOfMemory Stack OverFlow
常见问题解决思路
内存溢出、线程死锁、类加载冲突
使用工具尝试解决以下问题,并写下总结
当一个Java程序响应很慢时如何查找问题、
当一个Java程序频繁FullGC时如何解决问题、
如何查看垃圾回收日志、
当一个Java应用发生OutOfMemory时该如何解决、
如何判断是否出现死锁、
如何判断是否存在内存泄露
编译原理知识
编译与反编译Java代码的编译与反编译Java的反编译工具词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化
操作系统知识
Linux的常用命令进程同步缓冲区溢出分段和分页虚拟内存与主存
数据库知识
MySql 执行引擎MySQL 执行计划
如何查看执行计划,如何根据执行计划进行SQL优化
SQL优化事务
事务的隔离级别、事务能不能实现锁的功能
数据库锁
行锁、表锁、使用数据库锁实现乐观锁、
数据库主备搭建binlog内存数据库
h2
常用的nosql数据库
redis、memcached
分别使用数据库锁、NoSql实现分布式锁性能调优
数据结构与算法知识
简单的数据结构
栈、队列、链表、数组、哈希表、
树
二叉树、字典树、平衡树、排序树、B树、B+树、R树、多路树、红黑树
排序算法
各种排序算法和时间复杂度 深度优先和广度优先搜索 全排列、贪心算法、KMP算法、hash算法、海量数据处理
大数据知识
Zookeeper
基本概念、常见用法
Solr,Lucene,ElasticSearch
在linux上部署solr,solrcloud,,新增、删除、查询索引
Storm,流式计算,了解Spark,S4
在linux上部署storm,用zookeeper做协调,运行storm hello world,local和remote模式运行调试storm topology。
Hadoop,离线计算
HDFS、MapReduce
分布式日志收集flume,kafka,logstash数据挖掘,mahout
网络安全知识
什么是XSS
XSS的防御
什么是CSRF什么是注入攻击
SQL注入、XML注入、CRLF注入
什么是文件上传漏洞加密与解密
MD5,SHA1、DES、AES、RSA、DSA
什么是DOS攻击和DDOS攻击
memcached为什么可以导致DDos攻击、什么是反射型DDoS
SSL、TLS,HTTPS如何通过Hash碰撞进行DOS攻击用openssl签一个证书部署到apache或nginx
四、架构篇分布式
数据一致性、服务治理、服务降级
分布式事务
2PC、3PC、CAP、BASE、 可靠消息最终一致性、最大努力通知、TCC
Dubbo
服务注册、服务发现,服务治理
分布式数据库
怎样打造一个分布式数据库、什么时候需要分布式数据库、mycat、otter、HBase
分布式文件系统
mfs、fastdfs
分布式缓存
缓存一致性、缓存命中率、缓存冗余
微服务
SOA、康威定律
ServiceMeshDocker & KubernetsSpring BootSpring Cloud
高并发
分库分表CDN技术消息队列
ActiveMQ
监控
监控什么
CPU、内存、磁盘I/O、网络I/O等
监控手段
进程监控、语义监控、机器资源监控、数据波动
监控数据采集
日志、埋点
Dapper
负载均衡
tomcat负载均衡、Nginx负载均衡
DNS
DNS原理、DNS的设计
CDN
数据一致性
五、 扩展篇云计算
IaaS、SaaS、PaaS、虚拟化技术、openstack、Serverlsess
搜索引擎
Solr、Lucene、Nutch、Elasticsearch
权限管理
Shiro
区块链
哈希算法、Merkle树、公钥密码算法、共识算法、Raft协议、Paxos 算法与 Raft 算法、拜占庭问题与算法、消息认证码与数字签名
比特币
挖矿、共识机制、闪电网络、侧链、热点问题、分叉
以太坊超级账本
人工智能
数学基础、机器学习、人工神经网络、深度学习、应用场景。
常用框架
TensorFlow、DeepLearning4J
其他语言
Groovy、Python、Go、NodeJs、Swift、Rust
六、 推荐书籍
《深入理解Java虚拟机》
《Effective Java》
《深入分析Java Web技术内幕》
《大型网站技术架构》
《代码整洁之道》
《Head First设计模式》
《maven实战》
《区块链原理、设计与应用》
《Java并发编程实战》
《鸟哥的Linux私房菜》
《从Paxos到Zookeeper》
《架构即未来》
以下是我的编程资料,还有其他的将近3T需要的关注我公众号程序员乔戈里:
最后推广一下我的公众号,名字:程序员乔戈里 公众号中有我的联系方式,有上述所以知识点的所有答案的面经整合版,也有我收集的一些java有关的资源,各种视频教程,我的一些校招经历,相关电子书籍,以及未来的干货分享,相信不会让大家失望,谢谢大家,来一波关注,谢谢,也算是对我的这篇回答的一个肯定,您的点赞与关注是我创作分享干货的源泉!!!您的点赞与关注是我创作分享干货的源泉!!!您的点赞与关注是我创作分享干货的源泉!!!
没有基础的人学java开发难吗?
编程语言Java,已经21岁了。从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的。
Java应用的广泛已经到了“无处不用”的盛世,而且一直在语言排行榜榜首,从未被超越。废话不多说,今天主要是给大家讲讲怎样学习Java,给大家建议一条轻松精通Java的学习路线。有了相对标准的流程,那么你的学习效率一定会倍增。
入门阶段,主要是培养Java语言的编程思想。了解Java语言的语法,书写规范等,掌握Eclipse、MyEclipse等开发工具,编写Java代码的能力。学完这个阶段你应该可进行小型应用程序开发并且可以对数据库进行基本的增删改查管理。注意:此阶段知识点的学习,会有真实的项目进行驱动学习,让你轻松理解各知识点。
1计算机基础知识
针对零基础学习的人,从对计算机操作等知识的了解,延伸到Java语言的发展与开发工具的使用上。主要是让你知道怎样执行计算机命令,认识Java这门语言,感受编程语言Java怎么开发程序。
1) 计算机基础
让零基础学习的人先了解计算机相关知识,进而再去了解Java语言。
2) DOS常用命令
了解什么是DOS,并掌握DOS控制台的打开方式,同时熟悉常用的DOS命令,例如:盘符切换、进入指定目录、删除文件等,完成使用DOS命令对计算机进行操作和控制。
3) Java概述
了解Java语言的发展史、Java语言平台版本、Java语言的特点,以及JRE与JDK。JRE是Java的运行环境,JDK是Java开发工具包,它包含了Java的开发工具以及JRE。所以安装了JDK就不用再单独安装JRE了。
4) JDK环境安装配置
了解了什么是JDK,以及JDK的重要性,下一步我们就来学习如何安装和配置JDK环境。在安装JDK之前,我们首先需要下载JDK,针对不同的系统,我们需要下载不用版本的JDK。
5) 环境变量配置
了解path、classpath环境变量,理解path变量和classpath变量的作用,并掌握path变量和classpath变量的配置方式。
6) Java程序入门
当JDK、环境变量配置完毕,我们就可以开始 编写Java程序。编写Java程序可以使用如下几种工具:notepad(微软操作系统自带)、Editplus、Notepad++、Eclipse、MyEclipse,sublime等等。
2编程基础
此模块学习是让你了解编程的具体流程,学习Java基础语法的格式等。具体要掌握不同数据类型的变量定义与使用,掌握不同运算符的运算规则,掌握流程控制语句的执行流程,编写方法的声明与调用,创建数组并访问数组元素等知识。
1) 注释
在程序开发工程中,用于解释和说明程序的文字我们称之为注释,Java中的注释分为以下几种:单行注释、多行注释、文档注释。
2) 关键字
了解Java关键字的含义及特点,掌握关键字使用的注意事项。
3) 标识符
了解什么是标识符,标识符的组成规则,以及标识符使用时的注意事项。
4) 常量与变量
理解常量与变量的含义,并掌握常量与变量的区别、变量的定义格式以及变量的赋值。
5) 数据类型
掌握Java语言的数据类型,如基本数据类型:byte、short、int、long、float、double、char、boolean,以及引用类型:类、接口、数组。
6) 运算符
熟练掌握Java中的运算符:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三目运算符。
7) 流程控制语句
了解什么是流程控制语句,掌握以下流程控制语句:顺序结构、选择结构、循环结构,并能够通过流程控制语句实现特定的功能。
8) 方法
掌握方法的定义及格式,并能正确的调用方法,理解方法的调用过程,同时清楚方法的注意事项;掌握方法重载及其特点。
9) 数组
了解数组的概念,掌握数组的定义格式、静态初始化、动态初始化,并能够理解Java中数组的内存图解。熟练掌握数组的遍历、获取最值、数组元素逆序、数组元素查找、数组排序和二分查找,以及二维数组的定义格式及初始化。
3面向对象
现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即动态部分与静态部分。静态部分,顾名思义就是不能动的部分,这个部分被称为“属性”,任何对象都会具备其自身属性,如一个人,它包括高矮、胖瘦、性别、年龄等属性。然而具有这些属性的人会执行哪些动作也是一个值得探讨的部分,这个人可以哭泣、微笑、说话、行走,这些是这个人具备的行为(动态部分),人类通过探讨对象的属性和观察对象的行为了解对象。
1) 面向对象思想
了解面向过程编程思想,能够通过案例理解Java的面向对象编程思想,了解面向对象开发、设计、特征。
2) 类与对象
了解什么是类,什么是对象,并理解类与对象之间的关系;熟练掌握类的定义、对象内存图等。
3) 成员变量和局部变量
了解什么是成员变量,什么是局部变量,以及从他们在类中的位置、内存中的位置、生命周期、初始化值等方面掌握他们的区别。
4) 匿名对象
了解什么是匿名对象,掌握匿名对象的两种使用情况。
5) 封装
清楚的了解什么是封装,并能够理解封装的优点与缺点,同时掌握封装的原则。
6) this关键字
掌握this关键字的含义与使用。
7) 构造方法
了解什么是构造方法,构造方法的作用,以及与构造方法相关的注意事项。
8) 继承
理解什么是继承,继承的好处以及java中继承的特点和注意事项,继承中成员变量的关系、构造方法的关系、成员方法的关系,方法重写与方法重载的区别。
9) 多态
理解什么是多态,掌握多态案例及成员访问的特点,多态的优点和缺点,多态中的转型问题。
10) 抽象类
了解什么是抽象类,抽象类的特点,抽象类成员的特点。
11) 接口
了解什么是接口,接口的特点,接口成员的特点,类与类、类与接口的关系,以及抽象类与接口的区别。
12) 内部类
什么是内部类,内部类的访问特点,内部类的位置,什么是成员内部类、局部内部类、匿名内部类,以及匿名内部类在开发中的使用。
4常用类
类库就是Java API(Application Programming Interface,应用程序接口),是系统提供的已实现的标准类的集合。在程序设计中,合理和充分利用类库提供的类和接口,不仅可以完成字符串处理、绘图、网络应用、数学计算等多方面的工作,而且可以大大提高编程效率,使程序简练、易懂。
学习内容:掌握Object类、Scanner类、String类、StringBuffer类、StringBuilder类、Arrays类、基本包装类、正则表达式、Math类、Random类、System类、Date类、DateFormate类、Calendar类,及其常用方法。
5集合
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用。简单一点就是说,集合是存放数据的容器。
学习内容:什么是集合?数组与集合有什么区别,集合类的特点,掌握Collection接口、Iterator接口、List接口、ListIterator接口、ArrayList类、Vector类、LinkedList类、泛型、Set接口、HashSet类、Map接口、HashMap类、LinkedHashMap类等。
6IO
IO(Input/Output)是计算机输出/输出的接口。Java的核心库http://java.io提供了全面的IO接口,包括:文件读写,标准设备输出等等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。
1) 异常
了解什么是异常,异常的由来,常见的异常,异常的分类,掌握jvm对异常的默认处理方案,异常的处理方案:try…catch…finally、throws,什么是编译时异常,什么是运行时异常,掌握它们两的区别,throws关键字、throw关键字,以及这两个关键字的区别,熟练掌握自定义异常,异常注意事项。
2) File类
了解什么是File类,File类的用途,掌握File类的方法:createNewFile()、mkdir()、mkdirs()、delete()、renameTo(File dest)、isDirectory()、isFile()、exists()、等方法,以及File类的基本获取功能方法和高级获取功能方法。
3) IO流
了解什么是IO流,IO流的用途;熟练掌握输入流、输出流、字符流、字节流、IO流的常用基类;如何使用字节流读写数据、复制数据;什么是字节缓冲流,如何使用字节缓冲流读写数据;什么是转换流,如何使用转换流更加高效的读写数据,内存操作流、打印流、标准输入输出流、序列化流、Properties集合。
4) IO流练习
(1) 复制文本文件;
(2) 复制图片;
(3) 把ArrayList集合中的字符串数据存储到文本文件;
(4) 从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合;
(5) 复制单极文件夹;
(6) 复制单极文件夹中指定文件并修改文件名称;
(7) 复制多极文件夹;
(8) 已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl”;
(9) 请编写程序读取数据内容,把数据排序后写入ss.txt中;
(10) 获取每次读取数据的行号;
(11) 登录注册IO版。
7多线程
是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。
1) 多线程
了解什么是线程,什么是多线程,理解java程序的运行原理,掌握多线程的实现方案,如何获取和设置线程名称、线程的生命周期、如何解决线程安全问题、线程同步、Lock锁、死锁问题、线程间通信、线程的状态及状态转换、线程池。
2) 多线程面试题
(1) 多线程有几种实现方案,分别是哪几种?
(2) 同步有几种方式,分别是什么?
(3) 启动一个线程是run()还是start()?它们的区别?
(4) sleep()和wait()方法的区别;
(5) 为什么wait(),notify(),notifyAll()等方法都定义在Object类中;
(6) 线程的生命周期图。
3) 设计模式
了解什么是设计模式,设计模式的分类,熟练掌握单例设计模式(懒汉式、饿汉式)。
8 网络编程
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。
9反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
DevExpress中如何实现GridControl的分页功能?
加入两个组件:BindingNavigator和BindingSource
技术分享
技术分享
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DZAMS.DBUtility;
namespace DZAMS.Demo
{
public partial class GridPage_Frm : DevExpress.XtraEditors.XtraForm
{
public DataTable dt = new DataTable();
StoreProcedure sp;
private int pageSize = 10; //每页显示行数
private int nMax = 0; //总记录数
private int pageCount = 0; //页数=总记录数/每页显示行数
private int pageCurrent = 0; //当前页号
private DataSet ds = new DataSet();
private DataTable dtInfo = new DataTable();
public GridPage_Frm()
{
InitializeComponent();
}
private void GridPage_Frm_Load(object sender, EventArgs e)
{
string strQuery = string.Format("SELECT Id, UserCode, UserName, RoleName, Ip, Mac, LoginTime FROM DZ_LoginLog");
dt = SqlHelper.ExecuteDataset(SqlHelper.conn, CommandType.Text, strQuery.ToString()).Tables[0];
gridControl1.DataSource = dt;
string strConn = "SERVER=(local);DATABASE=DZ;UID=sa;PWD=XXXX"; //数据库连接字符串
SqlConnection conn = new SqlConnection(strConn);
conn.Open();
string strSql = "SELECT count(*) as num FROM DZ_LoginLog";
SqlDataAdapter sda = new SqlDataAdapter(strSql, conn);
sda.Fill(ds, "ds");
conn.Close();
nMax = Convert.ToInt32(ds.Tables[0].Rows[0]["num"].ToString());
lblTotalCount.Text = nMax.ToString();
lblPageSize.Text = pageSize.ToString();
sp = new StoreProcedure("Pr_Monitor_Pagination", strConn);
dtInfo = sp.ExecuteDataTable("DZ_LoginLog", "Id", "Id desc", pageCurrent++, pageSize);
InitDataSet();
}
private void InitDataSet()
{
pageCount = (nMax / pageSize); //计算出总页数
if ((nMax % pageSize) > 0) pageCount++;
pageCurrent = 1; //当前页数从1開始
LoadData();
}
private void LoadData()
{
lblPageCount.Text = "/"+pageCount.ToString();
txtCurrentPage.Text = Convert.ToString(pageCurrent);
this.bdsInfo.DataSource = dtInfo;
this.bdnInfo.BindingSource = bdsInfo;
this.gridControl1.DataSource = bdsInfo;
}
private void bdnInfo_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
if (e.ClickedItem.Text == "导出当前页")
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Title = "导出Excel";
saveFileDialog.Filter = "Excel文件(*.xls)|*.xls";
DialogResult dialogResult = saveFileDialog.ShowDialog(this);
if (dialogResult == DialogResult.OK)
{
DevExpress.XtraPrinting.XlsExportOptions options = new DevExpress.XtraPrinting.XlsExportOptions();
gridControl1.ExportToXls(saveFileDialog.FileName, options);
// gridControl1.ExportToExcelOld(saveFileDialog.FileName);
DevExpress.XtraEditors.XtraMessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
if (e.ClickedItem.Text == "关闭")
{
this.Close();
}
if (e.ClickedItem.Text == "首页")
{
pageCurrent--;
if (pageCurrent <= 0)
{
MessageBox.Show("已经是首页。请点击“下一页”查看!");
return;
}
else
{
pageCurrent = 1;
dtInfo = sp.ExecuteDataTable("DZ_LoginLog", "Id", "Id desc", pageCurrent, pageSize);
}
}
if (e.ClickedItem.Text == "上一页")
{
pageCurrent--;
if (pageCurrent <= 0)
{
MessageBox.Show("已经是第一页,请点击“下一页”查看!");
return;
}
else
{
dtInfo = sp.ExecuteDataTable("DZ_LoginLog", "Id", "Id desc", pageCurrent, pageSize);
}
}
if (e.ClickedItem.Text == "下一页")
{
pageCurrent++;
if (pageCurrent > pageCount)
{
MessageBox.Show("已经是最后一页。请点击“上一页”查看。");
return;
}
else
{
dtInfo = sp.ExecuteDataTable("DZ_LoginLog", "Id", "Id desc", pageCurrent, pageSize);
}
}
if (e.ClickedItem.Text == "尾页")
{
pageCurrent++;
if (pageCurrent > pageCount)
{
MessageBox.Show("已经是尾页,请点击“上一页”查看。");
return;
}
else
{
pageCurrent = pageCount;
dtInfo = sp.ExecuteDataTable("DZ_LoginLog", "Id", "Id desc", pageCount, pageSize);
}
}
LoadData();
}
}
}
StoreProcedure类:
public class StoreProcedure
{
// 存储过程名称。
private string _name;
// 数据库连接字符串。
private string _conStr;
// 构造函数
// sprocName: 存储过程名称;
// conStr: 数据库连接字符串。
public StoreProcedure(string sprocName, string conStr)
{
_conStr = conStr;
_name = sprocName;
}
// 运行存储过程,不返回值。
// paraValues: 參数值列表。
// return: void
public void ExecuteNoQuery(params object[] paraValues)
{
using (SqlConnection con = new SqlConnection(_conStr))
{
SqlCommand comm = new SqlCommand(_name, con);
comm.CommandType = CommandType.StoredProcedure;
AddInParaValues(comm, paraValues);
con.Open();
comm.ExecuteNonQuery();
con.Close();
}
}
// 运行存储过程返回一个表。
// paraValues: 參数值列表。
// return: DataTable
public DataTable ExecuteDataTable(params object[] paraValues)
{
SqlCommand comm = new SqlCommand(_name, new SqlConnection(_conStr));
comm.CommandType = CommandType.StoredProcedure;
AddInParaValues(comm, paraValues);
SqlDataAdapter sda = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
sda.Fill(dt);
return dt;
}
// 运行存储过程。返回SqlDataReader对象。
// 在SqlDataReader对象关闭的同一时候。数据库连接自己主动关闭。
// paraValues: 要传递给给存储过程的參数值类表。
// return: SqlDataReader
public SqlDataReader ExecuteDataReader(params object[] paraValues)
{
SqlConnection con = new SqlConnection(_conStr);
SqlCommand comm = new SqlCommand(_name, con);
comm.CommandType = CommandType.StoredProcedure;
AddInParaValues(comm, paraValues);
con.Open();
return comm.ExecuteReader(CommandBehavior.CloseConnection);
}
// 获取存储过程的參数列表。
private ArrayList GetParas()
{
SqlCommand comm = new SqlCommand("dbo.sp_sproc_columns_90",
new SqlConnection(_conStr));
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.AddWithValue("@procedure_name", (object)_name);
SqlDataAdapter sda = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
sda.Fill(dt);
ArrayList al = new ArrayList();
for (int i = 0; i < dt.Rows.Count; i++)
{
al.Add(dt.Rows[i][3].ToString());
}
return al;
}
// 为 SqlCommand 加入參数及赋值。
private void AddInParaValues(SqlCommand comm, params object[] paraValues)
{
comm.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.Int));
comm.Parameters["@RETURN_VALUE"].Direction =
ParameterDirection.ReturnValue;
if (paraValues != null)
{
ArrayList al = GetParas();
for (int i = 0; i < paraValues.Length; i++)
{
comm.Parameters.AddWithValue(al[i + 1].ToString(),
paraValues[i]);
}
}
}
}
存储过程:
ALTER procedure [dbo].[Pr_Monitor_Pagination]
-- ============================================= == Paging == =============================================
--Author: Lee
--Create date: 2010\06\11
--Parameter:
-- 1.Tables :The Name Of Table or view
-- 2.PrimaryKey :Primary Key
-- 3.Sort :Ordering Statement,Without Order By, For Example:NewsID Desc,OrderRows Asc
-- 4.CurrentPage :The Page Number Of Current page
-- 5.PageSize :The Size Of One Page‘s Group
-- 6.Fields :The Field Of You Needed
-- 7.Filter :Where Condition,Without Where
-- 8.Group :Group Condition。Without Group By
-- 9.GetCount :Return The Number Of All, Not Zero
--Updates:
-- 2010\06\09 Create Procedure.
-- ========================================================================================================
@Tables varchar(600),
@PrimaryKey varchar(100),
@Sort varchar(200)=null,
@CurrentPage bigint=1,
@PageSize bigint=10,
@Fields varchar(1000)=‘*‘,
@Filter varchar(1000)=null,
@Group varchar(1000)=null,
@GetCount bit=0
as
if(@GetCount=0)
begin
/*Ordering Of Default */
if @Sort is null or @Sort=‘‘
set @Sort=@PrimaryKey
declare @SortTable varchar(100)
declare @SortName varchar(100)
declare @strSortColumn varchar(200)
declare @operator char(2)
declare @type varchar(100)
declare @prec int
/*Setting Condition Of Ordering*/
if charindex(‘desc‘,@Sort)>0
begin
set @strSortColumn=replace(@Sort,‘desc‘,‘‘)
set @operator=‘<=‘
end
else
begin
if charindex(‘asc‘,@Sort)=0
set @strSortColumn=replace(@Sort,‘asc‘,‘‘)
set @operator=‘>=‘
end
if charindex(‘.‘,@strSortColumn)>0
begin
set @SortTable=substring(@strSortColumn,0,charindex(‘.‘,@strSortColumn))
set @SortName=substring(@strSortColumn,charindex(‘.‘,@strSortColumn)+1,len(@strSortColumn))
end
else
begin
set @SortTable=@Tables
set @SortName=@strSortColumn
end
select @type=t.name,@prec=c.prec from sysobjects o join syscolumns c on o.id=c.id join systypes t on c.xusertype=t.xusertype where o.name=@SortTable and c.name=@SortName
if charindex(‘char‘,@type)>0
set @type=@type+‘(‘+cast(@prec as varchar)+‘)‘
declare @strPageSize varchar(50)
declare @strStartRow varchar(50)
declare @strFilter varchar(1000)
declare @strSimpleFilter varchar(1000)
declare @strGroup varchar(1000)
/*CurrentPage Of Default*/
if @CurrentPage<1
set @CurrentPage=1
/*Setting Paging param*/
set @strPageSize=cast(@PageSize as varchar(50))
set @strStartRow=cast(((@CurrentPage-1)*@PageSize+1) as varchar(50))
/*Condition Of Filter And Group*/
if @Filter is not null and @Filter!=‘‘
begin
set @strFilter=‘ where ‘+@Filter+‘ ‘
set @strSimpleFilter=‘ and ‘+@Filter +‘ ‘
end
else
begin
set @strSimpleFilter=‘‘
set @strFilter=‘‘
end
if @Group is not null and @Group!=‘‘
set @strGroup=‘ group by ‘+@Group+‘ ‘
else
set @strGroup=‘‘
exec(‘ declare @SortColumn ‘+ @type + ‘ set RowCount ‘ + @strStartRow+ ‘ select @SortColumn=‘ + @strSortColumn + ‘ from ‘ + @Tables+ @strFilter + ‘ ‘ + @strGroup + ‘ Order by ‘ + @Sort+ ‘ set rowcount ‘ + @strPageSize + ‘ select ‘ + @Fields + ‘ from ‘ + @Tables + ‘ where ‘ + @strSortColumn + @operator+ ‘@SortColumn ‘ + @strSimpleFilter + ‘ ‘ + @strGroup + ‘ Order by ‘ + @Sort + ‘ ‘)
end
else
begin
declare @strSQL varchar(5000)
if @Filter !=‘‘
set @strSQL = ‘select count(‘ + @PrimaryKey + ‘) as Total from [‘ + @Tables + ‘] where ‘ + @Filter
else
set @strSQL = ‘select count(‘ + @PrimaryKey + ‘) as Total from [‘ + @Tables + ‘]‘
exec(@strSQL)
end
效果:
技术分享


还没有评论,来说两句吧...