精华内容
下载资源
问答
  • Java开发面经-2020-8-13

    2020-08-13 21:46:40
    2020.8.13 杭州罗莱迪照明系统公司 Java开发面经 一.技术面试 1.自我介绍 2.java学习的路线,顺序 3.前端框架,后端框架 4.List和Map区别以及底层实现 5.set,vector,list,map以及底层实现 6.线程安全用什么,不安全...

    2020.8.13 杭州罗莱迪照明系统公司 Java开发面经

    一.技术面试

    1.自我介绍

    2.java学习的路线,顺序

    3.前端框架,后端框架

    4.List和Map区别以及底层实现

    5.set,vector,list,map以及底层实现

    6.线程安全用什么,不安全用什么

    7.说下项目的功能和你负责的模块

    8.设计数据库会考虑哪些方面,主键和外键有什么区别

    9.数据库索引

    10.有没有用到Mybatis分页插件

    11.分页如何实现,逻辑

    12.登录注册如何保证数据安全?如何保证数据库数据安全?

    13.MVC请求过程

    14.冒泡排序,快排如何实现

    15.如何定义一个数组长度为n

    16.servlet和controller区别

    17.linux有哪些命令

    18.说下服务器的部署过程

    19.反问

    二.hr面试

    1.说下优缺点

    2.平时爱好,干什么

    3.学校经历

    4.职业规划

    展开全文
  • 垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。 缺点:但是在垂直架构中相同逻辑代码需要...

    分布式and微服务

    Dubbo

    Dubbo开始于电商系统

    • 单一应用框架(ORM)

    当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。
    缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护

    • 垂直应用框架(MVC)

    垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。
    缺点:但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。

    • 分布式应用框架(PRC)

    当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心

    • 流动计算架构(SOA)

    随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架

    Dubbo是什么?

    • 一款分布式服务框架
    • 高性能和透明化的RPC远程服务调用
    • SOA服务治理方案

    Dubbo架构

    img

    • Provider:暴露服务的服务提供方
    • Consumer:调用远程服务的服务消费方
    • Registry:服务注册与发现的注册中心
    • Monitor:统计服务的调用次数和调用时间的监控中心

    Dubbo注册中心

    服务注册中心通过特定的协议来完成服务对外的统一

    Dubbo提供的注册中心有如下几种类型可供选择:

    • Multicast注册中心
    • Zookeeper注册中心
    • Redis注册中心
    • Simple注册中心

    SSM

    SpringBoot、SpringMVC和Spring区别

    sping是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器,Java 开发框架

    spring boot只是一个配置工具,整合工具,辅助工具.

    springmvc是框架,项目中实际运行的代码

    Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的ioc和 aop,ioc 提供了依赖注入的容器, aop解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。

    用最简练的语言概括就是:

    • Spring 是一个“引擎”;
    • Spring MVC 是基于Spring的一个 MVC 框架;
    • Spring Boot 是基于Spring的条件注册的一套快速开发整合包

    Spring Boot 和Spring cloud

    Spring Boot和Spring Cloud的关系
    Spring Boot是 Spring的一套快速配置脚手架,可以基于 Spring Boot快速开发单个微服务, SpringCloud是一个基于 Spring Boot实现的云应用开发工具; Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架; Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置, Spring Cloud很大的一部分是基于 Spring Boot来实现,可以不基于 Spring Boot吗?不可以。 Spring Boot可以离开 Spring Cloud独立使用开发项目,但是 Spring Cloud离不开 Spring Boot,属于依赖的关系
    Spring-> Spring Boot> Spring Cloud这样的关系

    Spring Cloud架构
    我们从整体来看一下 Spring Cloud主要的组件,以及它的访间流程
    1、外部或者内部的非 Spring Cloud目都统一通过API网关(Zuul)来访可内部服务.
    2、网关接收到请求后,从注册中心( Eureka)获取可用服务
    3、由 Ribbon进行负载均衡后,分发到后端的具体实例
    4、徹服务之间通过 Feign进行通信处理业务
    5、 Hystrix负责处理服务超时熔断
    6、 Turbine监控服务间的调用和焠断相关指标

    外部通过网关访问内部服务——网关收到请求,从注册中心获取可用服务——负载均衡(Ribbon,nigix)分发到后端服务——微服务之间通过Feign进行业务处理——Hystrix负责处理服务超时熔断

    Spring Boot的常用注解

    1. @Pathvariable:可用将URL中占位符参数绑定到控制器处理方法的入参中;
    2. @RequestBody和RequestParam:这两个注解都用于方法中参数使用,两者也有一定的区别。前者一般用于处理ajax中声明的是contentType;后者一般用于处理非contentType。
    3. @Service:注解在类上,表示这是一个业务层bean
    4. @Controller:注解在类上,表示这是一个控制层bean
    5. Reponsity:注解在类上,表示这是一个数据访问层的bean
    6. Component:注解在类上,表示通用的bean,value不写默认就是类名的首字母小写。
    7. @Autowired:按类型(byType)注入;和@Qualifier结合使用时,变成byName注入
    8. @Configuration:注解在类上,表示这是一个IoC容器,相当于spring的配置文件
    9. @Bean:注解在方法上,声明当前方法返回一个Bean
    10. ComponentScan:注解在类上,扫描标注了@Controller、@Service、@Conponent等注解的类注册

    Spring Boot常用的starter有哪些?

    spring-boot-starter-web:嵌入式tomcat和web开发需要servlet与jsp支持

    spring-boot-starter-jpa:数据库支持

    spring-boot-starter-redis:redis数据库支持

    spring-boot-starter-solr:solr支持

    mybatis-spring-boot-starter:第三方mybatis基础starter

    Spring Boot自动装配的原理?

    在Spring程序中的main方法上添加@SpringBootApplication或@EnableAutoConfiguration注解,maven会自动去读取starter中的spring.factories文件中所配置的所有spring容器中的bean

    #{}和${}的区别是什么?

    #{}是预编译处理(可以防止SQL注入)把{}替换成变量的值,${}是字符串替换。

    Spring事务

    事务的几种实现方式:主要分为编程式事务和声明式事务

    • 编程式事务就是在代码中调用beginTransaction()、commit()、rollback()等事务管理的相关方法,这就是编程式事务管理。
    • 基于TransactionProxyFactoryBean的声明式事务
    • 基于@Transactional的声明式事务管理

    @Transactional(timeout=“超时时间”,propagation=“事务的传播行为”,isolation=“隔离级别”)

    • 基于Aspectj AOP配置事务

    注:在 Spring 中,事务是通过 TransactionDefinition 接口来定义的

    spring事务和数据库事务的区别?

    spring事务本质上使用数据库事务,而数据库事务本质上使用的是数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁。

    spring事务只有在方法执行过程中,出现异常才会回滚,并且只回滚数据库相关的操作

    Spring中bean的生命周期?

    • 实例化bean对象(通过构造方法或者工厂方法)
    • 设置对象属性(依赖注入:1.setter注入2.构造方法注入3.注解注入)
    • 如果bean实现BeanNameAware接口,调用bean的setBeanName()方法传递bean的ID。
    • 如果bean实现BeanFactoryAware接口,调用setBeanFactory()方法传入工厂自身。
    • 将bean实例传递给bean的前置处理器的postProcessBeforeInitialization(Object bean,String beanname)方法
    • 调用bean的初始化方法
    • 将bean实例传递给bean的后置处理器的postProcessAfterInitializationn(Object bean,String beanname)方法
    • 使用bean
    • bean不在需要时,如果实现了DisposableBean这个接口,调用其实现的的destory()方法,没有就调用默认的destory()销毁方法

    当实体类中的属性名和表中的字段名不一样,怎么办?

    • 字段别名和实体类的属性名一致

    逐个定义:

    扫描包:

    扫描注解:

    @Alias("role3")
    public class Role {
    ......
    }

    • 通过来映射字段名和实体类属性名——对应的关系
    <select id="getOrder" parameterType="int"
    resultMap="orderresultmap">
    select * from orders where order_id=#{id}
    </select>
    <resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
    <!–用 id 属性来映射主键字段–>
    <id property=”id” column=”order_id”>
    <!–用 result 属性来映射非主键字段,property 为实体类属性名,column
    为数据表中的属性–>
    <result property = “orderno” column =”order_no”/>
    <result property=”price” column=”order_price” />
    </reslutMap>
    

    通常一个Xml映射文件,都会写一个Dao接口与之对应,请问这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载?

    Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数。

    Mapper接口中的方法,是不能重载的,因为是使用全限名+方法名的保存和寻找策略。

    Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement。在Mybatis中每一个标签,都会被解析为一个MapperStatement对象。

    Mybatis是如何进行分页的?分页插件的原理是什么?

    Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

    分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写,根据dialect方言,添加对应的物理分页语句和物理分页参数。

    Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

    1. 标签,逐一定义数据库列名和对象属性名之间的映射关系。
    2. 别名,将列的别名书写为对象属性名。有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

    Mybatis如何批量处理?

    item集合或数组里的元素(对象)

    collection集合类型(数组或集合)

    open以什么开始

    close以什么结束

    separator中间以什么相连

    1.批查询 select

    • 单参数 可以用 IN 也可以用多参数模式
     <!-- 查询日志的操作   -->
        <select id="selectJournalTime" resultType="cn.loan.vo.biz.JournalTimeVo" parameterType="java.util.List" >
          	   select
                DATE_FORMAT(acc.update_time,'%Y-%m-%d %H:%i:%S') as updateTime,
                DATE_FORMAT(acc.redemptionTime,'%Y-%m-%d %H:%i:%S') as redemptionTime,
                acc.auditSurfaceId as auditSurfaceId
                from auditJournalMinute acc
                where
                acc.auditSurfaceId in
    	 <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
                #{item}
            </foreach>	
        </select>
    12345678910111213
    
    • 多参数 用UNION ALL 注意括号不要漏
    	<!-- 查询日志的操作   -->
        <select id="selectJournalTime" resultType="cn.loan.vo.biz.JournalTimeVo" parameterType="java.util.List" >
            <foreach collection="list" item="item" index="index" separator="UNION ALL" >
                (select
                DATE_FORMAT(acc.update_time,'%Y-%m-%d %H:%i:%S') as updateTime,
                DATE_FORMAT(acc.redemptionTime,'%Y-%m-%d %H:%i:%S') as redemptionTime,
                acc.auditSurfaceId as auditSurfaceId
                from auditJournalMinute acc
                where
                acc.auditSurfaceId=#{item.id}
                and acc.`status`=#{item.status}
                order by acc.update_time asc
                limit 1)
            </foreach>
        </select>
    123456789101112131415
    

    2.批量插入 insert

    <insert id="insertAuditHistory" parameterType="java.util.List">
        insert into audit_history
        (backgroundUserId,
        show_time,
        commit_num,
        lend_num)
        values
        <foreach collection="list" item="item" separator=",">
            (#{item.backgrounduserid},#{item.showTime},#{item.commitNum},#{item.lendNum})
        </foreach>
    </insert>
    1234567891011
    

    3.批量删除 delete

    <delete id="deleteArtworkMaster" parameterType="java.util.List">
           delete from 
    		  artworkMasterPhotoAlbum
    		where 
    		  artworkMasterPhotoAlbumId IN  
    		    <foreach collection="list" item="item" index="index" open="("  close=")" separator="," >  
    		        #{item}  
    		    </foreach>  
        </delete>
    123456789
    

    4.批量更新

    <update id="updateBatch" parameterType="java.util.List">
            update role
            set  update_time=
            <foreach collection="list" item="item" index="index"
                     separator=" " open="case roleId" close="end">
                when #{item.id} then #{item.date}
            </foreach>
            where roleId in
            <foreach collection="list" index="index" item="item"
                     separator="," open="(" close=")">
                #{item.id}
            </foreach>
        </update>
    12345678910111213
    
    • 多字段多条件更新 需要给mysql配置批量执行,在spring.datasource.url后加上allowMultiQueries=true
      例如:spring.datasource.url=jdbc:mysql://127.0.0.1:3306/secondleaseback?allowMultiQueries=true
    <update id="updateBatch" parameterType="java.util.List">
    	 <foreach collection="list" item="item" index="index" separator=";" open="" close="">
                update role
                <set>
                    update_time=#{item.date},
                    create_time=#{item.date}
                </set>
                where roleId=#{item.id}
             </foreach>
     </update>
    12345678910
    

    注: insert 的时候 如果需要返回主键,在 <insert>标签中增加 useGeneratedKeys=“true” keyProperty=“实体主键id字段”

    如何获取自动生成的(主)键值?

    insert 的时候 如果需要返回主键,在 <insert>标签中增加 useGeneratedKeys=“true” keyProperty=“实体主键id字段”。

    <insert id=”insertname” usegeneratedkeys=”true” keyproperty=
    id”>
    insert into names (name) values (#{name})
    </insert>
    name name = new name();
    name.setname(“fred”);
    int rows = mapper.insertname(name);
    // 完成后,id 已经被设置到对象中
    system.out.println(“rows inserted = ” + rows);
    system.out.println(“generated key value = ” + name.getid());
    

    Mybatis动态sql有什么用?执行原理?有哪些动态sql?

    Mysql动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值完成逻辑判断并动态拼接sql的功能。

    Mybatis提供了9种动态sql标签:

    trim|where|set|foreach|if|choose|when|otherwise|bind

    XML映射文件中,除了常见的select|insert|update|delete标签之外,还有那些标签?

    Mybatis实现一对一(多)有几种方式?具体怎么操作的?

    有联合查询和嵌套查询。

    联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置association(collection)节点配置一对一(多)的类就可以完成。

    嵌套查询是先查一个表,根据这个表里面的结果的外键id,去查另外一个表里面的数据,也是通过association(collection)配置,但另外一个表的查询通过select属性配置。

    img

    Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

    Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加
    载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis
    配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。
    它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦
    截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是
    null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,
    然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()
    方法的调用。这就是延迟加载的基本原理。
    当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都
    是一样的。

    讲下Mybatis的缓存?

    Mybatis缓存分为一级缓存和二级缓存

    一级缓存放在session里面,默认;

    二级缓存放在它的命名空间里,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置

    Mybatis的一级、二级缓存

    • 一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。
    • 二级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Mapper(Namespace),并且可自定义存储源。

    什么是Mybatis接口绑定?有哪些实现方式?

    接口绑定,就是在Mybatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。

    接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select、@Update等注解,里面包含了sql语句来绑定;另外一种就是通过xml里面写sql绑定,在这种情况下,要指定xml映射文件里面的namespace必须为借口的全路径名。

    使用Mybatis的mapper接口调用时有哪些要求?

    • Mapper接口方法名和mapper.xml中定义的sql的id相同
    • Mapper接口方法名的输入参数类型和xml中定义的sql的parameterType的类型相同
    • Mapper接口方法名的输出参数类型和xml中定义的sql的resultType的类型相同
    • xml文件中的namespace即是mapper接口的类路径

    Mybatis三大插件

    • mybatis-generator:代码自动生成pojo、dao和xml文件
    • mybatis-plugin:能够追踪dao 接口和mapper文件里xml的一个插件
    • mybatis-pagehelper:分页插件

    简述Mybatis插件的运行原理,以及如何编写一个插件?

    Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这四种接口的插件,Mybatis使用JDK动态代理,为需要的接口生成代理对象以及实现接口方法拦截功能,每当执行这四种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截你指定需要拦截的方法。

    编写插件:实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的那些方法即可,需要在配置文件中配置你编写的插件。

    Spring Cloud

    Spring Cloud如何实现服务的注册和发现

    服务在发布时指定对应的服务名(服务包括了IP地址和端口)将服务注册到注册中心(eureka或者zookeeper)这一过程就是SpringCloud自动实现只需要在main方法中添加@EnableDiscoveryClient同一个服务修改端口就可以启动的多个实例

    调用方法:传递服务名称通过注册中心获取所有的可用实例通过负载均衡策略调用(ribbon和fegin)对应的服务

    Ribbon和Feign的区别(负载均衡)?

    Ribbon Feign
    依赖不同 spring-starter-ribbon spring-starter-feign
    启动类注解不同 @RibbonClient(value=“服务名称”) @EnableFeignClients(value=“服务名称”)
    服务的指定位置不同 @RibbonClient注解上声明 在定义抽象方法的接口中使用FeignClient声明
    调用方式不同 使用RestTemplate调用远程对应的方法,需要构建HTTP请求 采用接口的方式,将需要调用的其他服务定义的方法定义成抽象方法即可,不需要构建HTTP请求

    SpringCloud断路器的作用

    当一个服务调用另一个服务由于网络原因或者自身原因出现问题时,调用者就会等待被调用者的响应,当更多的服务请求这些资源时导致更多的请求等待,这样就会发生连锁反应(雪崩效应)断路器就是解决这一问题。

    断路器有完全打开状态,一定时间内达到一定的次数无法调用并且多次检测没有恢复的迹象断路器完全打开,那么下次请求就不会请求到该服务。

    半开状态,短时间内有恢复迹象,断路器会将部分请求发给该服务,当能正常调用时,断路器关闭。

    关闭状态,当服务一直处于正常状态,能正常调用,断路器关闭。

    Nacos

    应用需导入多个配置文件,设置如下键确定配置文件

    • 配置文件名+扩展名 spring.cloud.nacos.config.ext-config[0].data-id
    • 配置文件所在组别 spring.cloud.nacos.config.ext-config[0].group
    • 该配置文件是否热部署 spring.cloud.nacos.config.ext-config[0].refresh

    负载均衡

    Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。像nginx可以使用负载均衡分配流量,ribbon为客户端提供负载均衡,dubbo服务调用里的负载均衡等等。

    负载均衡作用

    • 当集群里的一台或者多态服务器down的时候,剩余没有down的服务器可以保证服务的继续使用
    • 使用了更多的机器保证了机器的良好使用,不会由于某一高峰时刻导致系统cpu急剧上升

    负载均衡的实现策略

    1. 随机(Random)
    2. 轮询(RoundRobin),默认
    3. 一致性哈希(ConsistentHash)
    4. 哈希(Hash)
    5. 加权(Weighted)

    HTTP
    请求报文格式:请求行+请求头+空行+请求数据

    • 请求行:请求方法+URL(包括参数信息)+版本协议
    • 请求头:是一个个的key-value值
    • 空行:表示header与请求数据的分隔
    • 请求数据:Get请求没办法携带数据,Post会携带一个body

    在这里插入图片描述
    请求响应报文:
    状态行,响应头,空行,响应体(数据)
    在这里插入图片描述
    状态行:HTTP版本号+状态码+状态值
    响应头:是一个个的key-value值
    空行:表示请求数据和header的分隔
    响应体:响应的data

    HTTP请求的一个完整过程

    • 浏览器根据域名解析IP地址(域名解析)
    • 浏览器与WEB服务器建立一个TCP连接(建立连接)
    • 浏览器给WEB服务器发送一个HTTP请求(发送请求)
    • 服务器端响应HTTP请求,浏览器得到HTML代码(响应请求)
    • 浏览器解析HTML代码,并请求HTML代码中的资源(访问资源)
    • 关闭TCP连接,浏览器对页面进行渲染呈现给用户(关闭连接)

    Zookeeper

    工作机制

    Zookeeper是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应(订阅模式)。

    Zookeeper=文件系统+通知机制

    特点

    1. 一个Leader,多个Follower组成的集群
    2. 集群中只要有半数以上的节点存货,Zookeeper能正常工作
    3. 全局数据一致:每一个server保存相同的数据副本,client无论连接那个server,数据都是一致的
    4. 更新请求顺序执行,来自同一个client的更新请求按其发送顺序依次执行
    5. 数据更新原子性,要么成功,要么失败
    6. 实时性,在一定时间范围内,client能读到最新数据

    应用场景

    • 统一的命名服务
    • 统一配置管理
    • 统一集群管理
    • 服务节点动态上下线
    • 软负载均衡

    选举机制

    半数选举

    监听原理

    1. 首先要有一个main()线程
    2. 在main线程中创建Zookeeper客户端,这是就会创建两个线程,一个复杂网络连接通信(connect),一个负责监听(listener)
    3. 通过connect线程将注册的监听事件发送给zookeeper
    4. 在zookeeper的注册监听器中将注册的监听事件添加到列表中。
    5. Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程
    6. listener线程内部调用了process()方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5JGYKFNh-1599185942409)(C:\Users\qq143\AppData\Roaming\Typora\typora-user-images\image-20200829143033864.png)]

    zookeeper和eureka的区别在哪?

    传统的关系型数据库是ACID(原子性,一致性,独立性,持久性)

    nosql数据库是CAP(强一致性,可用性,分区容错性),分布式系统只能3进2

    eureke遵守AP原则,zookeeper遵守CP原则

    CA-单点集群,瞒住一致性,可用性的系统,可扩展性不强大

    CP-满足一致性,分区容忍性的系统,性能不太高

    AP-满足可用性,分区容忍性的系统,通常可能对一致性要求低一些

    分布式系统中,分区容错性是必须遵守的

    展开全文
  • 但是第一周从周一投的直到周五才有面试机会,所以那几天比较郁闷,猜想是不是疫情原因,因为我知道疫情原因多多少少影响找工作的困难性,最后就收到了一个面试邀请,在2020年7月17号下午面试了元支点,当时我知道是...

    这一阵都没有更博客,忙着找工作呢,我找工作算上没时间去面,最后电话面试这种的总共6家,现已收到3家offer,但是面试过程中是发现这6家都还蛮中意我的,那在这里就谈谈我面试的情况把,也顺便把面试的技巧也写给大家,从面试到确定应该就用了两周的时间,但是第一周从周一投的直到周五才有面试机会,所以那几天比较郁闷,猜想是不是疫情原因,因为我知道疫情原因多多少少影响找工作的困难性,不过好在还比较幸运除了第一周只有一个面试机会,后一周面试机会就多起来了。

    1.元支点安全技术有限公司

    2020年7月17号下午面试了元支点,面试前了解知道是创业公司规模较小,所以打算初次找就当练练手,面试过程中主要围绕项目开讲,然后面试官云里雾里的捎带问了技术,因为我从容自信谈吐也大方,最后技术蛮相中,跟人事沟通又了解这是家做网络安全的部分,因为没做过加之聊了以后发现疫情还在扩大自己也觉得是有实力的,就跟人事谈了工资,人事使出浑身解数压价让我说最低的价格,然后我就降低了1k,临走时人事说会给我发offer但薪资她们会沟通,你来不来都行,然后当天晚上就发了offer,但是当天我没有看到,我心里想着应该不发或者周一才发offer的,周日百般聊赖打开了电脑邮箱发现了offer,激动的不行一看薪资还是多多少少失望的,又压低了2k,想着周一在谈谈能不能在涨点,不想在折腾,涨点就去了,周一谈了以后人事说让我再看看其他机会,她那边也在沟通可以的话会重新发offer,当天就比较期待一直在等导致没有好好投简历,也把面试约到后面了,怕这边收到offer,我就准备提离职,结果当天没有发,我就觉得可能凉凉,开始准备找下一个机会。

    然后在7月16和7月17号也接到了7月22号的面试邀请,从7月20号,投简历回复也好,邀请面试也好,就稍微多起来了。

    2.长能环境大数据

    周三面试,上午是长能环境大数据,真的不怎么样,面试我的人没有好好对待这次面试,公司也没有多少人,最后相中了由另一个人面问我的问题我觉得太简单,公司还没有用springboot,说我进去手敲jsp和后台代码,那我肯定是受不了,还嫌弃我要的高,最后就不了了之,在这里首先真的需要注意面试官的精神情况,因为公司什么样的情况面试官面部表情大概都会展现,包括面试官是否情绪高昂啊,是不是狠认真的对待面试者啊,等等,这家就是典型的那种,一进去问了问公司还有没上班的呢,面试官太年轻一副混日子的状态,这样的进去了对未来发展也好锻炼自己能力也好是万万不可的,而不是薪资的问题了。

    3.志行正科技

    周三下午去望京soho面志行正公司,首先大厦环境是电视上都市白领的感觉,公司环境可以规模也大,面试官问了一点点项目之后就一直聊技术,问进程线程区别,synchronized和volatile的区别,volatile能修饰方法么(想了想说了不能把,面试官说不能),数据库索引,死锁是什么,mysql用b+树之前用的什么结构存储的索引,innodb和myIsam的区别,堆和栈的区别,Redis的持久化,缓存穿透,缓存雪崩,springboot,springCloud的服务注册等等,基本都答上了也还不错,最后面试官叫我等一下,人事过来一顿审问(为什么说审问?语速非常快,不容思考那种,像是一种审问的感觉)学历等一系列的背景,然后就开始介绍公司以及自己的岗位,就说还要副总看下,在人事出去的时候我问了下薪资待遇,人事说这个是需要副总面完以后才能具体谈,我问了也就先告诉我吧!试用期6个月,公司不上一金,前三个月不上五险,后三个月上,当时就觉得有点不中意了,然后最后面是副总,因为他忙,我等了两个小时左右才面上,最后副总问了我基本情况以后让我等通知就让我走了,我觉得还是早问公司福利尤其五险一金试用期,怕的是先压低你工资再去谈又没有这些福利的时候吃亏,然后不知道情况工资也还压下去了,不是火更大么。

    4.西尹网络科技有限公司

    周四约满了,上午去面了西尹网络,我嫌弃太远了,心里就有一种不太想去面试的冲动,但是既然答应了就去看看,对这个公司没多大印象,就知道办公室比较挤,直接cto面试的,就大概问了我基本情况,稍微说了下项目,不过整个过程我比较主动说技术点和功能点,后面就问我住哪里,问我爱好,我说我比较爱唱歌和爱学习(哈哈,太装了),之前有把jvm还有一些Mysql之类的学习整理成文档,我有很多自己学习的技术文档,这个面试官表示欣赏,也觉得我有能力,问了我期望薪资,说后面的面试者比较多最迟周五给我信,就结束了,整体面试30分钟之内,我个人觉得基本没说什么所以觉得戏不大,接着赶去下家面试,出地铁以后啥吃的没有,就只有科技园,天还很热还很饿,简直绝望,但没办法没时间了还有一家面试电话,我就在路边坐下开始面试,记不得这家公司叫啥了,大概就是做传统项目的,我们聊了项目以后就问java基础,无非就是jdk8 lambda和Redis 持久化,缓存穿透和解决方法,springCloud的服务注册中心...,反正我答的还差不多,主动跟我介绍公司的情况以及做的项目,最迟周五会给我复试通知。

    5.慧点科技有限公司(外包)

    电话面试完就快3点了,下午4点要面慧点科技了,发现慧点科技在科技园内,环境好的没话说,打完简历就开始找公司(这时候饿了一天肚子了,园内没找到吃的)找到公司以后跟前台说面试,前台问是外包的面试么,我说不知道啊,前台说谁叫你来的,我就报了名字就把我领到对门办公室会议室里,我心里就犯嘀咕,难道我是外包的这种面试,面试官进来了简单的聊下项目,就问基础java,问了MySQL索引的数据结构,java8 lambda,Redis数据类型,数据库横转列的情况,问我快速排序的实现方式(我还附赠给了他好多排序),随后就问我选择排序和冒泡排序的区别?聊了半天面试官感觉差不多跟我主动聊公司情况,以及要做的事情,发现还是用老框架还想让做前端, 最后我问了下,boss约我来的是另一家公司,面试却是这里您知道什么情况么?面试官说嗯,你工作在这里工作,薪资什么的那边算,我就明白了是外包公司,心里就mmp了,有够损的了,约我面试的人没有跟我说过是外包,我有担心为啥公司不一样,我男朋友说是避税也会这样,朋友们还是小心这样的套路,正常招聘的外包都会直接说,但也有遇见不直说骗你去面试的,这个面试就是个例子,主要是你不想进外包公司你又是在职的话浪费面试机会。

     

    面试完外包以后出来就接到了西尹网络的电话,表示对我很满意问我什么时候入职,我只能承诺大概一周左右还要和领导商量,没一会儿,他们的cto加了我微信表示着急要我入职,希望我给一个准信,我问那薪资怎么算?他说你说多少就是多少,当时我激动的不行,竟然没有压工资,心里就定下这家了,我对自己的认知就是基本没干过互联网一直在传统行业待着,做政府项目比较多,薪资不算高也不算低的那种,但是如果找工作还是传统行业的话一定给不了这么高,心里还是蛮忐忑的,怕对自己挑战很大。当天晚上又收到了志行正的电话,技术总监打过电话又来了解我的情况,接着人事又打过来电话,说是让我过去干的话就是智慧园区的项目,因为我之前有过物联网的经验,然后给我说了薪资,我一看薪资压的太低了就拒绝了。

    6.总结面试经验

    1.介绍项目

    首先要对自己的项目很了解,从框架到项目你做的功能点,为什么这么做?都需要考虑,因为万一面试官会这样问你呢?你该怎么回答呢?只要是你负责的功能,你都要给面试官一个状态你很了解项目就像你是核心人物一样,落落大方非常有自信的去讲自己做过的东西,这样面试官会觉得你有能力,项目介绍这里你就加分很多甚至成功了一半。真的表达能力很重要,因为第一关就是介绍项目,所以这一关也着重对你的沟通表达能力的考察

    2.基础知识

    项目都是开头说么,所以最重要得就是梳理项目怎么说怎么给别人讲别人大概能听懂什么的,其次就是基础知识,最好平常都要有所积累,让别人觉得你不是背面试题,你知其然知其所以然,基础java掌握的牢靠,你用的技术框架多看看原理总结总结,然后多准备Redis的学习,分库分表,并发,线程,分布式这些有可能你使用不到,但是这些都应该有所了解,因为面试知道你做的传统的项目或者体量比较小的项目,但是他也想考察你平常有没有关心技术发展,多扩展知识面,有没有爱学习的的能力等等,还有就是工作年限久了,你不能只会增删改查把,为了不被淘汰高级知识也得学起来啊!

    3.扩展知识

    有的面试官还会问你除了java语言你还会些什么啊,假如你学习过python,不一定要会多少,你学过是可以说的,我学习过python的语法等,lua嵌入式也接触过等等,还有就是可能你做的项目中没加什么亮点,但是你在学习过程中有一些比较好的技术点你觉得是可以应用到技术中的就去实操一下,面试肯定能用上,我就在学习过程中有学到分布式锁,后来发现项目中是可以用的,就添加到项目中了,还有设计模式,觉得哪块能用上就实操,我就在给某个接口加权限的时候用到了动态代理,然后在面试的时候把这些你加的功能说出来,会增加不少分,也能给项目增色,这样就塑造了你平时爱动脑爱解决问题,爱专研技术的人。

    4.辅助性技巧

    项目说的好,基础也差不多基本就能找到差不多的工作,有一些可能会问你平常爱干什么,或者是爱好是什么,其实我在面试之前并没有准备什么和技术无关的东西,就是有一次面试和人事说话,人事沟通知道我平常学习会记录文档,而且还记录不少,他说这是优点需要说出来加分项,我才在后面的面试问我爱好我就说我平常爱学习,看技术视频总结了很多自己的技术文档,mysql、jvm、redis、数据结构等等的,说完了这些,基本面试官都会说很厉害,比较欣赏等,内心是对你学习能力的肯定,以及坚持力,自然而然就觉得你的技术能力强,加之你基础知识达上来差不多,项目讲解的不错,心里会留有你的位置或者说对你的印象是深刻的。

    第一次总结面试经历和经验可能总结的不太好,但是记录的目的就是希望大家一起进步,早日找到满意的工作!

    展开全文
  • 快手java开发面经

    千次阅读 2020-06-01 00:20:34
    快手是我春招拿到的第一个offer,base北京,java开发 快手一面 时间:2020/04/03 10:00 历时:60分钟 自我介绍 项目介绍 做题 求1到n的和(递归和遍历,等差数列公式O(1)) 二叉树中最深叶节点的节点和 get和...

    快手是我春招拿到的第一个offer,base北京,java开发
    在这里插入图片描述

    快手一面

    时间:2020/04/03 10:00

    历时:60分钟

    • 自我介绍
    • 项目介绍
    • 做题
      • 求1到n的和(递归和遍历,等差数列公式O(1))
      • 二叉树中最深叶节点的节点和
    • get和post的区别,post为什么是两次TCP连接,解释下幂等性
    • 口述下工厂模式,抽象工厂和简单工厂

    快手二面

    时间:2020/04/10 15:00

    历时:45分钟

    • 自我介绍
    • 项目介绍
      • 项目中负责的模块
      • 项目难点,亮点,怎么解决
      • 项目中订单模块
    • 说下堆和栈
    • 进程和线程的区别
    • 如何理解线程安全
    • 如何保证线程安全
    • Java中synchronized的原理,synchronized有什么不足,一定线程安全吗
    • volatile原理
    • 信号量和互斥锁的区别,作用,场景
    • 分布式锁,redis分布式锁原理,需要注意什么
    • redis挂了怎么办
    • 说下主从,说下持久化
    • 说下页式存储管理,虚拟内存
    • TCP三次握手说下
    • 如果TCP服务端一直没响应,客户端怎么处理
    • http和https区别
    • https原理
    • 做题
      • 删除链表倒数第n个节点
      • 股票问题
    • 闲聊

    HR面:

    • 一些常见的问题,没啥好写的,如实回答就好
    展开全文
  • 首先一个简单的自我介绍,然后就开始面试了,由于网络不好所以一开始是牛客网视频面试,最后微信语音,但是牛客网视频一直开着。 进程和线程的区别 进程:进程是程序的一次执行过程,是程序在执行过程中分配和管理...
  • 中移在线2020春季校招java开发面经

    千次阅读 2020-03-31 20:37:17
    刚参加完中国移动2020春季校招,由于今年特殊,招聘方式全部是线上,目前已完成笔试,技术面和人事面,等最后的结果,下面是本人面试过程中的一些经验,仅供参考。 1.先直接去中国移动官网投简历(填的信息一大堆,...
  • 电话,20min左右 1. 操作系统 进程和线程的区别 2. 数据库 高并发 数据库的锁 3. 算法和数据结构 ...5. java语言 java语法的一个东西 …内核接口, 记不太清了,当时我也没听过有这个 ...
  • 2020年春招阿里JAVA后端开发实习面经

    千次阅读 2020-04-19 14:54:51
    2020年2月23日内推了阿里某bu的Java开发岗位实习,历经三轮技术面,一轮笔试+测评,一轮HR面,终于,在2020年4月19日收到了实习offer!正经写一篇面经给有需要的小伙伴! 时间节点 2.23 内推简历 2.27 主管面 P8 ...
  • 1.hashMap和ArrayList的区别 2.二分查找 3.数据库的引擎对比 4.B+树 5.了解Spring吗?IOC,AOP 6.拦截器和AOP的区别 http://blog.sina.com.cn/s/blog_751848190102x6qr.html 7.mybatis中#和$的区别 ...
  • 1.数据结构:图的遍历方式,树,二分查找 2.排序:快速排序,选择排序,归并排序 3.数据库:范式(第二...6.C和Java的区别,Java应用广泛的原因 7.聊一聊Spring 8.关系型数据库和非关系型数据库的区别 9.计算...
  • 1. 项目 骨骼绑定插件 问了实现了什么 电商评论主题分析 介绍一下那个算法 数据是怎么来的 ...n, x1,x2, 和两个数比,比x1大就赋值给x1, 否则再和x2比,大于x2就赋值给x2, 最后得到的x2就是...开发还是在windows平台
  • 下面给大家分享的是2020年的一个浦发银行java面经,是电话面,具体内容包含了面试流程和面试题以及面试者回答。电话是突然打过来的。面试题:1、我看你是软件工程的,你具体做了什么项目?(没有细问)答:把大二到大四...
  • 2020新鲜Java,Android面经

    2020-05-14 20:30:22
    总结的2020Java面试经验,含后端开发和客户端开发岗位。加粗部分为常问知识点。 面经总结Java部分基础集合多线程JVM计算机网络操作系统算法Android部分 Java部分 基础 Eques方法和==的区别 常见的设计模式 静态...
  • 2020春季技术岗(Java开发/测开)面经分享阿里(Java开发)字节跳动(Java开发)腾讯(测开)快手(测开)海康威视(测开)百度京东&平安科技 本人参加面试时研一春季学期,因为疫情原因在家无所事事抱着试试水...
  • 1、基本情况 博主17届双非一本毕业, 主要是搞 Java开发 的, 没有大厂经验. 2020 自己也马上快3年工作经验了. 如果再不找找机会进大厂深造一下, 后面的竞争力和个人的提升将会更难.因此在现在公司磨砺了两年之后, ...
  • oppo Java开发(Android)一面面经 写在前面:面试官是在一个专门面试的房间里,房间里大约有五六名面试官在各自面试,环境极其嘈杂,很难听清面试官的问题,面试体验很差 问题 自我介绍 Android四大组件 安卓...
  • 下面给大家分享一个携程旅行java面经,包括了具体的面试流程和一些相关面试题,下面一起来了解一下携程旅行java面试吧!首先我是211本硕,平时主要用的是C/C++,然后,自学了半年左右的java,这个是一面。面试的时常...
  • 最近在博客网站上看见一些网友在分享,2020这一年的面经汇总,有前端、Java、大数据等等,我今天也来分享一篇Android 开发面经总结分享,该文的面经来源于本人和朋友,这一年中面试经典记录,文中公司有腾讯、网易...
  • 目录1. 自我介绍2. 职业规划3....原文链接:https://meloor.gitee.io/2020/11/16/%E6%AD%A6%E5%A4%A7%E5%90%89%E5%A5%A5java%E5%BC%80%E5%8F%91%E4%BA%8C%E9%9D%A2%E9%9D%A2%E7%BB%8F/ 二面是 HR 面 1
  • Java后台开发方向。非计算机专业硕士,专业涉及到一些开发。实验室项目主要是Java Web系统,挖掘小亮点。无实习经验。 闲话唠嗑 ​ 回顾这几个月,宛若梦一场。一开始心态不好,看到要学习的东西一大堆,沉不下心...
  • 已经十二月份了,虽然我的秋招已经结束好久了,但今天的博客突然间就想分享一下自己作为一个小白菜心酸的秋招历程,包含一些面过的公司面经整理,主要目的是为了记录自己,当然如果能对一些没有经历过面试的学弟学妹...
  • 10.java中你用到的容器有什么。 11.linux中查看cpu的指令。 12.进程之间的通信方式, 13.socket编程问题,客户端发十个包,服务端需要接收几次。 14.手撕算法topk问题。(优先队列) 15.1元,2元,5元,给定一个...

空空如也

空空如也

1 2 3 4 5 6
收藏数 120
精华内容 48
关键字:

java开发面经2020

java 订阅