精华内容
下载资源
问答
  • java开发必备技能 1.概述 Java开发人员需要具有构建企业级软件的核心技能。 在本教程中,我们将看到Java开发人员的必备技能。 2. Java开发人员必须具备技能 为了使Java开发人员开发和集成业务应用程序,该人员...

    java开发必备技能

    1.概述

    Java开发人员需要具有构建企业级软件的核心技能。 在本教程中,我们将看到Java开发人员的必备技能。

    2. Java开发人员必须具备技能

    为了使Java开发人员开发和集成业务应用程序,该人员需要具有核心技能。 人员需要了解客户的愿景和业务需求才能开发企业级应用程序。 程序员每天需要练习Java至少两个小时。 他(她)需要了解Core Java,Java EE,Servlet,JSP,Hibernate,Spring框架,Android,Docker和诸如MERN,MEAN的前端技术和技术堆栈。 这个人需要了解面向对象的编程概念。 程序员需要了解Web服务,多线程,Spring Boot,云部署,Java虚拟机,微服务架构,依赖项注入和MVC框架的API Centric应用程序

    我相信您会听说过上述有关Java开发人员具备的技能。 本文有助于定义将程序员提升到开发人员级别的核心技能。 这些技能分为核心(必备),高级和复杂技能。

    Java开发人员-必备技能
    必备技能

    “像大多数其他学科一样,学习编程艺术的过程包括首先学习规则,然后学习何时打破规则。”

    Joshua Bloch,有效的Java编程语言指南

    现在,让我们来看一个成为Java开发人员的必备技能。

    2.1数据结构

    一个人需要具备解决问题​​的能力和软件开发技能才能成为Java开发人员。 数据组织和实际解决方案是开发人员需要具备的基本概念。 开发人员需要学习的数据结构如下:

    对于开发人员而言,重要的是要知道如何选择一种数据结构,以及为特定情况选择哪种结构。 目的是在选择数据结构时消耗更少的内存并在短时间内解决问题。

    2.2算法

    对于开发人员来说,算法是非常重要的概念。 在时间和空间上不同算法的性能是选择正确算法的重要因素。 开发人员要了解的算法列表如下:

    • 散列
    • 排序
    • 正在搜寻
    • 递归
    • 快取

    2.3安全性

    开发人员需要了解Web /桌面/移动应用程序的安全性。 这个人需要学习数据的加密和解密。 开发人员需要了解以下列出的不同类型的安全攻击:

    • 恶意软件
    • 拒绝服务
    • 中间的人
    • 鱼叉式网络钓鱼
    • 驶过
    • 密码
    • SQL注入
    • 跨站脚本
    • 窃听
    • 生日

    开发人员需要了解RSA,AES和其他类型的加密算法。 这个人需要对公钥密码学有所了解。

    2.4数据库

    开发人员需要了解数据库驱动的应用程序的开发。 该人员需要知道如何在关系数据库和无SQL数据库上使用SQL处理创建,读取,更新和删除JDBC操作。 开发人员需要了解数据库安全性并保护数据库存储中的数据安全。 他或她需要对JPA(Java持久性API)和ORM(对象关系映射)框架有基本的了解。

    Java开发人员-CRUD操作
    CRUD操作

    2.5性能

    开发人员需要了解Java应用程序的性能调整和性能分析。 该人员需要学习虚拟机,内存管理,类加载和反射概念。 开发人员需要具有解决与内存泄漏,性能和崩溃相关的问题的技能。 他(她)需要知道如何使用日志记录,监视和调试框架及工具来开发Web应用程序。

    Java开发人员-性能概念
    绩效概念

    2.6源代码控制

    开发人员需要了解源代码控制和版本控制的概念和操作。 该人员需要学习诸如Git,SVN,Gitlab,BitBucker和Mercurial源代码管理管理工具之类的软件。 该人员应该知道如何创建分支并将其与master分支合并。 他或她应该能够创建拉取请求。 开发人员应该能够比较不同的版本并查看工件的历史记录。

    2.7作业系统

    开发人员需要了解操作系统的基础知识。 该人员需要了解内存管理,进程通信,分布式系统,线程,阻塞和文件处理概念。 开发人员需要了解流行的操作系统,例如Linux,Mac,Unix和Windows。 这个人应该学习移动操作系统,例如Android和IOS。

    2.8联网

    开发人员应了解下面列出的网络基础知识和概念:

    • 插座
    • 系统程式设计
    • 网络编程
    • HTTP协议
    • 网络流量分析
    • 了解FTP,Telnet,SSL和其他协议

    2.9软件开发生命周期

    开发人员需要了解软件开发生命周期。 他(她)需要知道生命周期的各个阶段。 该人员需要了解需求收集,架构,设计,开发,测试,部署和维护阶段。 开发人员应该能够进行单元测试以及开发功能和回归测试。

    Java开发人员-SDLC
    SDLC

    2.10 IDE

    开发人员需要知道如何使用IDE(例如Eclipse,Netbeans和IntelliJ)来开发软件。 他(她)应该学习如何编译和调试代码。 这个人需要知道签入代码并在IDE上执行应用程序。

    集成开发环境

    2.11文字编辑器

    开发人员需要知道如何使用文本编辑器(例如Notepad ++,Sublime,Atom,Bracket,EMac和Edit Pad)创建应用程序。 他(她)需要知道键盘快捷键以提高个人生产力。 开发人员应该能够使用文本编辑器管理文件的多个版本。

    2.12构建工具

    Java开发人员应该能够使用Ant,Maven和Gradle构建工具构建Java桌面,Web和移动应用程序。 他或她需要将单元测试,回归测试和功能测试与构建集成在一起,以确保构建不被破坏。 开发人员应该能够识别构建的依赖关系,并配置要下载的构建工具。

    2.13 DevOps

    开发人员需要了解DevOps和连续集成工具(例如Jenkins,Chef,Puppet和Ansible)的用法。 在使用DevOps构建到不同的云环境后,该人应该能够部署应用程序。 开发人员应该能够使用DevOps Framework监视应用程序。

    3.总结

    综上所述,以下是Java开发人员的必备技能,它们是核心知识和基础知识:

    必备技能

    “岁月不待人。”

    谚语

    随着时间的流逝,开发人员需要赶上即将到来的新技术。 他或她需要使用新技能来更新自己,以跟上Java世界的创新步伐。

    翻译自: https://www.javacodegeeks.com/java-developer-must-have-skills.html

    java开发必备技能

    展开全文
  • ❤️高级JAVA开发必备技能❤️java8 新日期时间API((三)JSR-310:格式化和解析)(JAVA java 小虚竹)
    技术活,该赏
    点赞,收藏再看,养成习惯
    

    大家好,我是小虚竹。之前有粉丝私聊我,问能不能把JAVA8 新的日期时间API(JSR-310)知识点梳理出来。答案是肯定的,谁让我宠粉呢。由于内容偏多(超十万字了),会拆成多篇来写。

    闲话就聊到这,请看下面的正文。

    DateTimeFormatter

    DateTimeFormatter类说明

    DateTimeFormatter的作用是进行格式化日期时间显示,且DateTimeFormatter是不可变类且是线程安全的。

    public final class DateTimeFormatter {
    ...
    }
    

    说到时间的格式化显示,就要说老朋友SimpleDateFormat了,之前格式化Date就要用上。但是我们知道SimpleDateFormat是线程不安全的,还不清楚的,请看这篇文章java的SimpleDateFormat线程不安全出问题了,虚竹教你多种解决方案

    DateTimeFormatter常用的用法

    格式化

    		ZonedDateTime zonedDateTime = ZonedDateTime.now();
    		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm ZZZZ");
    		System.out.println(formatter.format(zonedDateTime));
    
    		DateTimeFormatter usFormatter = DateTimeFormatter.ofPattern("E, MMMM/dd/yyyy HH:mm", Locale.US);
    		System.out.println(usFormatter.format(zonedDateTime));
    
    		DateTimeFormatter chinaFormatter = DateTimeFormatter.ofPattern("yyyy MMM dd EE HH:mm", Locale.CHINA);
    		System.out.println(chinaFormatter.format(zonedDateTime));
    

    image-202107209416958

    解析

    		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
    		String dateTime = "2021年08月22日 13时14分20秒";
    		LocalDateTime localDateTime = LocalDateTime.parse(dateTime, formatter);
    		System.out.println(localDateTime);
    

    image-2021082291306050

    大家有没有注意到,parse方法 是放在LocalDateTime类中 的,而不是DateTimeFormatter类中 。这样的设计符合正常的思路想法,想解析出LocalDateTime 的日期时间,那就用LocalDateTime 。想解析其他的JSR-310的日期时间对象,那就用对应的日期时间对象去解析。

    博主把常用的日期时间API都看了,这些里面除了Clock (时钟不需要解析的),其他都有实现parse方法

    image-20210824903956

    DateTimeFormatter的坑

    1、在正常配置按照标准格式的字符串日期,是能够正常转换的。如果月,日,时,分,秒在不足两位的情况需要补0,否则的话会转换失败,抛出异常。

    		DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    		LocalDateTime dt1 = LocalDateTime.parse("2021-7-20 23:46:43.946", DATE_TIME_FORMATTER);
    		System.out.println(dt1);
    

    会报错:

    image-202107208183

    java.time.format.DateTimeParseException: Text '2021-7-20 23:46:43.946' could not be parsed at index 5
    

    分析原因:是格式字符串与实际的时间不匹配

    “yyyy-MM-dd HH:mm:ss.SSS”

    “2021-7-20 23:46:43.946”

    中间的月份格式是MM,实际时间是7

    解决方案:保持格式字符串与实际的时间匹配

    	DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    		LocalDateTime dt1 = LocalDateTime.parse("2021-07-20 23:46:43.946", DATE_TIME_FORMATTER);
    		System.out.println(dt1);
    

    image-20210720504067

    2、YYYY和DD谨慎使用

    		LocalDate date = LocalDate.of(2020,12,31);
    		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYYMM");
    		// 结果是 202112
    		System.out.println( formatter.format(date));
    

    image-202107208183

    Java’s DateTimeFormatter pattern “YYYY” gives you the week-based-year, (by default, ISO-8601 standard) the year of the Thursday of that week.
    

    YYYY是取的当前周所在的年份,week-based year 是 ISO 8601 规定的。2020年12月31号,周算年份,就是2021年

    image-2021072059555

     private static void tryit(int Y, int M, int D, String pat) {
            DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pat);
            LocalDate         dat = LocalDate.of(Y,M,D);
            String            str = fmt.format(dat);
            System.out.printf("Y=%04d M=%02d D=%02d " +
                "formatted with " +
                "\"%s\" -> %s\n",Y,M,D,pat,str);
        }
        public static void main(String[] args){
            tryit(2020,01,20,"MM/DD/YYYY");
            tryit(2020,01,21,"DD/MM/YYYY");
            tryit(2020,01,22,"YYYY-MM-DD");
            tryit(2020,03,17,"MM/DD/YYYY");
            tryit(2020,03,18,"DD/MM/YYYY");
            tryit(2020,03,19,"YYYY-MM-DD");
        }
    
    Y=2020 M=01 D=20 formatted with "MM/DD/YYYY" -> 01/20/2020
    Y=2020 M=01 D=21 formatted with "DD/MM/YYYY" -> 21/01/2020
    Y=2020 M=01 D=22 formatted with "YYYY-MM-DD" -> 2020-01-22
    Y=2020 M=03 D=17 formatted with "MM/DD/YYYY" -> 03/77/2020
    Y=2020 M=03 D=18 formatted with "DD/MM/YYYY" -> 78/03/2020
    Y=2020 M=03 D=19 formatted with "YYYY-MM-DD" -> 2020-03-79
    

    最后三个日期是有问题的,因为大写的DD代表的是处于这一年中那一天,不是处于这个月的那一天,但是dd就没有问题。

    例子参考于:https://www.cnblogs.com/tonyY/p/12153335.html

    所以建议使用yyyy和dd。

    3、DateTimeFormatter.format(Instant)会报错

    报错信息:

    java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
    

    分析原因:

    代码**DateTimeFormatter.format(Instant)**是怎么处理的呢?

        public String format(TemporalAccessor temporal) {
            StringBuilder buf = new StringBuilder(32);
            formatTo(temporal, buf);
            return buf.toString();
        }
    
    
    

    首先new了个StringBuilder对象,用来拼接字符串;

    然后调用**formatTo(temporal, buf)**方法

    public void formatTo(TemporalAccessor temporal, Appendable appendable) {
        Objects.requireNonNull(temporal, "temporal");
        Objects.requireNonNull(appendable, "appendable");
        try {
            DateTimePrintContext context = new DateTimePrintContext(temporal, this);
            if (appendable instanceof StringBuilder) {
                printerParser.format(context, (StringBuilder) appendable);
            } else {
                // buffer output to avoid writing to appendable in case of error
                StringBuilder buf = new StringBuilder(32);
                printerParser.format(context, buf);
                appendable.append(buf);
            }
        } catch (IOException ex) {
            throw new DateTimeException(ex.getMessage(), ex);
        }
    }
    

    **formatTo(temporal, buf)**方法也是先判断两个入参空处理。

    然后,Instant对象被封装在一个新new的DateTimePrintContext对象

    运行demo有问题,进行排查

    		//根据特定格式格式化日期
    		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    		String dateStr = DateUtil.format(new Date(),dtf);
    		System.out.println(dateStr);
    

    image-20210725195348793

    到这里已经是jdk的源码了DateTimeFormatter.format

    image-20210725195424950

    image-20210725195522610

    image-20210725195636339

    从上面可知,会调用 NumberPrinterParser.format() NumberPrinterParser是在DateTimeFormatterBuilder类中的。

    image-20210725195947802

    到这一步会报错

    image-20210725200153850

    为什么会报错呢,我们来看下context.getValue(field)发生了什么:

    image-20210725200349650

    从上面代码可行,temporal实际上是Instant对象,Instant.getLong只支持四种字段类型。。

    NANO_OF_SECOND
    MICRO_OF_SECOND
    MILLI_OF_SECOND
    INSTANT_SECONDS
    

    image-20210725200551164

    如果不是上面这几种字段类型,则抛出异常

    DateUtil.format当遇到DateTimeFormatter会将Date对象首先转换为Instant,因为缺少时区,导致报错。

    解决方案:

    /**
     * 根据特定格式格式化日期
     *
     * @param date   被格式化的日期
     * @param format
     * @return 格式化后的字符串
     * @since 5.0.0
     */
    public static String format(Date date, DateTimeFormatter format) {
       if (null == format || null == date) {
          return null;
       }
       Instant instant = date.toInstant();
       ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
       LocalDateTime localDateTime = zonedDateTime.toLocalDateTime();
       return format.format(localDateTime);
    }
    

    先把date类型转化为LocalDateTime类型,然后再进行DateTimeFormatter.format(LocalDateTime)的格式化

    测试demo

    //根据特定格式格式化日期
    String str = "2021-07-25 20:11:25";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:dd");
    Date date = DateUtil.parse(str);
    String dateStr = DateUtil.format(date,dtf);
    System.out.println(dateStr);
    Assert.assertEquals(str, dateStr);
    

    image-20210725201444728

    DateTimeFormatterBuilder

    DateTimeFormatterBuilder类说明

    DateTimeFormatter 的所有格式化器都是用DateTimeFormatterBuilder 建造器类创建的。

    看下面两个ofPattern 源码:

    //DateTimeFormatter
    public static DateTimeFormatter ofPattern(String pattern) {
            return new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter();
        }
        
         public static DateTimeFormatter ofPattern(String pattern, Locale locale) {
            return new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter(locale);
        }
    

    解析风格配置

    官方提供了四种解析风格的配置,如下枚举 SettingsParser

     static enum SettingsParser implements DateTimePrinterParser {
         // 大小写敏感
            SENSITIVE,
         // 大小写不敏感
            INSENSITIVE,
         //严格
            STRICT,
         //宽松
            LENIENT;
            ...
            }
    

    对应DateTimeFormatterBuilder 类中的方法:

    // 大小写敏感
    public DateTimeFormatterBuilder parseCaseSensitive()
    // 大小写不敏感
    public DateTimeFormatterBuilder parseCaseInsensitive()
    // 严格
    public DateTimeFormatterBuilder parseStrict()
    // 宽松
    public DateTimeFormatterBuilder parseLenient()
    

    这四个方法对应的源码如下:

    // 大小写敏感
    public DateTimeFormatterBuilder parseCaseSensitive() {
            appendInternal(SettingsParser.SENSITIVE);
            return this;
        }
    // 大小写不敏感
     public DateTimeFormatterBuilder parseCaseInsensitive() {
            appendInternal(SettingsParser.INSENSITIVE);
            return this;
        }
    // 严格
     public DateTimeFormatterBuilder parseStrict() {
            appendInternal(SettingsParser.STRICT);
            return this;
        }
    // 宽松
    public DateTimeFormatterBuilder parseLenient() {
            appendInternal(SettingsParser.LENIENT);
            return this;
        }
    

    可以看出,都是调用appendInternal 方法。

    接着往下看 appendInternal 源码:

     private int appendInternal(DateTimePrinterParser pp) {
            Objects.requireNonNull(pp, "pp");
            if (active.padNextWidth > 0) {
                if (pp != null) {
                    pp = new PadPrinterParserDecorator(pp, active.padNextWidth, active.padNextChar);
                }
                active.padNextWidth = 0;
                active.padNextChar = 0;
            }
            active.printerParsers.add(pp);
            active.valueParserIndex = -1;
            return active.printerParsers.size() - 1;
        }
    

    其中active 是一个DateTimeFormatterBuilder 实例,且这个DateTimeFormatterBuilder 实例内部有一个列表 List< DateTimePrinterParser > ,看了源码可知,真正做解析工作的是DateTimePrinterParser 对应的实例来做的。

    DateTimePrinterParser 的源码:

     interface DateTimePrinterParser {
    
            boolean format(DateTimePrintContext context, StringBuilder buf);
    
            int parse(DateTimeParseContext context, CharSequence text, int position);
        }
    

    源码有一共有16个DateTimePrinterParser 的实例。

    //1.Composite printer and parser.
    static final class CompositePrinterParser implements DateTimePrinterParser {...}
    
    //2.Pads the output to a fixed width.
    static final class PadPrinterParserDecorator implements DateTimePrinterParser {...}
    
    //3.Enumeration to apply simple parse settings.
    static enum SettingsParser implements DateTimePrinterParser{...}
    
    //4. Defaults a value into the parse if not currently present.
    static class DefaultValueParser implements DateTimePrinterParser {...}
    
    //5.Prints or parses a character literal.
    static final class CharLiteralPrinterParser implements DateTimePrinterParser {...}
    
    //6.Prints or parses a string literal.
    static final class StringLiteralPrinterParser implements DateTimePrinterParser {...}
    
    //7.Prints and parses a numeric date-time field with optional padding.
    static class NumberPrinterParser implements DateTimePrinterParser {...}
    
    //8.Prints and parses a numeric date-time field with optional padding.
    static final class FractionPrinterParser implements DateTimePrinterParser {...}
    
    //9.Prints or parses field text.
    static final class TextPrinterParser implements DateTimePrinterParser  {...}
    
    //10.Prints or parses an ISO-8601 instant.
    static final class InstantPrinterParser implements DateTimePrinterParser  {...}
    
    //11.Prints or parses an offset ID.
    static final class OffsetIdPrinterParser implements DateTimePrinterParser   {...}
    
    //12.Prints or parses an offset ID.
    static final class LocalizedOffsetIdPrinterParser implements DateTimePrinterParser {...}
    
    //13.Prints or parses a zone ID.
    static class ZoneIdPrinterParser implements DateTimePrinterParser {...}
    
    //14. Prints or parses a chronology.
     static final class ChronoPrinterParser implements DateTimePrinterParser {...}
    
    //15.Prints or parses a localized pattern.
    static final class LocalizedPrinterParser implements DateTimePrinterParser {...}
    
    //16.Prints or parses a localized pattern from a localized field.
     static final class WeekBasedFieldPrinterParser implements DateTimePrinterParser {...}
    

    推荐相关文章

    hutool日期时间系列文章

    1DateUtil(时间工具类)-当前时间和当前时间戳

    2DateUtil(时间工具类)-常用的时间类型Date,DateTime,Calendar和TemporalAccessor(LocalDateTime)转换

    3DateUtil(时间工具类)-获取日期的各种内容

    4DateUtil(时间工具类)-格式化时间

    5DateUtil(时间工具类)-解析被格式化的时间

    6DateUtil(时间工具类)-时间偏移量获取

    7DateUtil(时间工具类)-日期计算

    8ChineseDate(农历日期工具类)

    9LocalDateTimeUtil(JDK8+中的{@link LocalDateTime} 工具类封装)

    10TemporalAccessorUtil{@link TemporalAccessor} 工具类封装

    其他

    要探索JDK的核心底层源码,那必须掌握native用法

    万字博文教你搞懂java源码的日期和时间相关用法

    java的SimpleDateFormat线程不安全出问题了,虚竹教你多种解决方案

    源码分析:JDK获取默认时区的风险和最佳实践

    高级JAVA开发必备技能:时区的规则发生变化时,如何同步JDK的时区规则

    今天是持续写作的第 8 / 100 天。
    可以关注我,点赞我、评论我、收藏我啦。

    展开全文
  • 初级java开发必备技能 本文是由 ButterCMS 的撰稿人 Zsolt Nagy 撰写的来宾帖子 。 我仍然可以回想起大学时代:我的大脑充满了技术主题,从算法,数据结构,SQL,Java和C ++到更广泛的主题,例如质量管理,知识...

    初级java开发必备技能

    本文是由 ButterCMS 的撰稿人 Zsolt Nagy 撰写的来宾帖子

    我仍然可以回想起大学时代:我的大脑充满了技术主题,从算法,数据结构,SQL,Java和C ++到更广泛的主题,例如质量管理,知识管理和项目管理。 我唯一没有的就是对我可以在任何公司完成任何事情的信心。

    我花了好几年的时间才知道我只需要两件事:正确的资源和大规模的行动。 本文将重点介绍我将为年轻的人提供哪些资源,以极大地提高自己的技能和经验。 如果您是刚开始工作的初级开发人员,则本指南将帮助确保您正在开发成功所需的软技能和技术技能。

    资源领域

    软件开发职业是基于技术技能和软技能的结合。 两者对于在您的职业生涯中取得成功同样重要。 本文将解决以下方面:

    1. 如何推销自己
    2. 专业精神:大学和一些编码训练营忽略的技能
    3. 与开发人员社区保持同步
    4. 编码技巧和技术面试准备
    5. 系统设计技巧
    6. 持续学习

    让我们一个一个地探索每个区域。

    1.推销自己

    开始营销您的技能和专业知识永远不会太早。 您获得的专业知识越多,营销自己时就可以参考更多的成就。 如果您是初学者,则必须专注于赢得自己的成绩并突出那些成就。

    如果您是初学者, 那么每天撰写承诺可以帮助您建立动力。 您最重要的盟友是您的投资组合。 如果您建立了完成工作的跟踪记录,那么您的潜在雇主将相信您是能够解决问题的开发人员。 确保您创建了GitHub个人资料并创建了一个值得检查的投资组合网站。 您可以托管自己的Wordpress网站,也可以选择免费的github.io网站。

    在GitHub或其他地方构建投资组合并不是一项显而易见的任务。 例如,很少有人对Todo MVC应用程序的克隆感兴趣。 重新发明轮子很少会得到回报。 早在2013-2015年,数百个JavaScript框架浮出水面。 他们中的大多数从未流行。 为什么不创建一个有用的东西,而不是发明一个框架? 您对股票交易感兴趣吗? 将机器学习应用于交易。 您对框架感兴趣吗? 加入他们的开发人员社区,然后将拉取请求提交到现有存储库中,而不是创建自己的存储库。

    建立投资组合时,请确保提交内容干净且代码注释正确。 否则,您将有机会在第一次面试开始之前破坏您的声誉。 首先,避免窃取他人的知识产权。 如果您使用了源代码,请从他们的资源库中派生出来,或者根据他们自己的资源库提供的许​​可证,在原始作者的信誉下,在readme.md文件中正确提及它们。

    创建全明星的LinkedIn个人资料 。 全明星是LinkedIn所使用的术语,表示您已完全填写个人资料。 这包括您的职业使命。 您提供的信息越多,您的个人资料将吸引更多的访问者。 每周我都会在LinkedIn上获得多个猎头,首席执行官和CTO的联系方式。 我不能保证给您与应届毕业生或自学成才的程序员相同的结果,但是现在开始建立在线形象永远不会太早。

    如果您想加倍努力,请创建一个博客。 从长远来看,自托管博客是最有意义的,因为您不依赖发布文章的平台。 有一些稳定的社区,例如Medium.com ,而您停止使用Medium的服务的风险非常低。 因此,如果您正在寻求降低阻力的途径,则还可以在Medium上创建无广告服务。 只要您的文章能提供价值,并且您的内容不会与您申请的角色冲突,博客就可以使您比大多数软件开发人员处于更好的地位。

    我职业生涯中的一个例子是申请BackboneJs角色的软件开发人员。 他有一个博客,但是这个博客充满了主要的语法错误。 他强调了一篇文章,详细介绍了他对BackboneJs的看法。 他写道BackboneJs是一个有缺陷的,可怕的库,他在文章中大肆宣传,没有提供任何理由。 避免过于自以为是,除非您可以用事实来支持您的陈述。

    您的社交媒体形象会给您的在线形象带来微不足道的好处。 不过,您的缺点可能很大。 如果您申请创业职位,聚会照片绝对不错。 但是,如果您申请一个由人们穿着西装工作的公司职位,即使您的招聘经理每周喝醉一次,您的聚会照也会使您处于严重不利地位。 Internet上公开的所有内容都可能被用来支持或反对您。

    简历写得好和领英简介写得一样重要。 确保在编写简历时避免这7个常见错误

    推销自己时,建议您不要称自己为程序员或初级开发人员。 如果您称自己是程序员,则倾向于谈论自己是一种商品。 与程序员相比,商人更倾向于尊重开发人员。 程序员是有能力编写代码的人。 开发人员是可以开发和维护软件解决方案的人。 工程师是以专业的方式提供科学解决方案的人。 工程师不仅可以开发系统,还可以设计系统,并在管理开发项目时与利益相关者进行交流。 如果您没有工程学位,可以自称软件开发人员。 自称程序员是冒着在业界受到较少尊重的风险,这会导致您的个人品牌出现一些问题。

    2.专业精神

    大多数软件开发人员专注于学习技术技能。 更好地使用React,学习更多有关机器学习算法的知识或成为技术精湛的架构师,这些都是软件开发人员的共同愿望。

    尤其是当您年轻而有野心时,您可能会被那里无数的知识淹没。 专注于仅提高您的技术技能并将开发的其他方面推到一边是容易的。

    这是个错误。

    因为当业务人员说他已经向董事会承诺要由您(开发人员)在三个月内提供一个隶属平台时,技术技能还不够。 技术技能不会使您晋升为主角。 当您的某些同事有毒并且以他们的态度毒害大多数人时,技术技能不会帮助您。

    在本文中按照与开发人员和非开发人员对软件开发人员的期望一致的行动来定义专业精神。 这包括:

    1. 定义并遵守标准
    2. 永远不要假装自己不知道
    3. 提供准确和最新的时间估计
    4. 清楚自己的界限
    5. 洽谈双赢。

    让我们一一检查这些动作。

    标准品

    首先,您必须具有作为专业人士的标准,并且即使老板威胁要辞退您,也必须遵守标准。 您的工作道德和标准应明确定义。 当有人试图违反这些标准时,专业人士会坚持下去。

    理智诚实

    专业人士易于合作,因为他们愿意承认自己不了解某些东西。 业余者假装他们知道别人在说什么,并且可能会开会一个小时而没有说出他们不懂一个字。

    例如,一旦我的团队指导了一位真正为自己的表现而苦苦挣扎的软件开发人员。 他被认为是技能不高的软件开发人员,主要造成麻烦。

    他一直在获取最先进的资源,但是他从未使它达到新的高度。 他做到了绝对最低限度,不被解雇。 当他受到严密监视时,他假装自己在努力学习,假装自己了解正在发生的事情,并且他似乎致力于改善。

    但是,在他获得合同延期或将他从绩效改进计划中删除后,他又回到了以前的趋势。

    有一天,由于我的一位同事,我们发现了为什么发生此问题。 我们表现​​不佳的开发人员具有足够的技能和态度。 他只是害怕承认他不了解我们告诉他的内容。 他无法康复,因为他害怕表现不好。 他认为我们看不到所有这一切。

    想想自己,就像是一只蚂蚁。 您不认为人们会看到您,因为在您的现实中,您只是走路并收集食物。 人们仍然看到你。 他们只是不告诉你他们这样做。

    我的同事吸取了这一课,今天,他是一名高于平均水平的开发人员,并且他是第一个承认自己不懂什么的人。

    时间管理

    第三,在专业环境中,时间估计来自开发团队。 当管理层要求您提高速度,但是您知道无法按时完成请求或极不可能按时完成请求时,即使您失去工作,也会大声疾呼。

    我的一位客户要求我估算一些里程碑。

    唯一的问题是,为了进行估算,我不得不依靠第三方为我提供前提条件。 我既不了解也不影响此先决条件的交付日期。

    此外,我的一半任务的说明尚未编写。

    我的客户确实希望我遵守截止日期,并说他必须在明天之前提供估算。

    但是,我坚持自己的立场,并回答说,作为一名工程师,如果没有先决条件的预期日期,也没有完整的要求说明,那么我无权承担任何截止日期。 我为达到目标日期而进行的任何尝试都将有效,就像在屋前跳舞导致雨滴开始从天上掉下来一样。

    当然,我的热情更高了,其中包括著名的一句话,罗伯特·C·马丁(Robert C. Martin)在他的著作《清洁编码》中也做了强调。 “你至少可以尝试吗?”

    我的回答是:“我的表现始终是最高水平,而且是不可商量的。 我的工作率为100%。 少于那将是浪费的,从定义上讲,不可能超过100%。”

    我们最终同意在同意目标日期之前确定项目的确切范围。 我向我的联系人保证,一旦获得所有信息,他将获得目标日期。

    问问自己,即使您冒失去客户或被解雇的风险,您是否也可以根据常识回答?

    如果您的回答是肯定的,那么您不仅会朝着专业精神迈进,而且您的意见将是宝贵的和受到尊重的。

    总是会有其他人承诺不可能的事情。 短期内,一些贪婪的客户和雇主可能会选择他们。 但是,这些人最终将失败。 这是当您回到图片中时。

    我知道,对于初级开发人员来说,失业可能听起来很可怕。 但是实际上,正是因为即使您丢掉了工作也仍然恪守承诺,您才是最后一个失去工作的人。 在极不可能的情况下,公司还是不是专业环境。

    建立明确的界限

    第四,在时间估计和职业道德上都可靠且可靠,因此您必须遵守界限。 健康的心理界限意味着您应对自己的行为和情感承担全部责任,而对他人的行为和情感则不承担任何责任。 当其他人以您的名义承诺最后期限时,他们就会违反您的界限。 专业人士应该开放商谈项目的范围和交付时间,但是专业人士不应该接受业务驱动的一组截止日期,也不能接受基于模糊,模糊的规范的截止日期。

    过去,我们聘请了一名软件开发人员。 当我担任他的领导时,他过了一会儿就开始开放,并告诉了我一些关于他以前工作场所的故事。 他的前任经理特别冗长,让我们称他为“无知卡尔”。

    当卡尔到达时,他通常会问几个问题,很快就会发现他对软件的开发一无所知。 在卡尔看来,软件就像印刷报纸。 如果您的工作时间是以前的两倍,那么您的工作量就会增加两倍。 因此,他不断要求让人们加班。

    有一天,他询问了联盟平台的可行性。 我的同事说,假设该平台仅具有基本功能,则至少需要9个月才能构建该平台。

    然后经理不高兴。 真的很沮丧

    “这不可能! 我已经向董事会保证,我们将在三个月内完成!”经理说。

    我的同事问他:“如果不知道需要多少时间,为什么要承诺呢?”

    经理回答:“我大部分时间都有很准确的才能”。

    整个办公室开始大声笑出来。

    如果您不想成为被企业滥用的技术团队的受害者,则可以考虑提高对违反边界的人员的防御能力。 我建议两本书:罗伯特·C·马丁(Robert C. Martin)的《清洁编码》(Clean Coder) ,和《 我说不》时 ,曼努埃尔·J·史密斯(Manuel J. Smith) 感到内Gui 。 前者为您提供了示例,说明即使非专业人士违反了您的职责范围,也应如何遵守您的专业行为准则。 后一本书或有声读物本质上是一种以书本形式有效的自信疗法。

    谈判中

    第五,专业人员有充分的理由成为可靠的谈判者。 因此,专业人员的收入要比普通人多,并且自己为自己商讨比普通开发商更好的工作条件。 作为交换,它们对企业而言比普通开发者有用得多。

    不仅是开发人员,而且作为专业人士的生活,行动和工作,可能是您自己进行的最重要的投资。

    强大的软技巧将带您前进

    考虑到软件开发人员的财务状况,卡尔·休斯 Karl Hughes )在他的文章中指出,技能范围超出技术技能的软件开发人员比普通开发人员的需求更大。

    考虑一下三个工人的古老故事。 您会看到三名工人在盖建筑物。 您问第一个他在做什么。 他说,他正在彼此之间铺砖。 您会感到困惑,因为您可能会认为,他甚至不知道为什么要在彼此之间铺砌砖块,那么他将如何知道何时停止?

    然后,您请第二个工人。 他说,他正在筑墙。 很高兴知道,您认为。 至少他会完成他的工作。 但是,一旦他完成了那堵墙,会发生什么?

    您问第三位工人他在做什么。 他的眼睛开始闪闪发光,您会看到这位工人的钦佩。 我正在建造一座大教堂!

    不同的视角,不同的生活质量。 最重要的是,职业轨迹不同。

    考虑一下,作为大教堂的项目经理,您将与哪些工人互动? 您会提升哪些工人? 即使他是最快的人,但您永远不会升任哪个工人呢?

    专业人士知道他在做什么,为什么会这样做。 专业人士设定界限。 专业人士很少超额承诺,但经常超额完成工作。 专业人士也知道他要解决什么问题

    业余爱好者花大钱买了下一块闪亮的大理石,专业人士设计了自己的职业,变得如此出色,以至于不容忽视 。 在金钱和建立事业资本之间进行选择时,请选择后者。 您可能现在还不知道几年后会发生什么,但是一旦您精通某个领域,新的机会就会出现。

    3.开发者网络

    决定您作为软件开发人员的成功和机会的首要因素是同龄人。 您的人脉关系已包含在您的职业资本中,因为与别人合作总是比独自一人更好。

    同伴群体效应是一个经过充分研究的现象。 研究表明,我们经常与之互动的人会影响我们的日常生活。

    我们的第一批人是我们的家庭。 关于这一主题的数百本书已被撰写,无论正面还是负面的性格特征都会影响到你几代人。 您甚至可能不认识您的曾祖父,但是他的性格特征和举止可能会使您感到焦虑,或者使您在其他情况下感到反叛,而无需知道原因。 虽然您无法选择家人,但您可以选择同龄人作为软件开发人员。

    如果您所在的公司周围有不专业,懒惰的开发人员,那么现在是时候升级您的同龄人小组了。

    如果您在大城市工作,则有可能,您只需访问metup.com ,并与软件开发人员中志趣相投的人进行交流即可。 您可以建立联系,并且可以互相帮助。

    您可能属于软件开发中代表性不足的组。 考虑加入一个建设性小组,在那里您可以为自己找到成功的榜样。 确保您选择的小组以面向行动的步骤和积极的意愿帮助您实现目标。

    作为初级开发人员,与会议相比,本地聚会对您而言更具成本效益。 如果您的公司资助您的会议旅行,那就去做吧。 但是,不要以初级开发人员的身份从会议中受益匪浅。

    如果您想提高在那里教授的技能,参加一些现场讲习班将是有益的。 邻近就是力量。 现场教练可以帮助您比书籍或在线课程更快地变得更好。

    有一些社区团体与一些受欢迎的资源库相关联。 例如,我的一位同事自愿成为流行的函数式编程库的维护者之一。 他定期与很多人互动,他是人们在该主题上的权威。 您会发现许多值得在您的整个职业生涯中为之贡献的github.com存储库。

    一些免费或付费的开发人员网络也会使您在技术技能和软技能方面得到提升。 一个广为人知的示例是软件开发人员训练营,您可以在其中与专家紧密合作来学习。 尽管您可以自己学习,但由于同伴小组的影响,人们需要为训练营付费。 因为接近就是力量,所以您可以更快,更轻松地进行升级。

    尽管reddit.com通常是大量精选资源的来源,但在某些渠道中,某些巨魔却为学习创造了一个不太吸引人的环境。 如果您看到有人为无故辩论而感到自豪,请停止阅读该文章,然后跳到下一篇。 不要喂巨魔,也不要自己成为巨魔。 遵守您的界限,并进行专业和建设性的辩论。

    您可能会在工作中或学习时陷入困境。 幸运的是,无论技术,编程语言或问题的性质如何,大多数问题的答案都可以在Internet上找到。 您甚至可以在线找到有关软技能问题的答案。 这些开发人员网络的一些示例是:

    明智地使用这些资源,当您寻找答案而不是重新发明轮子时,可以节省很多时间和头痛。

    4.编码技巧和技术面试准备

    许多人不喜欢技术面试,因为他们声称自己得到的谜语和白板面试与工作所需的技能无关。 现实情况是,招聘是一个价值数十亿美元的行业,最佳实践从上到下传播。

    顶部的公司为技术面试的外观设定了标准。 无论您是否同意他们的方法,您都必须学习它们,因为较小的公司通常会复制行业中顶尖公司的招聘方法。 较小的公司复制这些趋势,只是因为他们不了解。 可能有些公司认为他们了解得更多,并且提出了一个尴尬的程序,但是您瞄准的公司越著名,就越需要一些面试技巧。

    通常,您需要以下技能:

    1. 解决问题
    2. 算法和数据结构,算法复杂度分析
    3. 强大的编程语言命令
    4. 系统设计
    5. 软技能

    在本节中,我们将重点关注第1点和第2点:问题解决,算法,数据结构和复杂性分析。

    该主题的最终畅销书是盖尔·拉克曼·麦克道威尔(Gayle Laakmann McDowell)撰写的《 破解编码访谈》 。 但是,还有许多其他免费,免费和商业资源可帮助您培训这些技能。

    如果要提高解决问题的能力或对算法和数据结构的了解, https://brilliant.org/会为您提供一个很好的概述。

    如果您喜欢编码实践,甚至可能从事竞争性编码,那么可以使用多种平台:

    您可以在最具竞争力的编码和代码面试准备平台中训练前四个技能。 如果您是入门者,那么Codility的课程将使您轻松地了解可以期望的主题。 如果您只有一个站点的时间,请选择HackerRank,因为HackerRank是当前公司使用最广泛的平台。

    如果您使用JavaScript,我在zsoltnagy.eu上也有一些有趣的面试问题 。 其中一些问题超出了竞争性编码和模型家庭作业的范围,在其中您必须自始至终提出自己的应用程序。 在这些练习中,工具和编码最佳实践比时间限制更为重要,因为您可能会花费数天时间完成练习。

    如果这些资源不足以满足您的需求,请查看GitHub页面“程序员应访问的最佳网站”的“初学者编码实践”,“竞争编码”和“面试准备”部分。

    5.系统设计技巧

    由于许多软件开发人员仅对编码感到自豪,而无需研究工具,体系结构决策和解决问题的组件,因此本主题值得一试。

    在我的《开发者的边缘》一书中,我研究了通才和专家的职业道路,得出的结论是,作为软件开发人员,您可能最赚钱的职位是T形专业人员(下文将详细介绍)。

    尽管在大型公司中,您通常可以成为不了解软件开发某些明显知识的专家,但是公司规模越小,如果您无法处理基本任务,雇主就无力雇用您是IT工程师所期望的。 当我与专门研究一个平台的移动开发人员一起工作时,他问我如何编写基本HTML。 不用说,当基本面缺失时,您为公司增加的价值就会下降。

    雇主倾向于喜欢通才,因为他们总是需要人才能完成任务。 雇主也喜欢通才,因为他们不必付给通才很多的钱。 如果您想要额外的安全性,而生活的重心不是软件开发,那么通才的道路可能对您而言就很好。 这没有什么不对,我感谢并尊重在生活中真诚想要的开发人员。 他们永远不会在Google上找到出色的工作,但作为交换,他们可能会拥有非凡的生活质量。

    如果您作为软件开发人员有更大的野心,我建议您将两个世界混为一谈。 这是T形轮廓出现的地方。T形中的水平线象征着通才。 垂直部分象征着您的专业化,在这里您会进行深入研究。 您将获得两全其美的选择,可能会获得更高的薪水和最大的效用。

    系统设计技能是通才设计中必须具备的。 如果您没有系统设计技能,那么即使是大公司也可能会拒绝您。

    如果您正在寻找入门资源,我建议您阅读“ 十大系统设计面试问题”一文,以便您了解期望。

    如果您正在寻找学习系统设计技能的资源,我可以向您推荐以下内容:

    对于Web开发人员来说, Web Architecture 101是一本好书。

    6.学习

    学习是本节中涵盖的六个主题中最不直观的主题。 这是因为,如果您以相同的方式学习普通人的工作方式,那么您的回报也将是平均的。

    您还记得上次买书或真正想学的课程吗? 感觉令人兴奋,不是吗?

    大多数人买东西是为了梦想成为一个更好的专业人士,一个收入更高的开发人员,一个更好的沟通者。 购买决定感觉很好,因为在那一刻发生了货币承诺。 您告诉自己,您是一个价值观与所关注主题保持一致的人。

    只要您做出合理的决定并且不会落入骗局,那么到目前为止,您所做的一切都是正确的。

    真正的问题随之而来。 许多人开始从头到尾阅读他们的新资料,或者从第一个视频到最后一个视频都观看它们。 一旦完成材料,他们就会Swift跳到下一个。

    这是浪费资源,因为我们大多数人会忘记95%的未付诸实践的东西。

    我记得,在大学时代,我强迫自己一遍又一遍地读书,这样我就不会错过考试中一个隐蔽的事实。 我感到非常压力,因为我的操作系统书长达400页。 我的计算机网络书长超过800页。 您知道的,这些都是带有小写字母的书,充满定义,事实,并且没有太多创造力。

    在第二或第三年左右,我的心态发生了变化。 我的主要目标是以最好的成绩通过考试。 我的第二个目标是学习尽可能多的有用的东西。

    练习考试涵盖了我的第一个目标。 我看的第一件事是过去五年来的考试。 然后我开始学习,主要目的是能够解决这些类型的问题。

    完成后,我对整个主题有了一个整体的了解,可以开始更深入地研究了。 我在创纪录的时间内为考试做准备,并且设法从经验中学到了很多知识。

    知道如何学习很重要。 一种资源是有关“ 软件开发人员的有效学习”的中级文章,可帮助您改善学习心态和技术。

    本文强调了制定学习计划的重要性。 了解您的发展方向总是很重要的。 您想成为前端开发人员吗? 2018年的Modern Frontend Developer文章涵盖了您需要了解的内容以及哪些主题可以替代。 您想成为数据科学家吗? 阅读类似标题为2018年成为数据科学家的技能的文章。 此模式适用于任何域。

    显然,如果您在2019年阅读了这篇文章,您很可能会找到标题为2019年的相关文章。

    一旦知道需要练习哪些主题,就可以搜索免费和付费信息。 一些免费频道包括Youtube,Medium,免费代码训练营和其他一些教程。

    一些可靠的付费渠道包括:Packt Publishing,Sitepoint,Pluralsight和Udemy用于视频课程,Packt Publishing,O'Reilly,Manning,Apress和Leanpub用于书籍。

    原始信息在21世纪是免费的。 当您购买书籍或课程时,请确保信息的显示方式和组织方式与您所寻找的相匹配。 良好的学习资源会挑战您,并为您提供练习以帮助您将理论付诸实践。

    采取大规模行动

    当要实现生活中的任何事情时,有一件事将梦dream以求的人与实现目标的人区分开来:为实现目标而付出的巨大努力。

    有人会告诉您其他意见。 例如,您可能听说过写下目标的力量。 许多励志演讲者包括耶鲁大学进行的一项著名研究故事,该研究将学生分为两组。 根据这项著名的研究,写下目标的3%的人赚的钱比其他97%的总和还多。

    这是一个伟大的故事。 根据耶鲁大学的问题是, 这项研究从未发生过 。 如果不花时间,您将无法实现目标。

    根据安德斯·爱立信(Anders Ericsson) 的《山峰:来自新技术专长秘密 》一书,以及卡尔·纽波特(Cal Newport)的《他们无法忽略你好事》 ,经过精心训练的专家成为专家。 两位作者以及马尔科姆·格拉德威尔(Malcolm Gladwell)都将一万小时的故意练习规则作为专业知识的代价。 尽管每个使用案例的数量可能有所不同,但您会想到:专业知识并非一overnight而就。

    几年前,作为前端开发人员和团队负责人,我锻炼了纪律以维护稳定的技术堆栈。 当许多开发人员跳船并想学习最新的闪亮大理石时,我发现了连续性的价值。 我听说有些公司的开发团队不断地重写代码,因为他们想跟上最新趋势。 只有定义自己的专业领域并坚持下去,您才能成为专家。

    显然,如果您致力于实现目标,则大脑中的神经元将更容易与目标对齐。 但是,没有什么可以替代您为实现目标而投入的有意义的时间。

    如果您只是不专心地在这里和那里读几篇文章,那么您只会造成进步的幻想。 真正的进步来自不断的努力。 当您深深地沉浸在一项活动中,以至于您无法察觉时间的流逝时,就会在心态中进行有意识的练习。

    好消息是,根据《 流动:最佳体验的心理学 》一书的作者MihályCsíkszentmihályi所说,当您沉浸在一项活动中时,您会体验到流动。 流动状态是导致幸福和情感幸福的最高水平活动之一。

    Flow是真正的生活黑客。 我是在不知道状态的情况下发现这种状态的,我承认,在大学里,我的大部分成功都来自于我有能力使自己不断发展。 我可以回想起大多数人不喜欢的无聊主题。 开发人员平均要参加2项考试才能通过该主题。 这意味着大多数人至少失败了一次。 即使我从未参加过讲座,我也能在四天内从内而外地学习了整个主题。 相信我,我不是一个超级学习的天才。 我只花了我专注的学习时间的前几个小时,就对这个主题产生了真正的兴趣。 学习这个科目对我来说是一次很棒的经历,甚至教授也看到了我的真正兴奋。 Just imagine what it would be like to spend the rest of your career loving what you do, and learning with ease.

    If you make your tech career your mission, action will follow, and you will be happy while pursuing your goals.

    摘要

    If you are a junior developer, you can easily reduce your learning curve by years by using the right mindset, tools, and techniques.

    Marketing yourself properly will make sure that you will be contacted with great employment, freelance, and business opportunities. Your negotiation power and your potential promotions are also influenced by your personal brand.

    By developing a professional attitude, your colleagues will relate to you better, and you will also get more out of your learning experience as a developer.

    While growing, leverage the peer group effect. Join communities, where you can grow and mature together with other software developers who keep you accountable.

    Regardless of how good your personal brand is, how well you develop your professional attitude, and what kinds of connections you make, you will have to go to tech interviews. Therefore, it is inevitable for you to learn some tech interview techniques.

    System design skills help you both in your professional practice and in your coding interviews.

    All these areas sound like a lot of effort. They have one thing in common: you have to learn to accomplish anything. If you know how to learn, you can advance in your career quickly. Therefore, investing in learning how to learn effectively saves you a lot of time and could potentially earn you a lot of money in the long run.

    If you've enjoyed this article, please help it spread by clapping below! For more content like this, follow us on Twitter and subscribe to our blog.

    And if you want to add a blog or CMS to your website without messing around with Wordpress, you should try Butter CMS . ButterCMS is a headless CMS that lets you build CMS-powered apps using any programming language including Ruby , Rails , Node.js , Python , ASP.NET , Flask , Django , Go , PHP , Laravel , Angular , React , Elixir , Phoenix , Meteor , Vue.js , and Gatsby.js

    翻译自: https://hackernoon.com/6-skills-junior-developer-should-prioritize-b7efd56ce909

    初级java开发必备技能

    展开全文
  • java必备开发知识和技能

    千次阅读 2019-04-18 22:23:07
    Java接口配IP是配2个的,因为有2个跟踪器,而java接口连接IP时并不是智能的,如果连接第一个跟踪器没反应(第一个没反应不是忙就是挂了),它就会连接第二个跟踪器,不管连哪个跟踪器,最终都会返回一个地址给java...

    技术QQ群:413860876

    1. 线程和进程的区别

    线程三个基本状态:就绪、执行、阻塞

    线程五个基本操作:创建、就绪、运行、阻塞、终止

    进程四种形式:主从式、会话式、消息或邮箱机制、共享存储区方式

    进程是具有一定功能的程序关于某次数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。一个进程包含多个线程。

    线程是进程的一个实体,是CPU调度和分配的基本单元。

    2. JSP四大域对象和九大内置对象

    四大域对象:PageContext、request、session、servletContext

    九大内置对象:request、response、application、config、Exception、page、out、pageContext、session

    3. 使用final关键词修饰一个变量的时候是引用不能变还是引用的对象不能变?

    Final关键词修饰一个变量是指引用变量不能变。引用变量所指对象的内容是可以变化的。

    4. Private、protected、public的区别

    private:
    继承成员但没有访问权限。(可以通过此类中的protected成员函数和public成员函数访问。)
    protected:
    继承成员,有访问权限,类外没有访问权限,不可将继承的protected修改为private.
    public:
    继承成员,有访问权限,类外有访问权限。

    5. 父类和子类都有静态代码块时,创建子类是先执行哪类?

    静态代码块在JVM加载类的时候先执行,父类先于子类执行。

    6. Junit中before和beforeclass的区别

    Before 在每个测试方法之前都会运行一次,只需要声明public

    BeforeClass 在类中只运行一次,必须声明成public static

    7. 单例模式

    public class Singleton {  

        private static Singleton sl;  

        private Singleton (){}  

        public static synchronized Singleton getInstance() {  

        if (sl== null) {  

            sl= new Singleton();  

        }  

        return sl;  

        }  

    }  

    8. Redis数据结构

    String-字符串 Hash-字典 list-列表 set-集合 sorted set-有序集合

    9. HashMap、HashSet和HashTable的区别

    HashMap基于Map接口实现,线程非同步所以不安全。键是唯一不可重复的,但是value值可以重复且允许空值存在。

    HashTable是基于Dictionary类实现,线程默认同步所以是安全的,键值唯一且不为空,value值不能为空值。

    HashSet是基于set实现的,以对象作为元素,且拒绝重复对象。内部使用HashMap实现,其实就是HashMap的一个视图。

    10. ArrayList和LinkedList的区别

    ArrayList是基于动态数组的数据结构,查询较快

    LinkedList是基于链表的数据结构,因为不需要移动数据,所以增删较快。

    11. 线程中wait和sleep的区别

    Wait方法属于Object类,使线程放弃进入执行,进入线程等待池,只能使用notify或notifyAll方法才能唤醒此线程,线程会等待进入线程池。即使在执行此方法时,线程已进入线程池,依然会放弃执行,让出线程池,交出锁。即使线程被激活,也需要等待前方线程执行完毕后才可进入线程池执行。

    Sleep方法属于Thread类,使线程在指定时间内暂停执行,让cup暂时执行其他线程,但这个线程的监控状态依然保持,当执行时间到了以后,该线程恢复到之前状态,继续执行,线程不会释放锁。

    12. Equals和==的区别

    ==是一个运算符,是逻辑上的判断,比较的是引用地址。

    Equals是String的一个方法,是比较引用地址,在Object类时,Equals和==是一样的,对于其他类来说如果重新了Equals方法,则比较的两个对象的数据内容。

    13. HashCode和Equals

    HashCode和Equals都是在Object类中定义的,是对两个对象地址的比较,如果重写了Equals方法就必须重写HashCode方法。

    HashCode方法返回的是对象的散列码,返回值是int类型的散列码;Equals返回的是true和false。

    如果两个对象相同,他们的HashCode值必须相同;如果两个对象的HashCode值相同,他们不一样相同。

    14. 方法重载和重写的区别

    方法重载:在同一个类中,方法名称相同,参数类型和个数不同,返回值也可以不同。

    方法重写:父子类、接口和实现类之间的关系,子类可以重写父类方法,但是参数个数、类型、返回值必须相同。

    15. Junit中before和beforeclass的区别

    Before是初始化方法,在每个程序运行之前都会执行一次。

    Beforeclass在类中只运行一次。

    16. STAR法则

    Situation: 事情是在什么情况下发生

    Task: 你是如何明确你的任务的

    Action: 针对这样的情况分析,你采用了什么行动方式

    Result: 结果怎样,在这样的情况下你学习到了什么

    17. Cookie和Session的区别

    cookie数据存储在客户的浏览器上,cookie是不安全的,别人可以分析存放在本地cookie并进行cookie欺骗;

    Session存储在服务器上,Session是安全的;当访问增多时,Session会占用服务器性能,可以考虑使用cookie

    建议将登陆信息等重要信息保存在Session中,其他需要保留的信息可以存在cookie中。

    18. JQuery有哪些选择器

    ID选择器、类选择器、层次选择器、组合选择器、属性选择器、表单选择器等等

    19. 事务的特性和隔离级别

    特性:原子性、一致性、隔离性、持久性。

    隔离级别:

     ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

     ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

     ③ Read committed (读已提交):可避免脏读的发生。

     ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

    20. POI上传数据量过大

    可分批处理  先行保存部分内容至数据库,再清空list集合,重新导入内容

    21. 前缀编码

    在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀。

    22. JVM清理垃圾命令

    GC.run

    23. 循环队列引入的目的

    消除线性队列的“假溢出”,充分利用存储空间。

    24. Webservice是什么?它的引擎是什么?

    WebService是一个平台独立的、低耦合的,自包含的、基于可编程的web应用程序,可使用开放的xml标准来描述、发现、发布、协调和配置这些应用程序,是用户开发互操作的分布式系统。最基本的目的就是提供在各个不同平台的不同应用系统的系统工作能力。

    25. Tomcat集群中怎么实现共享

    1:Tomcat的Session复制。在一台Tomcat的Session发生变化时,将变更的数据分发给其它的Tomcat服务器。

    2: 采用 memcached session manager 共享session。

    26. Git和Svn有什么区别?

    1:git是分布式的版本控制系统,SVN不是。GIT和SVN都有自己的集中式版本库或服务器,但是GIT更倾向分布式使用。

    2:GIT把内容按数据方式存储,而SVN是按文件存储的。

    3:GIT可以很容易的发现未被合并的分支,SVN需要手动运行命令来确定代码是否被合并。

    4:GIT没有一个全局的版本号,SVN有。但GIT内容完整性要优于SVN。

    5:GIT在下载后即使在不联网状态也可以看到所有数据,但SVN必须要联网。

    6:GIT的提交速度优于SVN,且GIT可以有无限个版本库,但SVN只有一个中央数据库,一旦这个中央库有问题,则所有代码都会全部瘫痪。

    7:管理一个GIT库相对于管理一个SVN库更容易。

    27. dubbo服务开发流程,运行流程?zookeeper注册中心的作用?端口是多少?

    服务容器负责启动,加载,运行服务提供者。

    1. 服务提供者在启动时,向注册中心(默认端口2181)注册自己提供的服务。

    2. 服务消费者在启动时,向注册中心订阅自己所需的服务。

    3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

    4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

    5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    28. redis为什么可以做缓存?redis都是怎么用的?都用来存什么了?redis的存储结构?Redis集群搭建?redis的事务;redis丢失问题

    使用redis做缓存的原因

    redis是用C语言编写的,稳定性和性能更好。支持集群模式和持久化等特性,不会应为缓存量太多而导致虚拟机崩溃。Redis是独立部署的,即使网站更新,redis缓存的数据也不会消失。

    集群搭建(redis需要3台主机,3台从机,则配置6台,需要6个端口):

    1:安装ruby环境,上传接口工程,安装接口程序,拷贝脚本到指定位置

    2:创建6个redis实例,修改配置文件 ,然后启动所有redis实例(为简化启动步骤,可编写启动脚本)。

    3:执行创建集群的命令,连接测试

    redis的事务

    Redis的事务是一组命令的集合,Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。

    redis丢失问题常见原因:

    程序bug或人为误操作
    · 因客户端缓冲区内存使用过大,导致大量键被LRU淘汰
    · 主库故障后自动重启,可能导致数据丢失
    · 网络分区的问题,可能导致短时间的写入数据丢失
    · 主从复制数据不一致,发生故障切换后,出现数据丢失
    · 大量过期键,同时被淘汰清理

    29. 消息中间件acitveMQ的作用、原理?

    作用:acitveMQ就是消息队列,activemq安装之后,会有一个broker(经纪人)。

    消息的生产者将消息发送到broker中,它不关心谁消费该消息。

    消息的消费者去broker中获取信息,它不关心谁提供消息

    30. AJAX的怎样实现同步或者怎样实现异步?

    $.ajax({
        async:false // 为false 时 为同步, 默认 为true , 为异步
    })

    31. fastDFS分布式文件系统

    fastDFS有两个角色:跟踪器(tracker)和存储节点(storage);

    存储数据:

    跟踪器负责记录图片地址,和响应java接口访问。java接口要想储存图片地址需向跟踪器发送请求,然后由跟踪器查找图片仓库地址发给java接口,同时记录储存过程,

    Java接口配IP是配2个的,因为有2个跟踪器,而java接口连接IP时并不是智能的,如果连接第一个跟踪器没反应(第一个没反应不是忙就是挂了),它就会连接第二个跟踪器,不管连哪个跟踪器,最终都会返回一个地址给java接口。而两个跟踪器之间是有通信的,它们会把信息同步的,这个信息也就是meta信息,也就是管理的帐本。

    跟踪器和存储节点有通信间隔时间,这个时间由我们决定。而存储节点之间也是有通信的,如果有一天存储节点和存储节点的仓库都满了,就扩张仓库,创建下一组存储节点和存储仓库。

    取数据:

    取数据的时候可以用java接口取,也可以用页面里的<img src=”http//…..jpg/>”取,但是src属性会在页面加载后发出2次请求。Src会根据地址去找跟踪器,而跟踪器会告诉它这地址图片在哪个存储节点身上,跟踪器这台机器上搭建是nginx服务器(反向代理服务器)这个服务器是用来解决高并发用的。Nginx服务器会根据你的路径找到存储节点身上的图片。然后再将存储节点的图片拿回来,再加载给src,到img标签里。

    启动:

    先设置IP再修改IP,然后三个命令分别启动跟踪器,存储节点,Nginx服务器

    32. Maven-热部署

    热部署:就是maven管理的项目发布到测试服务器,省去以往发布时要不停的启动、关闭tomcat这些繁琐 的过程;热:就是tomcat一直保持开启状态,

    1、设置tomcat用户名和密码,然后启动tomcat

    2、在你所要发布的项目里的pom.xml里设置你要发布项目的路径同时把tomcat用户名和密码也设置上

    3、发送发布命tomcat7:deploy

    4、强硬发布命令:tomcat7:redeploy

    33. Log4j的输出级别都有哪些

    DEBUG Level: 指出细粒度信息事件对调试应用程序是非常有帮助的,就是输出debug的信息.
    INFO level: 表明消息在粗粒度级别上突出强调应用程序的运行过程,就是输出提示信息.
    WARN level: 表明会出现潜在错误的情形,就是显示警告信息.
    ERROR level: 指出虽然发生错误事件,但仍然不影响系统的继续运行.就是显示错误信息.
    FATAL level: 指出每个严重的错误事件将会导致应用程序的退出.
    ALL level: 是最低等级的,用于打开所有日志记录.
    OFF level: 是最高等级的,用于关闭所有日志记录.

    34. zookeeper存在什么缺陷

    本身不是为高可用性设计,撑不住高流量容易导致系统崩溃。还有对网络隔离的敏感也导致Zookeeper的脆弱

    35. 开启多线程的三种方式

    1) 继承thread类  重新run函数  对象。start开启

    2) 实现runnnable接口  重写run函数

    3) 实现callable

    36. 接口collection和抽象类abstrator class 的区别

    1)接口是公开的,不能有私有方法和变量,但是抽象类可以

    2)实现一个接口必须实现接口的方法,抽象类可以重写也可以不重写

    3)接口可以实现多重继承,抽象类只能实现多个接口

    37. override和overload的区别

    重写是指子类继承父类,重写父类的方法。重载是多态的一种表现形式,是指在同一类中方法名相同参数列表不同的同命名方法。

    38. 匿名内部类

    匿名内部类也就是没有名字的内部类

    正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

    但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

    框架部分

    1. SpringMVC接收参数的方式

    1:通过@PathVariable获取路径中传递的参数 在方法参数前

    2:通过@ModelAttribute获取post请求中的form表单数据 在方法参数前

    3:通过HttpServletRequest获取

    3:用@RequestParam

    2. SpringMVC配置文件

    Web.xml:初始化spring容器 加载配置文件 contextConfigLocation

    配置前端控制器 加载SpringMVC.Xml 设定startup为1,启动时加载 过滤所有请求

    统一编码方式 CharacterEncodingFilter 过滤所有请求

    Spring.xml:配置包扫描器 context:component-scan

    配置注解驱动 mvc:annotation-driven

    配置视图解析器 InternalResourceViewResolver <bean>

    加载静态资源 mvc:resources

    配置多部件解析器 CommonsMultipartResolver 设定默认编码和文件上传的最大值

    加载Java的其余配置文件 context:property-placeholder

    3. ssm和ssh的区别或者优势

    SSH通常指Struts2做控制器,Spring管理各种组件,Hibernate负责持久化层。

    SSM通常指SpringMVC做控制器,Spring管理各层组件,Mybatis负责持久化层。

    相同点:1:Spring依赖注入来管理各层组件

    2:使用面向切面的AOP编程思想管理事务、日志、权限等。

    不同点:Struts2和SpringMVC控制器控制视图和交互机制不同。

    4. Struts2和SpringMVC的区别

    1:SpringMVC开发效率高于Struts2,且SpringMVC以基本实现0配置。

    2:SpringMVC实现依赖Servlet,是单例的,参数基于方法进行封装。

    3:SpringMVC是方法级别的拦截,一个方法对应一个request上下文,方法对应URL。方法之间的变量是不共享的,方法是独立的,可以使用注解方式接收参数。

    4:Struts2是类级别的拦截,一个类对应一个request的上下文,配置文件较复杂,架构比较费时费力。虽然每个方法之间也是独立的,但所有类变量都是共享的,虽然不影响运行,但是编码、读程序却比较麻烦。

    5:Struts2实现依赖过滤器,是多例的,参数是基于属性进行封装。

    6:Struts2需要封装每一个Request,把每个生命周期变量封装成一个个的MAP集合,并要保证线程的安全,比较耗费内存。

    5. Hibernate和MYbatis的区别

    相同点:Hibernate和Mybatis都是通过SessionFactoryBuider由xml文件生成SessionFactory,然后生成Session,由Session开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。都支持JDBC和JTA事务处理。

    不同点:

    Mybatis:Mybatis可以进行更为细致的SQL优化,可以减少查询字段。

    Mybatis相对于Hibernate更容易掌握,门栏较低。

    Hibernate:Hibernate的DAO层开发比Mybatis更简单,因为Mybatis需要维 护SQL和映射结果。

      Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。

      Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。

      Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

    6. Hibernate的一级缓存和二级缓存

    Hibernate的一级缓存指的是Session缓存,因为Session缓存是内置的,是Hibernate的默认配置;二级缓存指的是SessionFactory的外置缓存,因为外置缓存是数据库数据的拷贝,介质可以是内存或硬盘,需要手动开启。

    7. spring的事务管理

    Spring的事务管理分为声明式和编程式。声明式事务可以使用tx标签方式、使用代理方式以及拦截器方式。编程式事务需要在配置中配置Session工厂,配置事务管理器,开启注解扫描,使用@Service

    8. springmvc的注解都有哪些

    @Controller  @requestMapping @PathVariable @RequestParam@RequestBody @ResponseBody @RestController @ModelAttribute

    9. hibernate的优化

    1:数据库设计时要降低关联的复杂性,尽量不使用联合主键,适用冗余数据,不过分追求高范式

    2:使用延迟加载

    10. hibernate的五个核心类

    Configuration,sessionfactory,Session,query接口,transaction接口

    11. Spring的优点: 缺点

    优点:

    方便解耦,简化开发---Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理

    AOP编程的支持---Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

    声明式事务的支持---只需要通过配置就可以完成对事务的管理,而无需手动编程

    方便程序的测试---Spring对Junit4支持,可以通过注解方便的测试Spring程序

    方便集成各种优秀框架---Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持

    降低JavaEE API的使用难度---Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

     

    缺点:

    jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器

    12. spring工作机制和为什么要用

    工作机制:Spring的核心就是IOC和AOP所以Spring的工作机制简单的理解也就是IOC和AOP的工作机制。

     原因:借助于Spring AOP,Spring IOC能够很方便的使用到非常健壮、灵活的企业级服务,通过使用IoC能够降低组件之间的耦合度,最终,能够提高类的重用性,利于测试,而且更利于整个产品或系统集成和配置

    13. AOP和IOC概念和在spring中如何应用

    Springmvc是spring一部分

    IOC:控制反转,生产对象用。控制权由应用代码中转到了外部容器,控制权的转移,是所谓的反转。

    AOP:面向切面编程,底层使用动态代理,作用:管理事务和安全监控,事务 只需要配置一次就不用再配置。

    14. MVC设计思想

    Mvc是一个架构设计思想:

    用户发送请求至控制器(Controller),控制层把用户请求转发给模型Model层进行数据处理,Model层内包含javabean组件、领域模型、业务层、持久层,Model层处理完数据层响应给控制层,控制层再次把数据发送给视图View进行视图编译,然后由View层把视图页面返回给控制层,控制层再响应给用户。

    15. Springmvc框架原理

    • 用户发送请求给前端控制器DisPatcherserlvlet:前端控制器只负责接受请求,转发请求,响应结果数据。DispatcherServlet就是一个中央控制器。
    • 前端控制器需要委托处理器映射器去寻找获取Handler(Controller)
    • 处理器映射器根据浏览器请求去寻找指定属性的Controller
    • 返回执行Chain(链),链中具有很多拦截器 ,Handler(Controller)在拦截器中间被返回给前端控制器。
    • 前端控制器拿到Controller以后需要去执行Controller,交给处理器适配器去执行
    • 处理器适配器负责调用Controller里面的方法,进行执行Controller
    • Controller返回一个模型视图(ModelAndView)
    • 处理器适配器把这个ModelandVIew交给前端控制器
    • 前端控制器把模型视图ModelAndView给视图解析器(viewResolver)解析出物理视图

    返回给前端控制器

    • 渲染视图:el+jsp el表达把model数据解析封装到jsp页面的过程就叫渲染视图
    • 返回用户

    16. POJO概念

    POJO是mybatis中的返回值的参数类型,它和bean一样意思。Bean是指类,而POJO把类看成对象。Mybatis是在JDBC上做的封装,为了使SQL语句不再是硬编码和不用再按顺序执行,为了在框架里获取sql语句而设定的一种概念,得到的是动态SQL。

    17. Freemaker页面静态化怎么实现的,商品下架怎么删除,静态化页面可以发送异步请求吗?Freemaker放在那里,如何访问

    实现过程:

    在商品添加服务中发送商品ID消息,接收消息中的商品ID。

    从spring上下文中获取Freemarker的配置文件(configuration)对象。

    通过configuration创建模板(template对象),模板的名称在java配置文件中配置。

    创建模板数据:根据商品ID查询出商品信息,如果没有数据,抛出异常。

    指定输出文本。文本的路径在java配置文件中配置,文本的名称是商品ID,文本的后缀在java配置文件中配置。

    调用template的process方法,生成输出文件。

     

    可以发送异步请求,使用Nginx访问

    18. Hibernate对象的三种形态

    临时状态(transient):刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象称为临时对象。

    持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象称为持久化对象。

    游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象称为游离对象。

    Java对象:开始生命周期——》临时状态——》持久化状态——》游离状态——》结束生命周期

    19. servlet的生命周期

     1,实例化阶段  调用init()方法

     2,服务阶段  调用service()方法

     3,销毁阶段  调用destroy()方法

    首先客户发送一个请求,Servlet是调用service()方法对请求进行响应,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doPost,doGet等这些方法。

    20. ORM

    对象关系映射,也就是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

    21. JVM

    JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。

    JVM执行程序的过程 :

    I.加载.class文件

    II.管理并分配内存

    III.执行垃圾收集

    22. JDBC

    JDBC(java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

    23. Struts2框架工作流程及原理

    1、客户端浏览器发出HTTP请求.

    2、根据web.xml配置,该请求被FilterDispatcher接收

    3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton

    4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。

    5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面

    6、返回HTTP响应到客户端浏览器

    原理:

    1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 
    2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 
    3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 
    4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
    5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 
    6 ActionProxy创建一个ActionInvocation的实例。 
    7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 
    8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 

    数据库部分

    1. 数据库优化问题

    1:表的设计要符合三范式。

    2:添加适当存储过程,触发器,事务等。

    3:添加适当的索引,索引对查询速度影响很大,必须添加索引。主键索引,唯一索引,普通索引,全文索引

    4:读写分离(主从数据库,主数据库进行写的操作,从数据库惊醒读的操作,主数据库将数据更新到从数据库)

    5:对sql语句的一些优化,(查询执行速度比较慢的sql语句)

    a:查询中避免使用通配符,尽量使用索引。选择联合查询的联合次序

    b:在子查询中避免使用in 或 not in 语句,使用where (NOT) exists的效果要好的多;避免使用BY RAND随机显示结果。

    c:使用联合(UNION)代替手动创建的临时表,拆分表格。

    d:尽可能的使用NOT NULL(非空),对MySQL的配置进行优化

    6:分表分区

    分表:把一张大表分成多张表。分区:把一张表里面的分配到不同的区域存储,

    对mysql服务器硬件的升级操作。

    2. 如果数据库里边的大表添加字段  怎么弄效率最高

    alter table ~ add  ~  添加列

    3. mysql默认的最大连接数是多少?

    mysql的最大连接数默认是100, 最大可以达到16384

    4. mysql分页;limit关键字

    limit关键字:LIMIT 可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)

    5. 创建索引库的优缺点?

    优点:通过创建唯一性索引,可以保证数据库中每一行数据的唯一性,2,可以大大加快数据的检索速度,这也是创建索引的最主要的原因,3.可以加速表与表之间的连接,特别是在实现数据的参考完整性。

    缺点:创建索引和维护索引需要消耗时间,这种时间随着数据的增加而增加,2.索引占用物理空间,需要的空间变大,3.当对数据库中的数据进行增删改的时候,索引也需要动态的维护,此时降低了维护速度。

    6. 集合去重,数据库去重;(集合去重有contains方法;数据库去重用group by)

    集合去重:

    a:转化为Set集合,因为HashSet集合不允许重复值存在。

    b:使用双重循环删除重复的值或者用null代替

    c:用contains方法

    数据库去重:

    a:使用嵌套的查询 得到所有的不重复数据的Id,使用 not in 关键字删除所有ID不在以上范围中的数据。

    b:使用嵌套的查询 得到所有的不重复数据的Id,将所有数据存储到一个临时表中,删除原表,重新构建原表,将临时表数据导入原表,删除临时表

    7. 怎样建立索引?

    普通索引:添加index

    Alter table user add index_name(name),括号内为字段名称

    主键索引

    Alert table user add primary key(id)

    唯一索引:添加unique

    Alert table user add unique (creattime)

    全文索引:添加fulltext

    Alert table user add fulltext(name)

    8. mysql存储过程

    Mysql存储过程就是为完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时,用户只需要通过指定存储过程的名字并给定参数就可以调用。

    存储过程是一个可编程的函数,在数据库中创建并保存。可以有SQL语句和一些特殊的控制结构组成。可以看做是对编程中面向对象的模拟。

    9. MySQL与Oracle的区别

    1.  Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源免费的而Oracle价格非常高。

    2. Oracle支持大并发,大访问量,是OLTP最好的工具。

    3. 安装所用的空间差别也是很大的,Mysql安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。

    4.Oracle也Mysql操作上的一些区别

    ①主键 Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。

    ②单引号的处理 MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

    ③翻页的SQL语句的处理 MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80

    ④ 长字符串的处理 长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。 ⑤空字符的处理 MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

    ⑥字符串的模糊比较 MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快。

     

    ⑦Oracle实现了ANSII SQL中大部分功能,如,事务的隔离级别、传播特性等而Mysql在这方面还是比较的若

    展开全文
  • ❤️高级JAVA开发必备技能❤️java8 新日期时间API((四)JSR-310:常用计算工具)(JAVA java 小虚竹)
  • ❤️高级JAVA开发必备技能❤️java8 新日期时间API((五)JSR-310:实战+源码分析),5万字详解(JAVA java 小虚竹)
  • 1、dubbo+zookeeper 2、nosql缓存(redis) 3、jvm基础理论以及gc几种回收算法 4、消息队列(activeMQ) 5、定时任务 6、多线程以及线程池 自己面试前,呕心沥血整理,全手工原创。真正掌握了,面试就是水到渠成,...
  • ❤️高级JAVA开发必备技能❤️java8 JSR-310判断是否闰年实现(JAVA java 小虚竹 )
  • 我们在从事java开发过程中,或多或少都会遇到一些我们程序员不被期望的事件,它会影响整个程序的整体运行,针对此类情况,Java提供了一种专门处理这类问题的机制:异常处理机制。 我们今天就来了解下它是如何来处理异常...
  • Java开发人员必备技能

    2020-04-09 12:58:05
    在本教程中,我们将看到Java开发人员的必备技能。 2. Java开发人员必须具备技能 对于Java开发人员来说,开发和集成业务应用程序需要该人具有核心技能。 该人员需要了解客户的愿景和业务需求才能开发企业级应用...
  • java中级开发人员技能 日复一日地编写代码很容易让人感到无聊。 当您不是从头开始构建新应用程序,而是在编写错误修复程序和较小的增强功能时,尤其如此。 开发人员应挑战自己并培养技能,以使他们的工作保持有趣并...
  • 高级JAVA开发必须掌握技能java8 新日期时间API((一)JSR-310:ZoneId 时区和偏移量)
  • 高级JAVA开发必须掌握技能java8 新日期时间API((二)JSR-310:常用的日期时间API

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,739
精华内容 9,895
关键字:

java开发必备技能

java 订阅