java吧 关注:1,256,318贴子:12,749,185

回复:简单讲讲自己成为架构的经历

只看楼主收藏回复

1.1.4 数组,容器
java提供了一套非常有用且强大的api,通过这套api几乎可以满足绝大部分工作中对于数据存储转换传递的需要.
这就是java的容器类.这里的容器是指java当中存放对象的一些数据结构.简单来说就是放数据的内容
学习容器首先需要理解容器的概念和容器能帮助我们做什么.在实际工作中经常会对一些数据处理.通过java处理一批数据必定需要
把这些数据放起来.然后做操作.java当中的容器就是放这些东西的类.
就像之前我所讲的.对于面向对象来说,我们需要对于我们的功能进行抽象.所以java当中提供了一些接口来表达容器对应的功能
容器有:Collection,Map
进一步划分有:List,Set
容器的实现有:
ArrayList,LinkedList,Vector->Stack
HashSet->LinkedHashSet,TreeSet
HashMap->LinkedHashMap,TreeMap
这里就很有意思了.大家发现实现类有这么多种,是不是没一个都是不用的用法呢?
其实只有两个,一个是Collection一个是Map.
这就是我之前说的抽象的概念,我们抽象的是通用操作方法.不同的实现提供的是内部不同的功能实现.一个相同的操作方法可能会有不同的表现形式.希望大家体会体会.
同样,对于容器的迭代使用java也抽象出了公用的迭代器:Iterator,用于封装同样的访问方法.虽然map无法直接使用迭代器进行访问,但是map的key和entry是可以使用的.这些内容比较基础.大家学习会各个容器的访问和设置方法自己多联系联系即可
下面说一些学习核心:
1. 对于了解容器类.首先需要了解的是每一个不同容器的实现逻辑和内存结构.一定要至少知道内存结构.比如ArrayList是一个数组,LinkedList是一个链表结构.
同样的.对于HashMap重点理解"链表散列"这个概念.如果实在无法理解,就多多看几遍代码.HashMap在设计上有个hash思想.这个通过Hash值来离散数据的设计可以用在很多地方.可以多多理解,比如数据水平拆分,负载均衡设计.包括分布式缓存中的一致性hash设计.都是基于这个.
2. 对于不同内存结构.带来功能和性能上的不同需要理解到.比如经常问到的Array和Linked这两个的性能区别和使用场景区别
需要能够自己理解到.比如随机访问的情况用LinkedList还是ArrayList?
答案是都不用,重写hashCode方法然后用HashMap.希望大家真的能理解这点.
3. 对于容器的迭代器.插入删除的并发控制.目前记住这点内容即可.后续在并发的时候重点有并发的讲解
4. map是一个很特殊的容器.因为使用场景实在太多了.所以jdk1.8对hashMap进行了优化.大家一定要去详细了解一下.(这里不说了.因为这个都已经可以形成一个blog了)
5. 常用编程规范.目前学习到现在应该养成一些编程规范了.比如初始化容器的时候指定大小这些.


来自Android客户端514楼2019-03-23 23:10
收起回复
    1.1.5 多线程与并发
    多线程和容器需要一起来看.前几天面试一个同学的时候就挂在多线程这部分了.他说他的web开发中几乎用不到多线程.
    当时我就立即说到.tomcat的线程模型是什么.不同的req是不是运行在不同的线程里面?只是你没有关注过罢了.
    所以可以看出来.如果不是做基础架构.一般多线程使用场景较少.一般用多线程的场景也建议使用统一异步调度的方式来进行.
    比如在蚂蚁,定时调度使用schedule和三层分发来做.
    但是大家必须意识到.自己的程序天然就是运行在多线程里面的.
    在面试过程中会单独考察多线程的概念和联合容器一起考察.后者工作中用到的更多.
    java多线程体系:
    1. 基本的多线程操作.Thread类.启动线程的方法.线程并发的概念.线程安全的处理方式.Sync的方式
    然后就是 jdk 1.5中的concurrent包中的新的方式.Lock和Sync的区别.这些基础必须学习好
    2. 线程通信的概念,notify的含义.volatile的底层处理方式
    3. 底层cpu指令集.性能概述
    4. 在工作中使用容器时的并发处理.如map是如何进行并发控制的ConcurrentHashMap和Collections.con的区别是什么.
    5. 线程模型.如boss线程守护.多线程轮训的方式.这里涉及到线程池的概念.Executor的处理
    多线程的内容非常非常多.需要大量的阅读书籍和练习才能掌握.对于一开始学习java来说.可以考虑先了解概念
    针对面试常问的来学习.一般我在面试的时候会重点问下面几个问题
    1. 多线程并发控制方式. 答案:api方式sync和lock. 设计方式去掉共享变量.
    2. 容器的并发控制方式区别.map的区别和性能.
    3. 线程池的相关操作.
    由于一般在工作中极少极少用到notify相关内容.所以一般较少考察.不过建议大家学习的时候一定要学习会.
    比如下面这个联系题
    A,B,C三个线程执行任务.X发放任务.按照A->B->C的方式进行多线程处理任务.用代码实现.
    希望大家思考思考.用sync和notify的方式来做


    来自Android客户端515楼2019-03-23 23:11
    收起回复
      大神你好,我88年的,学的电子信息工程,2011年毕业之后做了半年硬件调试之后就一直在做销售,做的很难受,不是不赚钱,而是自己性格内向不适合干这个,我还是喜欢钻研点东西,准备入坑软件行业,目前自学Java一个月,我已经32岁高龄了,贴吧里的劝退大军太可怕了,求大神给指条明路,我现在转行还有戏嘛……?


      来自iPhone客户端517楼2019-03-23 23:42
      回复
        1.1.6 java异常处理
        java对于异常很多人诟病很多.不过基于java异常也可以实现很多优雅的设计.
        并且异常也是非常多架构设计中需要考虑的内容.所以针对java的异常学习.除了需要学习基本的概念意外.
        需要重点掌握的是针对异常的一些设计.
        对于基础知识.
        1. 最简单的.了解Throwable,Error,Exception,RuntimeException这些的概念.并且知道用法.对于try-catch-finally需要明白是做什么的
        2. 异常设计.一些基本的设计概念.比如通用的需要检查的异常处理内容.方法上抛出的异常.try-catch处理转换.日志打印等内容
        对于基础知识来说大家肯定用到了.比如多线程的时候就有打断异常.所以这里不过多介绍.
        我更加想给大家介绍一些基本的异常设计方法.可能大家不会太理解.不过知道这个概念也行
        工业场景下的典型异常设计方法:
        1. RuntimeException
        事实上,对于Exception真的是深恶痛绝.这个东西真的会让代码变的非常难看.我们更希望使用非检查异常.并且是自定义异常.
        所以最基础的就是.一般我们会设计一个基础异常比如 MyException 继承RuntimeException.
        然后把所有的Exception进行try-catch.统一处理成自己的异常.
        这样做的好处是.我们可以在架构层面把底层异常封装起来.进行一些特殊处理.让其他同学focus on business.
        同时.对外返回统一的业务异常.可以方便使用者统一的进行处理.
        2. 统一异常处理设计
        一般在程序中.我们是不会到处使用try-catch的.会在 入口层面统一异常处理.返回特定的结果.如果是web服务器的架构.
        可以使用filter或者springmvc 的interceptor这种方式.
        这样做的好处就是可以定义一套完整的公用的异常处理内容.让业务异常统一处理
        并且业务check代码也非常优雅.比如可以用Checker.notNull的方式进行检查.统一报错.这样就不用书写
        if(obj ==null){//do something}这样的代码了
        3. none Exception设计
        关于这点可能有很多疑问.这里主要分业务系统和中间件.其实中间件还是会有很多的异常抛出的.
        但是业务系统上一般都设计成没有任何异常抛出.因为对于系统异常.业务系统也需要返回一个特殊的处理内容.让外围可以明确的知道
        否则每个系统抛出大量异常.会让调用方非常难以接受.
        此外对于一些Aop的设计和处理.为了通用性考虑.我们一般也不会进行异常的抛出.


        来自Android客户端519楼2019-03-24 11:43
        回复
          好久没更新 就多更新一些大家来看看呀


          来自Android客户端520楼2019-03-24 11:43
          收起回复
            板凳


            IP属地:广东来自Android客户端521楼2019-03-24 11:44
            回复
              辛苦了


              IP属地:江西523楼2019-03-24 13:06
              回复
                32岁转行干软件还来得及么?


                来自iPhone客户端524楼2019-03-24 17:26
                收起回复
                  1.1.7 封装,继承,多态,接口.
                  这个概念实际上在面向对象中应该讲到.但是在面向对象里面我更加希望介绍面向对象是一种设计思想的方式
                  而这里的技术概念.是java来实现面向对象的一些基本方法.
                  首先必须了解面向对象的概念.这里建议大家重新阅读我之前的概述.并且在这之前建议大家了解面向对象五大原则
                  他们是:SRP单一职责,OCP开闭,LSP里式替换,DIP依赖倒置,ISP接口隔离
                  这些职责有很多相似的地方.大家一定完全的明白.并且了解每个原则的概念和细微的差别.比如SRP和OCP对于职责的处理是否有重复描述的地方?这些问题需要能够根据自己的理解来回答.
                  了解了这些概念之后.学习java如何实现面向对象就非常简单了.
                  1. 了解继承的基础内容.extends关键字.什么时候使用继承.为什么要用继承.继承解决了什么样的问题.然后是继承面试中问的,重写父类方法.
                  2. 需要明白什么是多态和java接口的概念.为什么要有interface而不是直接使用abstract class
                  3. 多态.什么是多态的概念.如何实现多态.如何设计多态.
                  4. 一些其他的面试题.如重写重载等.
                  这些基础内容说实话.多写写就知道了.但是知道和正确使用然后是正确设计有着非常大的鸿沟.
                  这里列举一个很简单的例子来让大家学习这些内容.
                  这个知识点可以配合设计模式来学习.我们以工厂模式来学习
                  设定一个工厂接口.他返回一个具体的对象实例.外围系统通过工厂来构建这个实例对象.
                  比如 ToyFactory.我们首先定义接口定义方法createToy.然后写一个实现类实现这个接口.如 R18ToyFactory.
                  返回R18的createToy,同样可以定义R14ToyFactory.返回另外的Toy.不同的Toy都是继承自父类AbstractToy
                  可以在Toy里面定义play方式.不同的工厂返回不同的toy具有不同的play.大家可以试试
                  简单总结
                  java实现面向对象需要了解面向对象原则.然后理解基础api的概念.然后配合设计模式来学习


                  来自Android客户端526楼2019-03-24 21:21
                  回复
                    1.1.8 反射与注解
                    首先讲一下反射的概念.我们之前有讲过面向对象中的对象是一种抽象.抽象到后面只有特征.java在实现面向对象的时候使用class这个东西.
                    很自然的.我们能否针对class来进一步抽象呢.class中有方法.局部变量.构造方法等内容.其实反射就是把class进一步抽象.抽离出定义的class的更加基本的"特征".这些特征我们再次使用对象来表达.就是反射.即把java中的对象的特征来进一步抽象封装成更加基本的对象.
                    以上属于个人理解.
                    标准反射定义是java操作class的api.什么是反射大家还是基于资料自己来进行理解
                    然后学习反射中的基本操作.写一个类然后对应获得对应的class然后尝试做一些操作
                    java反射中有非常多的内容.大家一定要全部学习会.然后进行练习.因为从初级到中级开发.就是反射使用场景的变化
                    这里我简单介绍一下反射的场景.
                    1. 通用型框架
                    因为我们在写框架的时候是给后面的人用的.后面可以自由定义自己的class.所以框架全是基于反射来完成自己的功能的.
                    比如通用日志打印.新写一个类在方法上加一个@Log的注解就可以完成.其实就是通过反射来拦截具体的方法执行.
                    所以反射也和注解一起来使用.标记框架运行的方式.
                    这块的内容非常多.后面我会用具体的例子来说明.这里就不过多介绍了
                    2. 通用功能
                    我们提供一个通用的功能.可能只能基于Object或者泛型的方式来提供.因为这样可以提供更加丰富的功能.
                    但是这样我们就不知道基础类型了.所以只能通过反射的方式来完成.比如把一个bean转换成map
                    我们可以定义Object.然后通过反射的方式获取所有的变量.然后获取对应的值.转换成map返回.
                    典型的如BeanUtils的copy属性.就是基于反射来完成的.
                    简单总结一下吧
                    对于新手,可能需要完全了解到所有的java反射的操作.对于中级.更多的是需要把反射当成一种技术手段来完成自己的工作
                    如果是要面试,那么建议刷刷题即可


                    来自Android客户端527楼2019-03-24 21:21
                    收起回复
                      有更新啦


                      IP属地:北京来自iPhone客户端529楼2019-03-24 23:06
                      回复
                        大佬起床上班了


                        IP属地:北京来自Android客户端530楼2019-03-25 07:31
                        收起回复
                          关注大佬了,以后更新就给顶帖


                          来自iPhone客户端531楼2019-03-25 08:59
                          回复
                            大佬中午好 我来报道了


                            532楼2019-03-25 14:38
                            回复
                              主要的javase部分后面就不过多介绍了
                              相比一些市面上的内容我这里介绍的很粗
                              我只是针对各个常用知识点罗列了一些大家容易忽略的地方 并且记录了一些知识点大家需要重点理解的地方
                              大家千万不要觉得只要学习我说的就可以了 对于基础必须全面夯实
                              接下来简单介绍一下常用框架和一些简单的设计 或者更新一下lz的找工作经历了 最近真的忙 不一定什么时候更新


                              来自Android客户端533楼2019-03-26 00:08
                              收起回复