首页 文章 精选 留言 我的

精选列表

搜索[面试],共4913篇文章
优秀的个人博客,低调大师

分享几道 Redis 高频面试题,面试不用愁

1、说说 Redis 都有哪些应用场景? 缓存:这应该是 Redis 主要的功能了,也是大型网站必备机制,合理地使用缓存不仅可以加 快数据的访问速度,而且能够有效地降低后端数据源的压力。 共享Session:对于一些依赖 session 功能的服务来说,如果需要从单机变成集群的话,可以选择 redis 来统一管理 session。 消息队列系统:消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务 解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功 能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功 能基本可以满足。比如在分布式爬虫系统中,使用 redis 来统一管理 url队列。 分布式锁:在分布式服务中。可以利用Redis的setnx功能来编写分布式的锁,虽然这个可能不是太常用。 当然还有诸如排行榜、点赞功能都可以使用 Redis 来实现,但是 Redis 也不是什么都可以做,比如数据量特别大时,不适合 Redis,我们知道 Redis 是基于内存的,虽然内存很便宜,但是如果你每天的数据量特别大,比如几亿条的用户行为日志数据,用 Redis 来存储的话,成本相当的高。 2、单线程的 Redis 为什么这么快? Redis 有多快?官方给出的答案是读写速度 10万/秒,如果说这是在单线程情况下跑出来的成绩,你会不会惊讶?为什么单线程的 Redis 速度这么快?原因有以下几点: 纯内存操作:Redis 是完全基于内存的,所以读写效率非常的高,当然 Redis 存在持久化操作,在持久化操作是都是 fork 子进程和利用 Linux 系统的页缓存技术来完成,并不会影响 Redis 的性能。 单线程操作:单线程并不是坏事,单线程可以避免了频繁的上下文切换,频繁的上下文切换也会影响性能的。 合理高效的数据结构 采用了非阻塞 I/O 多路复用机制:多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。 3、说说 Redis 的数据结构及使用场景 Redis 提供了 5种数据结构,每一种数据结构有各种的使用场景。 1、String 字符串 字符串类型是 Redis 最基础的数据结构,首先键都是字符串类型,而且 其他几种数据结构都是在字符串类型基础上构建的,我们常使用的 set key value 命令就是字符串。常用在缓存、计数、共享Session、限速等。 2、Hash 哈希 在Redis中,哈希类型是指键值本身又是一个键值对 结构,形如value={{field1,value1},...{fieldN,valueN}},添加命令:hset key field value。哈希可以用来存放用户信息,比如实现购物车 3、List 列表 列表(list)类型是用来存储多个有序的字符串。可以做简单的消息队列的功能。另外,可以利用 lrange 命令,做基于 Redis的分页功能,性能极佳,用户体验好。 4、Set 集合 集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过 索引下标获取元素。利用 Set 的交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。 5、Sorted Set 有序集合 Sorted Set 多了一个权重参数 Score,集合中的元素能够按 Score 进行排列。可以做排行榜应用,取 TOP N 操作 4、说一说 Redis 的数据过期淘汰策略 先给大家一个结论,Redis 中数据过期策略采用定期删除+惰性删除策略。 1、定期删除、惰性删除策略是什么? 定期删除策略:Redis 启用一个定时器定时监视所有的 key,判断key是否过期,过期的话就删除。这种策略可以保证过期的 key 最终都会被删除,但是也存在严重的缺点:每次都遍历内存中所有的数据,非常消耗 CPU 资源,并且当 key 已过期,但是定时器还处于未唤起状态,这段时间内 key 仍然可以用。 惰性删除策略:在获取 key 时,先判断 key 是否过期,如果过期则删除。这种方式存在一个缺点:如果这个 key 一直未被使用,那么它一直在内存中,其实它已经过期了,会浪费大量的空间。 2、定期删除+惰性删除策略是如何工作的? 这两种策略天然的互补,结合起来之后,定时删除策略就发生了一些改变,不在是每次扫描全部的 key 了,而是随机抽取一部分 key 进行检查,这样就降低了对 CPU 资源的损耗,惰性删除策略互补了为检查到的key,基本上满足了所有要求。但是有时候就是那么的巧,既没有被定时器抽取到,又没有被使用,这些数据又如何从内存中消失?没关系,还有内存淘汰机制,当内存不够用时,内存淘汰机制就会上场。Redis 内存淘汰机制有以下几种策略: noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。(Redis 默认策略) allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 Key。(推荐使用) allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 Key。 volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 Key。这种情况一般是把 Redis 既当缓存,又做持久化存储的时候才用。 volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 Key。 volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 Key 优先移除。 修改内存淘汰机制只需要在 redis.conf 配置文件中配置 maxmemory-policy 参数即可。 5、如何解决 Redis 缓存穿透和缓存雪崩问题 缓存雪崩: 由于缓存层承载着大量请求,有效地 保护了存储层,但是如果缓存层由于某些原因不能提供服务,比如 Redis 节点挂掉了,热点 key 全部失效了,在这些情况下,所有的请求都会直接请求到数据库,可能会造成数据库宕机的情况。 预防和解决缓存雪崩问题,可以从以下三个方面进行着手: 1、使用 Redis 高可用架构:使用 Redis 集群来保证 Redis 服务不会挂掉 2、缓存时间不一致: 给缓存的失效时间,加上一个随机值,避免集体失效 3、限流降级策略:有一定的备案,比如个性推荐服务不可用了,换成热点数据推荐服务 缓存穿透: 缓存穿透是指查询一个根本不存在的数据,这样的数据肯定不在缓存中,这会导致请求全部落到数据库上,有可能出现数据库宕机的情况。 预防和解决缓存穿透问题,可以考虑以下两种方法: 1、缓存空对象: 将空值缓存起来,但是这样就有一个问题,大量无效的空值将占用空间,非常浪费。 2、布隆过滤器拦截: 将所有可能的查询key 先映射到布隆过滤器中,查询时先判断key是否存在布隆过滤器中,存在才继续向下执行,如果不存在,则直接返回。布隆过滤器有一定的误判,所以需要你的业务允许一定的容错性。

优秀的个人博客,低调大师

Java 面试题 —— 老田的蚂蚁金服面试经历

电话一面 电话二面(85 分钟) 666. 彩蛋 电话一面 1、自我介绍、自己做的项目和技术领域 2、项目中的监控:那个监控指标常见的哪些? 3、微服务涉及到的技术以及需要注意的问题有哪些? 4、注册中心你了解了哪些? 5、consul 的可靠性你了解吗? 6、consul 的机制你有没有具体深入过?有没有和其他的注册中心对比过? 7、项目用 Spring 比较多,有没有了解 Spring 的原理?AOP 和 IOC 的原理 8、Spring Boot除了自动配置,相比传统的 Spring 有什么其他的区别? 9、Spring Cloud 有了解多少? 10、Spring Bean 的生命周期 11、HashMap 和 hashTable 区别? 12、Object 的 hashcode 方法重写了,equals 方法要不要改? 13、Hashmap 线程不安全的出现场景 14、线上服务 CPU 很高该怎么做?有哪些措施可以找到问题 15、JDK 中有哪几个线程池?顺带把线程池讲了个遍 16、SQL 优化的常见方法有哪些 17、SQL 索引的顺序,字段的顺序 18、查看 SQL 是不是使用了索引?(有什么工具) 19、TCP 和 UDP 的区别?TCP 数据传输过程中怎么做到可靠的? 20、说下你知道的排序算法吧 21、查找一个数组的中位数? 22、你有什么问题想问我的吗? 电话二面(85 分钟) 1、自我介绍、工作经历、技术栈 2、项目中你学到了什么技术?(把三项目具体描述了很久) 3、微服务划分的粒度 4、微服务的高可用怎么保证的? 5、常用的负载均衡,该怎么用,你能说下吗? 6、网关能够为后端服务带来哪些好处? 7、Spring Bean 的生命周期 8、xml 中配置的 init、destroy 方法怎么可以做到调用具体的方法? 9、反射的机制 10、Object 类中的方法 11、hashcode 和 equals 方法常用地方 12、对象比较是否相同 13、hashmap put 方法存放的时候怎么判断是否是重复的 14、Object toString 方法常用的地方,为什么要重写该方法 15、Set 和 List 区别? 16、ArrayList 和 LinkedList 区别 17、如果存取相同的数据,ArrayList 和 LinkedList 谁占用空间更大? 18、Set 存的顺序是有序的吗? 19、常见 Set 的实现有哪些? 20、TreeSet 对存入对数据有什么要求呢? 21、HashSet 的底层实现呢 22、TreeSet 底层源码有看过吗? 23、HashSet 是不是线程安全的?为什么不是线程安全的? 24、Java 中有哪些线程安全的 Map? 25、Concurrenthashmap 是怎么做到线程安全的? 26、HashTable 你了解过吗? 27、如何保证线程安全问题? 28、synchronized、lock 29、volatile 的原子性问题?为什么 i++ 这种不支持原子性?从计算机原理的设计来讲下不能保证原子性的原因 30、happens before 原理 31、cas 操作 32、lock 和 synchronized 的区别? 33、公平锁和非公平锁 34、Java 读写锁 35、读写锁设计主要解决什么问题? 36、你项目除了写 Java 代码,还有前端代码,那你知道前端有哪些框架吗? 37、MySQL 分页查询语句 38、MySQL 事务特性和隔离级别 39、不可重复读会出现在什么场景? 40、sql having 的使用场景 41、前端浏览器地址的一个 http 请求到后端整个流程是怎么样?能够说下吗? 42、http 默认端口,https 默认端口 43、DNS 你知道是干嘛的吗? 44、你们开发用的 ide 是啥?你能说下 idea 的常用几个快捷键吧? 45、代码版本管理你们用的是啥? 46、git rebase 和 merge 有什么区别? 47、你们公司加班多吗? 48、后面一起聊 high 了,之间扯了些蛋,哈哈哈 原文发布时间为:2018-10-30 本文作者:老田 本文来自云栖社区合作伙伴“互联网架构师”,了解相关信息可以关注“互联网架构师”。

优秀的个人博客,低调大师

Java面试集锦(一)

计算机网络 摘要:1. 在浏览器中输入url地址 显示主页的过程,整个过程会使用哪些协议 image.jpeg总体来说分为以下几个过程: DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器解析渲染页面 连接结束 在浏览器中输入网址之后执行会发生什么? DNS解析,找到对应ip地址 客户阅读全文 操作系统 摘要:1. 进程的常见状态?以及各种状态之间的转换条件? 就绪:进程已处于准备好运行的状态,即进程已分配到除CPU外的所有必要资源后,只要再获得CPU,便可立即执行。 执行:进程已经获得CPU,程序正在执行状态。 阻塞:正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态。阅读全文 Redis相关 摘要:1. 为啥在项目里要用缓存呢 用缓存,主要是俩用途,高性能和高并发 高性能image.png 高并发image.png 2.介绍 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key Value 数据库,并提供多种语言的 API的非阅读全文 Spring/Spring mvc 摘要:1. 介绍spring框架 Spring是一套为了解决企业应用开发的复杂性而创建的框架,特点是分层的架构,允许用户在不同层面使用不同的组件进行组合。同时通过IOC容器来降低耦合,简化开发。利用AOP来进行切面编程统一管理通用模块。 2.Spring中AOP的应用场景、Aop原理、好处? 主要是两种,阅读全文. RabbitMQ 摘要:RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。 ①.通过异步处理提高系统性能image.jpeg通过异步处理提高系统性能 如上图,在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢阅读全文 分布式 摘要:1. 分布式事物 不知道你是否遇到过这样的情况,去小卖铺买东西,付了钱,但是店主因为处理了一些其他事,居然忘记你付了钱,又叫你重新付。又或者在网上购物明明已经扣款,但是却告诉我没有发生交易。这一系列情况都是因为没有事务导致的。这说明了事务在生活中的一些重要性。有了事务,你去小卖铺买东西,那就是一手交阅读全文 Nginx 摘要:简单介绍一下Nginx Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 Nginx 主要提供反向代理、负载均衡、动静分离(静态资源服务)等服务。下面我简单地介绍一下这些名词。 反向代理 谈到反向代理,就不得不提一下正向代理。无论是正向代理,还是反向阅读全文 Spring Cloud 摘要:1. 什么是微服务 以前的模式是 所有的代码在同一个工程中 部署在同一个服务器中 同一个项目的不同模块不同功能互相抢占资源 微服务 将工程根据不同的业务规则拆分成微服务 微服务部署在不同的机器上 服务之间进行相互调用 Java微服务的框架有 dubbo(只能用来做微服务),spring cloud(阅读全文 Linux 摘要:1. 软链接: 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式 软链接可以跨文件系统 ,硬链接不可以 软链接可以对一个不存在的文件名进行链接 软链接可以对目录进行链接 2. 硬链接: 硬链接,以文件副本的形式存在。但不占用实际空间。 不允许给目录创建硬链接 硬链接只有在同一个文件阅读全文 SpringBoot 摘要:1.简介 Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。 1.1简化Spring开发的一个框架1.2整合Spring全家桶(整合ssh,ssm,安全,d阅读全文 秒杀系统设计 摘要:1.主要做到以下两点: 尽量将请求过滤在上游。 尽可能的利用缓存(大多数场景下都是查多于写)。 如果流量巨大,导致各个层的压力都很大可以适当的加机器横向扩容。如果加不了机器那就只有放弃流量直接返回失败。快速失败非常重要,至少可以保证系统的可用性。 业务分批执行:对于下单、付款等操作可以异步执行提高吞阅读全文 设计模式 摘要:1. 原则 1. 单一职责原则单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。解释: 如果一个类职责过多,就等于把这些职责耦合在一起; 软件设计正在要做的许多内容,就是发现职责并把那些职责分离; 如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个职责,就应该考虑类的职责分离阅读全文 数据库(Mysql) 摘要:1. 数据库范式 第一范式:列不可分,eg:【联系人】(姓名,性别,电话),一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF;第二范式:有主键,保证完全依赖。eg:订单明细表【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Qu阅读全文 Java Web 摘要:1.Ajax AJAX = Asynchronous JavaScript and XML(异步 JavaScript 和 XML)。 Ajax 的原理简单来说通过 XmlHttpRequest 对象来向服务器发异步请求,从服务器获得数据,然后用 Javascript 来操作 DOM 而更新页面。这阅读全文 JavaIO 摘要:1. 图解 image.pngimage.jpeg 2.BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法 属于处理流中的缓冲流,可以将读取的内容存在内存里面,有readLine()方法 3. 什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征 节阅读全文 JVM(Java虚拟机) 摘要:1. 垃圾回收机制 Stop the World: JVM由于要执行GC而停止了应用程序的执行称之为Stop the World,该情形会在任何一种GC算法中发生。当Stop the world发生时,除了GC所需的线程以外,所有线程都处于等待状态直到GC任务完成。事实上,GC优化很多时候就是指减少阅读全文 JAVA集合 摘要:1.集合 image.png1. List:有序、可重复。可以通过索引快速查找,但进行增删操作时后续的数据需要移动,所以增删速度慢。 2. Set:无序、不可重复。 3. Map:键值对、键唯一、值不唯一。Map 集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对 map 集合遍历时先得阅读全文 Java异常 摘要:什么是Java内存模型 前面介绍过了计算机内存模型,这是解决多线程场景下并发问题的一个重要规范。那么具体的实现是如何的呢,不同的编程语言,在实现上可能有所不同。 我们知道,Java程序是需要运行在Java虚拟机上面的,Java内存模型(Java Memory Model ,JMM)就是一种符合内存模阅读全文 Java多线程 摘要:1. 多线程 image.png 新建状态: 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序 start 这个线程。 运行状态:当一个新状态的线程被 start 以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务 就绪状态:当一个线程等待另外一个线程执行一个任务阅读全文

优秀的个人博客,低调大师

Java面试整理《下》

一、数据库部分 简单介绍下关系数据库三范式 范式指的是数据库设计时要遵循的三个规范,但并不是强制式的,这三个规范呈阶梯式的关系,现有第一层然后在第一层的基础上有第二层... 第一范式规定列数据不可分割,即实体中的某个属性不能有多个值或者重复的属性;第二范式要求每个行必须可以被唯一的区分,就是表中必须有主键存在的意思;第三范式规定表中不包含已在其他表中已包含的非主关键字信息,意思是除了外键之外不能存储其他表的数据信息。 反三范式:出于对效率和便利性的追求,可以违反三范式设置重复或可以推导出的字段,比如为了在查询订单的总价时可以不用去计算每个订单项中的单价和在订单表中设置订单总价字段。 可以简单介绍下什么是事务? 事务是并发控制的最小单位(需要满足ACID),用户定义的一个操作序列要么都执行成功,要么都执行失败,比如转账,A扣钱,B加钱,这两个操作必须是不可分割的,在commit之后也不能被干扰,将执行的代码try/catch并调用回滚rollback撤销当前事务操作。 mysql数据库的默认的最大连接数? mysql数据的默认连接数大小是100,数据库在安装时都会设置一个最大连接数,这是因为一般服务器都只能支持一定数目同时连接。 说一下msyql的分页?oracle的分页? oracle的分页是采用了三层嵌套查询,没有用过不赘言。 mysql是使用关键字limit来进行分页查询的 String sql ="select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize; 存储过程是什么?它有什么优缺点? 存储过程本质上是sql语句的集合,这些集合像一个方法一样实现某一特定的功能,通过设置名称的方式提供调用。 由于是预编译的代码块,所以执行效率会比较高;由于很多SQL一起执行,所以节省网络带宽;存储过程提供安全机制,可以对于没有权限执行存储过程的用户进行控制; 缺点则是调试和更改时比较麻烦,而且也没办法做缓存和做数据库集群。因此对于存储过程的使用要慎重,对于提高SQL查询的性能而言,ORM框架做的会比存储过程好。 SQL语言本质是一种结构化查询语言,复杂的业务逻辑还是应该通过代码去实现。 有没有做过数据库优化方面的事情? 主要是使用索引、分表和缓存来做数据库优化,当有多个数据库服务器时,还可以采用读写分离的方式做数据库集群。 数据库优化之创建合适的索引 普通索引:允许重复的值出现 唯一索引:除了不能重复记录之外,其它的和普通索引一样,例如用户名,身份证,email,tel 主键索引:将表中某列设置为主键的时候数据库引擎会自动将该列设置为主键索引,这个主键索引唯一并且没有不能为null 全文索引:主要针对表中的文本域进行索引,比如char,varchar,text等字段 索引的弊端一是占用磁盘空间,二是对DML(增删改)操作会降低效率。 索引配合where条件,一般在字段内容不是频繁变化的时候使用,并且该字段的内容不是唯一的几个值,例如性别这个字段只有男女或未知 索引使用的技巧:对于like查询,如果模糊信息为'%aaa'的话就不会使用索引,因此在like查询中,关键字的最前面最好不要使用'%'或者'_'这样的字符,如果前面的值一定要有变化,则考虑使用全文索引(sphinx);如果条件查询中带有'or'关键字就不会使用索引,所以要避免使用'or'关键字;如果列是字符串类型,无论是不是字符串数字都要使用''包括起来,否则当值是数值类型的话会自动转换,如果不是数值类型则会报错;当表中只有一条数据时,全表扫描要比索引快,所以为了"效率"的查询数据,应该使用全表扫描的方式,233... 数据库优化之分表 当数据库单个表中数据越来越大(百万级别)的时候会导致数据查询缓慢,又因为数据库是多用户共享资源,并发存取同一数据的时候时需要添加锁机制来控制用户操作,所以会出现数据库性能瓶颈。这个时候就需要对数据库进行分表,就是把数据量大的表分成多个数据表,比如商品SPU和SKU表的商品描述信息进行表抽取和对单个数据比如价格,0-100和100-200在不同表中或通过自增长ID切割,这是水平分表。比如在电商项目中类似商品的分类、创建时间、品牌和规格等信息具有变化频率慢,查询次数多,而且有很好的实时性的数据,把这样的数据称之为冷数据;类似商品评论,广告,销量和价格排序这些变化频率慢的数据称之为热数据。将这些数据通过更改存储引擎,使用memcache、redis和从库配置等进行不同的处理。 数据库优化之读写分离 一台数据库服务器所支持的最大并发连接数是有限的,如果用户并发访问太多就需要考虑搭建集群,读写分离就是mysql处理集群的相关技术。使用负载均衡来实现写操作往主数据库库中去,读操作往从数据库中去。数据库最终都会把数据库持久化到磁盘,因此集群必须保证每个数据库服务器中数据是一致的,这就是主从同步技术。 数据库优化之缓存 每次读取数据都需要操作数据库,这对数据库很不友好,所以需要在持久层DAO和数据库DB中添加一个缓存层,这个缓存层一般都使用内存实现,如果访问的数据能够从缓存服务器中读取,那么就不会访问数据库。在Java中的缓存有ORM框架的二级缓存,需要注意的是Hibernate的二级缓存不能完成分布式缓存,还有可以使用memcache或者redis来对缓存的数据进行集中处理。 二、前端部分 简单说一下html,css,javascript在网页开发中的定位? HTML 超文本标记语言 定义网页的结构 CSS 层叠样式表,用来美化页面 JavaScript主要用来验证表单,做动态交互(其中ajax) 简单介绍一下Ajax? 如果不使用ajax,拿直播页面来说,你点击直播间的刷新按钮,那么包括弹幕在内的整个网页都会刷新。所以ajax不只是一门技术,只要是通过js调用异步通讯组件并使用格式化数据来更新页面上的内容就可以说是ajax,它实现了页面中局部位置的定点刷新。 ajax全称AsynchronousJavascript+XML(异步传输+js+xml),所谓异步就是在向服务器发送请求的时候不需要等待结果就可以做其他事,这就代表你可以在一个页面上同时看直播视频界面和弹幕。现在一般使用json来代替xml,好处是json更加简洁,解析速度也更快。 ajax原理是通过创建XmlHttpRequest对象,XmlHttpRequest是js提供的一个为客户端提供客户端与服务器之间传输数据的API对象。通过这个API对象调用onreadystatechange事件,该事件用于获取客户端浏览器向服务器发送数据的状态(200,404等),得到状态之后就会调用编写的回调函数。在这个过程中,其他代码还是在不断接收数据解析数据的,只是不会阻塞js代码。 var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { //存储函数 当readyState属性发生改变时就会调用 Fuck(xhr.readyState);//readyState属性 0=请求未初始化,1=服务器连接已建立,2=请求已连接,3=请求处理中,4=请求已完成,且响应就绪 Fuck(xhr.status);//status属性 200=ok,404=访问资源未找到,401=没有访问权限,402=预留的状态码,403=禁止访问,500=服务器内部错误等等 } 缺点:ajax破坏了浏览器的back和history机制;违反了URL资源定位设计的初衷;对搜索引擎(SEO)有影响;不能很好的支持移动设备;破坏了程序的异常处理机制;由于现在的程序将大量原先在后端的代码放到了js文件中会导致客户端程序复杂并存在安全隐患。 使用场景:登录失败时不跳转页面,注册时提示用户名是否存在,二级联动。 js和jQuery的关系? JQ是一个封装了js属性和方法的框架,可以让开发者使用便利的同时也增强了js的功能,如果是使用原生js的话就需要处理很多兼容性问题和事件绑定,dom操作,ajax,注册事件等。JQ常用的选择器有ID选择器,class选择器,标签选择器等。 jQuery的页面加载完毕事件? 在js中想要获取元素必须要先加载元素,可以将获取元素的js代码放到元素标签后,但是这样会造成管理上的不便,所以一般等页面全部加载之后在获取元素。一般使用$(funcation(){});//当页面加载完毕之后会执行花括号中的函数,这是相对简单的方式,因此使用也是最多的。 需要注意的是JQ中的页面加载是指页面结构被加载完毕,而window.onload表示的是页面被加载完毕。 <img src=”htttp://baidu.com/1.jpg”/> onload必须等页面中的图片、声音、图像等远程资源被加载完毕后才调用,而jQuery中只需要页面结构被加载完毕。 简单说一下html5和css3?你对现在的那些新技术有了解? html5是最新版本的html,在html4的基础上增强了一些标签,比如画板,声音,视频,web存储这些功能。但是html5过于强调语义,比如使用header标签表示头部,footer表示底部。以前在开发都是采用div标签定义模块。 css3在css2的基础上做了增强,实现了一些原来在css2中实现起来比较困难,或者不能实现的功能,比如盒子和文字阴影,渐变,动画等。css3的缺点在于需要根据不同的浏览器处理兼容性,其实html5也有兼容性问题,比如html5播放器panda.tv就出于兼容性的考虑没有使用html5播放器。 三、框架部分 什么是框架? it语境中的框架是指为了解决某一开放性问题而设计的具有一定约束性的支撑结构,在这种结构上可以根据具体问题进行扩展,从而便捷的构建完整的解决问题的方案。 框架不能完全解决实际上遇到的问题,但可以快速的解决普遍问题。 框架是为了扩展而设计的 一般框架会提供很多辅助性的实用工具,比如java的一系列jar包就是对jdk功能的扩展。 简单讲一下SpringMVC的执行流程? SpringMVC本质上是一个前端控制器(DispatcherServlet),通过对处理器映射器,处理器适配器和视图解析器的调度来实现接收请求和响应数据。 说一下struts2和springMVC有什么不同? MVC的核心是Servlet,Strtus2的核心是Filter;MVC一般使用注解开发,Strtus2一般使用xml配置;MVC处理ajax请求,直接返回数据,在方法中通过注解@RequestBody,MVC就会自动将对象转换成json数据;而strtus2是通过插件转换的。 说一下Spring中的两大核心? IoC(Inversion of Control)或者称之为DI(Dependency Injection)是指程序将DAO的创建权交付Spring管理,通过配置文件和反射再加上Map来实现自动创建Bean。 AOP(Aspect Oriented Programming)被称之为面向切面编程,使用动态代理的方式在执行方法前后或应用程序出现异常时加入相关逻辑。比如对于事务和日志的处理。 什么是ORM? 对象关系映射简称ORM(Object Relational Mapping),通过对数据和对象之间映射元数据的方式,将程序中的对象自动持久化到关系数据库。 iBatis(mybatis)与Hibernate有什么不同? mybatis的好处在于将sql语句与java代码分离并提供将结果集自动封装为实体对象和对象集合的功能,还提供了自动将实体对象的属性传递给sql语句的参数这样的功能。 hibernate的好处在于可以自动生成sql语句并执行同时返回java结果。 两者最大的不同在于mybatis是面向sql的所以需要在xml配置文件中写sql,而hibernate是自动生成sql,需要考虑对象之间复杂的映射关系。因为这个特性所以hibernate无法完成特别复杂的查询。 四、其他部分 有没有用过linux?你都用它来做什么?linux的特点是长时间运行比较稳定,所以一般会用做服务器。linux提供C语言编译环境,所以需要C语言支持的redis和nginx等可以通过在C语言编译环境中获取软件包并运行。 说一下linux下面的一下常用命令? 查看文件 tail -f 删除文件 rm -rf 编辑文件 vi 创建文件夹 mkdir 删除文件夹 rm -f 获取当前路径 pwd 跳转目录 cd 切换用户 su -root 列举目录 ls 你是使用什么来连接远程的Linux服务器的? 需要依赖于Linux服务器安装ssh服务端,一般这个ssh服务的端口22. 需要依赖于Linux服务器安装sftp服务端,一般这个sftp服务的端口25. 使用xshell、putty等ssh客户端来连接服务器,使用xftp、winscp等sftp客户端来上传和现在文件。连接和上传、下载必须依赖于服务器的ssh、sftp服务,也就是linux服务器需要启动这两个服务。 没有使用过云主机?客户有租用过阿里的云主机,云主机就是一些云服务运营商比如阿里,腾讯,华为等提供远程的服务器功能,开发者只需要按需付费即可租用。使用ssh和sftp操作 有没有使用过redis? redis是什么redis是一个key-value的nosql的数据库,redis会先将数据存储到内存中,然后根据一定的策略持久化到磁盘,已达到断电也不会丢失数据。主要用来做缓存数据库的数据和做web集群的时候当做中央缓存存放session。 redis的数据淘汰机制在 redis 中,允许用户设置最大使用内存大小 server.maxmemory,在内存限定的情况下是很有用的。譬如,在一台 8G 机子上部署了 4 个 redis 服务点,每一个服务点分配 1.5G 的内存大小,减少内存紧张的情况,由此获取更为稳健的服务。 内存大小有限,需要保存有效的数据?redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。 redis 提供 6种数据淘汰策略: volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰 no-enviction(驱逐):禁止驱逐数据 微信开发原理微信公众平台开发者,通过接入认证的方式,让我们的服务器能处理来自微信服务器转发的微信用户的请求,处理完成后返回给微信服务器,有微信服务器对用户响应。 怎么把微信和业务平台绑定?用户注册实体中包含一个微信号的字段,进行绑定操作的时候就是修改这个微信号的字段,我们需要通过微信网页授权的方式获取微信号。 当用户同意授权的时候我们可以得到一个code,通过这个code换取网页授权的微信号,就是openid,最后将openid存入到微信号字段中即可

优秀的个人博客,低调大师

Java面试整理《上》

一、Java基础部分 简单介绍下Java的跨平台原理不同的操作系统的操作指令集不同,所以做程序开发的时候需要根据不同的操作系统开发程序。比如想要程序支持MacOS、Windows和Linux就要开发三套不同的程序代码。这会导致开发成本成倍提升,所以很多程序都只开发了windows版本。这是相对于桌面程序来说的,如果是WEB应用程序就没有这个烦恼,这也是WEB开发这么流行的原因。Sun公司开发了适用于不同操作系统及位数的JVM虚拟机来屏蔽系统之间的差异并提供了统一的接口,对于Java程序而言,只需要遵循Java语言规范,就可以在所有的操作系统上运行程序。 Java中int数据占用几个字节?int数据占用4个字节,这在哪个位数操作系统上都是一样的,主要是为了跟CPU的字长一致,目的当然是提高处理速度。 Java面向对象有哪些特征?主要有四个特征:抽象,封装,继承和多态。 抽象的目的是忽略与主题无关的其他信息,使用abstract关键字修饰,规定抽象方法只能为public/protected,被修饰的类不能被实例化,只允许通过继承的方式来实现。 封装的意思就是想让你看到就让你看到不想让你看到就不让你看到,使用private关键字实现,当你需要对属性进行修改的时候就使用类中的get/set方法,使用public关键字。这是出于安全和易用性方面的考虑。 继承的意义在于不需要重复造轮子,子类继承父类就可以得到除了private之外的父类的全部属性和方法(父类的构造方法除外)。需要知道的是Java只支持单继承,这是出于对继承链可能会出现过于复杂的情况的设计方案,如果想实现类似C++语言的多继承,可以使用接口来实现。还需要注意这几点,如果没有指定父类,那么类的直接父类是java.lang.Object;一般继承会导致重写,子类有时候会需要重写父类的方法,在重写时必须保证方法名和形参列表相同,返回值类型和异常类型子类需要小于父类;访问权限,子类需要大于父类。 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用只有在程序运行期间才会确定,在Java中通过继承的方式来实现多态,即父类接口引用变量指向子类或实现类的实例对象,这样程序调用的方法在运行期才会动态绑定引用变量所指向的具体实例对象的方法,也就是内存里正在运行的对象方法。。比如公司规定十点上班工作,但并不会对程序员说你要敲代码,并不会对HR说你要检查邮件这个工作的具体实现。需要注意的是多态是方法的多态而不是属性的多态,多态是在继承的基础上实现的。 接口和抽象的区别是什么?两者都是Java面向对象的重要实现。它们都声明方法而不去实现,本质的区别在于抽象类是一个类,而接口是其他的类型,在OC中都没有接口这一说,而是使用protocol。抽象类除了不能实例化之外跟普通的类没有区别,而接口完全不存在方法的实现,不能有构造器,只能使用public访问修饰符,没有main方法等。接口提供抽象方法,类通过interface关键字对接接口,重写抽象方法实现对应业务逻辑以此对外提供服务。比如Map接扣作为一个容器就会提供put方法来往容器中填充值,get方法获取容器中某一个值,size属性获取容器大小,remove方法来删除容器中的值。接口除了做规范之外还是多继承在Java中的解决方案,另外接口也是各种框架和API的实现,比如RedisTemplate就是封装了jedis,如果在项目中使用redis,直接通过注入RedisTemplate接口就可以完成对redis的操作。 已经有基本类型了,为什么还需要包装类型呢?Java提供了八种基本类型,每一种类型都会有一个对应的包装类型,比如boolean-Boolean,JVM会在两者之间自动转换,这是JDK1.5做的改变。 Integer i = 1; //自动装箱,编译时会调用Integer.valueOf(1) int j = i; //自动拆箱,编译时调用intValue(); 值得注意的是自动装箱时系统会创建缓存,并将当前数据添加到缓存中,有两个作用,第一是为了缓解使用包装类型导致数据存储会略微变慢的问题,第二是解决了包装类型判断是否相等的问题。 Java是一门面向对象的语言,基本数据类型并不具备面向对象的特征,这会导致数据存储的问题,例如在处理空值的时候,使用Integer时需要判断null,使用int的时候需要判断0,而在数据库中通常默认值为0。这会导致在数据库中存储id的时候,id类型为bigint,当控制类方法的接收值为long而不是Long的话会报错。使用Long表示类的ID的时候,在需要判断类是否存在只需要判断为null就可以了,而且使用包装类型就可以通过其提供的方法MAX和MIN获取最大值和最小值等。 说一下"=="和equals方法究竟有什么区别?==用于判断两个变量是否相等。变量可以分为基本数据类型和引用数据类型,如果是引用数据类型需要比较引用的内存首地址,如果是基本数据类型直接比较值。 equals方法是判断两个对象的某些特征是否一致,通过重写对象的equals方法。 如何理解?通过观察源码会发现,equals方法会首先判断两个比较值类型是否一致,然后再比较数值或字符,例如Integer类型会自动拆箱为int类型进行比较,String会将字符串拆分成字符。 讲一下String和StringBuilder的区别(final)?StringBuffer和StringBuilder的区别?java提供了三个类String、StringBuilder和StringBuffer来表示和操作字符串。字符串即是由多个字符(char)的集合。 String是内容不可变的字符串(private final char value[]) StringBuilder和StringBuffer继承自AbstractStringBuilder类(char[] value); 因此拼接字符串的时候: String:String s = "a"+"b"; StringBuilder sb = new StringBuilder(); sb.apend("a").apend("c") 拼接字符串的时候不能使用String进行拼接,要使用StringBuilder和StringBuffer。前者效率高但线程不安全,后者效率低但线程安全。 简单说一下java中的集合 java中的集合主要分为value和key-value两种。 存储值分类list和set,list重复有序,set不可重复无序。并且set根据equals和hashcode判断,如果对象存储在set中,则必须重写这两个方法。 存储键值在java中是称之为map,在OC语言中叫字典。 List常用的ArrayList和LinkedList的区别和使用场景? ArrayList底层使用数组(private transient Object[] elementData;) LinkedList底层使用链表(transient Node<E> first; transient Node<E> last;) 数组是一块连续的内存,因此插入和删除的时候需要移动内存。由于有这个特点所以说数组查询元素快,插入和删除删除慢。 链表的原理是在当前元素中存放上一个和下一个元素的地址,查询时从头部开始一个个找,因此查询效率慢,由于做修改的时候不需要做内存移动操作,只需要改变引用指向即可完成,所以插入和删除操作效率高。 不难看出链表和数组是相反的,所以它们的使用场景就呼之欲出了,而由于数据库操作的特殊性(查询占90),所以一般我们会选择ArrayList做数据保存的容器。 讲一下HashMap和 HashTable的区别?HashTable和ConcurrentHashMap的区别? 首先HashTable是不可以使用null作为key或者value的,HashTable在存储数据的时候会返回synchronized。因此可以得出结论HashTable安全但效率不高。 如果想既效率高又安全,可以使用ConcurrentHashMap并发容器的方式,原理是将整个Map分成N个Segment(类似HashTable不加锁),提供相同的线程安全,但是效率提升N倍默认为16倍。 实现一个拷贝文件的工具类使用字节流还是字符流? 字节流和字符流都可以实现对文件的拷贝,如果确认不包含例如图片和音频这样特殊的文件,使用字符流即可,否则应该使用字节流。 线程的几种实现方式,启动方式? 两种实现方式:继承Thread类和实现Runnable接口。一般采用实现接口的方式,因为java只支持单继承。 Thread thread = new Thread(new MyThread());//MyThread类继承了Thread对象或Runnable接口 thread.setName("xiaoming");//通过设置线程名称来区分线程 thread.start();//通过start()方法来启动线程,但实际执行的方法是run方法。run()方法是Thread类和Runnable接口自带的方法,需要重写和实现run()。 线程池的作用 线程过多的话会导致系统运行缓慢甚至崩溃,所以需要限制线程的个数 线程池如果每次都创建或者销毁会导致资源的浪费 什么是设计模式?常用的设计模式有哪些? 设计模式是前人经验所得的可以反复使用,解决特定问题的设计方法。 单例模式是最常见的设计模式之一,它的作用是保证某一实例的唯一性。具体实现就是在类中定义一个实例对象并提供一个公开方法获取该实例,然后将构造器私有化,如果需要使用该实例的话,只能通过提供的公开方法而不能new出这个类,这样每次得到的实例就是同一个实例。单例分为懒加载和立即加载两种模式,懒加载在创建对象的时候就加载实例,立即加载在需要的时候才加载实例。 工厂模式,SpringIoC中的BeanFactory,MyBatis中的SqlSessionFactory就都是工厂模式的实现 代理模式,SpringAOP是通过动态代理实现 观察者模式,Spring中的listener实现ApplicationListener 模板模式,Spring集成了JdbcTemplate、RedisTemplate、SolrTemplate、JmsTemplate 适配器模式,SpringMVC中的处理器映射器HandlerMapper 二、J2EE部分 说一下你对servlet的理解?或者servlet是什么?Java Servlet是使用J2EE服务端程序,后端代码通过实现Servlet接口并重写HTttpServlet的doGet/doPost方法来进行对数据库和浏览器之间的交流,Servlet程序需要运行在支持Java程序的应用服务器中,比如tomcat,jetty等。 简单说一下servlet的生命周期?Servlet是一个接口规范,所以有比较明确的生存期定义,接口中的init,service和destory方法进行表述。 Servlet API中forward()与redirect()的区别?forward就是转发,是服务端行为因此只发送一次请求也不会改变url地址,redirect是重定向,是客户端行为会改变url地址并且发送两次请求 JSP和Servlet有哪些相同点和不同点?JSP是Servlet的扩展,所有的jsp文件都会被编译成一个继承自HttpServlet的类,因为servlet输出html比较麻烦,所以设计出jsp。 JSP有哪些内置对象?作用分别是什么? 九个内置的对象: request 用户端请求,此请求会包含来自GET/POST请求的参数 response 网页传回用户端的回应 pageContext 网页的属性是在这里管理 session 与请求有关的会话期 application servlet正在执行的内容 out 用来传送回应的输出 config servlet的构架部件 page JSP网页本身 exception 针对错误网页,未捕捉的例外 四大作用域: pageContext 整个page页面 request(HttpServletRequest) service方法 session(HttpSession) 第一次调用request.getSession()方法时 application(ServletContext) 整个WEB应用程序 说一下Session和Cookie的区别?你在项目中都有哪些地方使用了?session和cookie都是HTTP的会话跟踪技术,是为了解决HTTP无状态的特性而设计的技术。cookie在客户端浏览器记录信息认证身份,session在服务端记录信息确认身份。session通过在cookie中存放的sessionId来保证信息的一致性。 session和cookie的区别如下 由于cookie数据保存在浏览器中,因此有安全和数据限制的问题,考虑到这种情况应该使用session保存数据 session数据存在服务器上,当访问比较多的情况下会耗费服务器资源,考虑到这种情况应该使用cookie购物车是最好的cookie技术实现场景,用户登录信息的存储是最好的session技术实现场景。 我在做用户注册生成短信验证码和solr异步删除索引库数据,静态页面生成的时候使用过jmsTemplate.send()方法,该方法中有一个内部类(new MessageCreator()),此类中接收session参数,然后通过这个session创建消息实例设置消息并返回。 HTTP中GET和POST请求的区别用户通过不同的请求方式完成对资源的不同操作,比如PUT请求就是代表对请求资源的增加,DELETE请求就是对请求资源的删除。为了方便开发,一般我们只使用GET和POST方式就可以了。两者本质上都是TCP链接,区别在于: get请求时,地址栏会显示请求信息,以?开头,多个参数以&连接,而post请求在request body中 get请求由于浏览器对地址长度的限制而导致传输的数据有限,post则没有这个限制 由于请求信息会暴露所以get请求会有安全隐患 get产生一个TCP数据包,浏览器会将http header和data数据一起发送,等待服务器响应200并返回数据;post请求产生两个数据包,浏览器会发送header,等待服务器响应100 continue,浏览器才会发送data,最后等待服务器响应200和请求的数据 对于get和post的区别,有一个比较有趣的比喻。get传递数据如同写在脸上,post传递数据如同方法肚子里,脸上自然不能放太多东西也不能放隐私的东西,而肚子里就无所谓了。

优秀的个人博客,低调大师

spring面试

Spring Framework 现在几乎已成为 Java Web 开发的标配框架。那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢?不妨用本文的问题来检测一下。 1、一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? VersionFeatureSpring 2.5发布于 2007 年。这是第一个支持注解的版本。Spring 3.0发布于 2009 年。它完全利用了 Java5 中的改进,并为 JEE6 提供了支持。Spring 4.0发布于 2013 年。这是第一个完全支持 JAVA8 的版本。 1.2. 什么是 Spring Framework? Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度。 它是轻量级、松散耦合的。 它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架。 它可以集成其他框架,如 Structs、Hibernate、EJB 等,所以又称为框架的框架。 1.3. 列举 Spring Framework 的优点。 由于 Spring Frameworks 的分层架构,用户可以自由选择自己需要的组件。 Spring Framework 支持 POJO(Plain Old Java Object) 编程,从而具备持续集成和可测试性。 由于依赖注入和控制反转,JDBC 得以简化。 它是开源免费的。 1.4. Spring Framework 有哪些不同的功能? 轻量级- Spring 在代码量和透明度方面都很轻便。 IOC- 控制反转 AOP- 面向切面编程可以将应用业务逻辑和系统服务分离,以实现高内聚。 容器- Spring 负责创建和管理对象(Bean)的生命周期和配置。 MVC- 对 web 应用提供了高度可配置性,其他框架的集成也十分方便。 事务管理- 提供了用于事务管理的通用抽象层。Spring 的事务支持也可用于容器较少的环境。 JDBC 异常- Spring 的 JDBC 抽象层提供了一个异常层次结构,简化了错误处理策略。 1.5. Spring Framework 中有多少个模块,它们分别是什么? Spring 核心容器– 该层基本上是 Spring Framework 的核心。它包含以下模块: Spring Core Spring Bean SpEL (Spring Expression Language) Spring Context 数据访问/集成– 该层提供与数据库交互的支持。它包含以下模块: JDBC (Java DataBase Connectivity) ORM (Object Relational Mapping) OXM (Object XML Mappers) JMS (Java Messaging Service) Transaction Web– 该层提供了创建 Web 应用程序的支持。它包含以下模块: Web Web – Servlet Web – Socket Web – Portlet AOP– 该层支持面向切面编程 Instrumentation– 该层为类检测和类加载器实现提供支持。 Test– 该层为使用 JUnit 和 TestNG 进行测试提供支持。 几个杂项模块: Messaging – 该模块为 STOMP 提供支持。它还支持注解编程模型,该模型用于从 WebSocket 客户端路由和处理 STOMP 消息。 Aspects – 该模块为与 AspectJ 的集成提供支持。 1.6. 什么是 Spring 配置文件? Spring 配置文件是 XML 文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。但是,XML 配置文件冗长且更加干净。如果没有正确规划和编写,那么在大项目中管理变得非常困难。 1.7. Spring 应用程序有哪些不同组件? Spring 应用一般有以下组件: 接口- 定义功能。 Bean 类- 它包含属性,setter 和 getter 方法,函数等。 Spring 面向切面编程(AOP)- 提供面向切面编程的功能。 Bean 配置文件- 包含类的信息以及如何配置它们。 用户程序- 它使用接口。 1.8. 使用 Spring 有哪些方式? 使用 Spring 有以下方式: 作为一个成熟的 Spring Web 应用程序。 作为第三方 Web 框架,使用 Spring Frameworks 中间层。 用于远程使用。 作为企业级 Java Bean,它可以包装现有的 POJO(Plain Old Java Objects)。 2、依赖注入(Ioc) 2.1. 什么是 Spring IOC 容器? Spring 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过 XML,Java 注解或 Java 代码提供。 2.2. 什么是依赖注入? 在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由 IoC 容器将它们装配在一起。 2.3. 可以通过多少种方式完成依赖注入? 通常,依赖注入可以通过三种方式完成,即: 构造函数注入 setter 注入 接口注入 在 Spring Framework 中,仅使用构造函数和 setter 注入。 2.4. 区分构造函数注入和 setter 注入。 构造函数注入setter 注入没有部分注入有部分注入不会覆盖 setter 属性会覆盖 setter 属性任意修改都会创建一个新实例任意修改不会创建一个新实例适用于设置很多属性适用于设置少量属性 2.5. spring 中有多少种 IOC 容器? BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端要求时实例化 bean。 ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口。它在 BeanFactory 基础上提供了一些额外的功能。 2.6. 区分 BeanFactory 和 ApplicationContext。 BeanFactoryApplicationContext它使用懒加载它使用即时加载它使用语法显式提供资源对象它自己创建和管理资源对象不支持国际化支持国际化不支持基于依赖的注解支持基于依赖的注解 2.7. 列举 IoC 的一些好处。 IoC 的一些好处是: 它将最小化应用程序中的代码量。 它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例或 JNDI 查找机制。 它以最小的影响和最少的侵入机制促进松耦合。 它支持即时的实例化和延迟加载服务。 2.8. Spring IoC 的实现机制。 Spring 中的 IoC 的实现原理就是工厂模式加反射机制。 示例: 3. Beans 3.1. 什么是 spring bean? 它们是构成用户应用程序主干的对象。 Bean 由 Spring IoC 容器管理。 它们由 Spring IoC 容器实例化,配置,装配和管理。 Bean 是基于用户提供给容器的配置元数据创建。 3.2. spring 提供了哪些配置方式? 基于 xml 配置 bean 所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多 bean 定义和特定于应用程序的配置选项。它们通常以 bean 标签开头。例如: <beanid="studentbean"class="org.edureka.firstSpring.StudentBean"> <propertyname="name"value="Edureka"></property> </bean> 基于注解配置 您可以通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身,而不是使用 XML 来描述 bean 装配。默认情况下,Spring 容器中未打开注解装配。因此,您需要在使用它之前在 Spring 配置文件中启用它。例如: <beans> <context:annotation-config/> <!--beandefinitionsgohere--> </beans> 基于 Java API 配置 Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。 @Bean 注解扮演与 <bean /> 元素相同的角色。 @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。 例如: @Configuration publicclassStudentConfig{ @Bean publicStudentBeanmyStudent(){ returnnewStudentBean(); } } 3.3. spring 支持集中 bean scope? Spring bean 支持 5 种 scope: Singleton- 每个 Spring IoC 容器仅有一个单实例。 Prototype- 每次请求都会产生一个新的实例。 Request- 每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效。 Session- 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效。 Global-session- 类似于标准的 HTTP Session 作用域,不过它仅仅在基于 portlet 的 web 应用中才有意义。Portlet 规范定义了全局 Session 的概念,它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范围内。如果你在 web 中使用 global session 作用域来标识 bean,那么 web 会自动当成 session 类型来使用。 仅当用户使用支持 Web 的 ApplicationContext 时,最后三个才可用。 3.4. spring bean 容器的生命周期是什么样的? spring bean 容器的生命周期流程如下: Spring 容器根据配置中的 bean 定义中实例化 bean。 Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。 如果 bean 实现 BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用 setBeanName()。 如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。 如果存在与 bean 关联的任何 BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法。 如果为 bean 指定了 init 方法(<bean> 的 init-method 属性),那么将调用它。 最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法。 如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。 如果为 bean 指定了 destroy 方法(<bean> 的 destroy-method 属性),那么将调用它。 3.5. 什么是 spring 的内部 bean? 只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在 <property> 或 <constructor-arg>中提供了 <bean> 元素的使用。内部 bean 总是匿名的,它们总是作为原型。 例如,假设我们有一个 Student 类,其中引用了 Person 类。这里我们将只创建一个 Person 类实例并在 Student 中使用它。 Student.java publicclassStudent{ privatePersonperson; //SettersandGetters } publicclassPerson{ privateStringname; privateStringaddress; //SettersandGetters } bean.xml <beanid=“StudentBean"class="com.edureka.Student"> <propertyname="person"> <!--Thisisinnerbean--> <beanclass="com.edureka.Person"> <propertyname="name"value=“Scott"></property> <propertyname="address"value=“Bangalore"></property> </bean> </property> </bean> 3.6. 什么是 spring 装配 当 bean 在 Spring 容器中组合在一起时,它被称为装配或 bean 装配。 Spring 容器需要知道需要什么 bean 以及容器应该如何使用依赖注入来将 bean 绑定在一起,同时装配 bean。 3.7. 自动装配有哪些方式? Spring 容器能够自动装配 bean。也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 bean 的协作者。 自动装配的不同模式: no- 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。 byName- 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。 byType- 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。 构造函数- 它通过调用类的构造函数来注入依赖项。它有大量的参数。 autodetect- 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。 3.8. 自动装配有什么局限? 覆盖的可能性 - 您始终可以使用 <constructor-arg> 和 <property> 设置指定依赖项,这将覆盖自动装配。 基本元数据类型 - 简单属性(如原数据类型,字符串和类)无法自动装配。 令人困惑的性质 - 总是喜欢使用明确的装配,因为自动装配不太精确。 4、注解 4.1. 什么是基于注解的容器配置 不使用 XML 来描述 bean 装配,开发人员通过在相关的类,方法或字段声明上使用注解将配置移动到组件类本身。它可以作为 XML 设置的替代方案。例如: Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。 @Bean 注解扮演与 元素相同的角色。 @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。 例如: @Configuration publicclassStudentConfig{ @Bean publicStudentBeanmyStudent(){ returnnewStudentBean(); } } 4.2. 如何在 spring 中启动注解装配? 默认情况下,Spring 容器中未打开注解装配。因此,要使用基于注解装配,我们必须通过配置<context:annotation-config /> 元素在 Spring 配置文件中启用它。 4.3. @Component, @Controller, @Repository, @Service 有何区别? @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。 @Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。 @Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。 @Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。 4.4. @Required 注解有什么用? @Required 应用于 bean 属性 setter 方法。此注解仅指示必须在配置时使用 bean 定义中的显式属性值或使用自动装配填充受影响的 bean 属性。如果尚未填充受影响的 bean 属性,则容器将抛出 BeanInitializationException。 示例: publicclassEmployee{ privateStringname; @Required publicvoidsetName(Stringname){ this.name=name; } publicstringgetName(){ returnname; } } 4.5. @Autowired 注解有什么用? @Autowired 可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在 setter 方法,构造函数,具有任意名称或多个参数的属性或方法上自动装配 bean。默认情况下,它是类型驱动的注入。 publicclassEmployee{ privateStringname; @Autowired publicvoidsetName(Stringname){ this.name=name; } publicstringgetName(){ returnname; } } 4.6. @Qualifier 注解有什么用? 当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。 例如,这里我们分别有两个类,Employee 和 EmpAccount。在 EmpAccount 中,使用@Qualifier 指定了必须装配 id 为 emp1 的 bean。 Employee.java publicclassEmployee{ privateStringname; @Autowired publicvoidsetName(Stringname){ this.name=name; } publicstringgetName(){ returnname; } } EmpAccount.java publicclassEmpAccount{ privateEmployeeemp; @Autowired @Qualifier(emp1) publicvoidshowName(){ System.out.println(“Employeename:”+emp.getName); } } 4.7. @RequestMapping 注解有什么用? @RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别: 类级别:映射请求的 URL 方法级别:映射 URL 以及 HTTP 请求方法 5、数据访问 5.1. spring DAO 有什么用? Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。 5.2. 列举 Spring DAO 抛出的异常。 5.3. spring JDBC API 中存在哪些类? JdbcTemplate SimpleJdbcTemplate NamedParameterJdbcTemplate SimpleJdbcInsert SimpleJdbcCall 5.4. 使用 Spring 访问 Hibernate 的方法有哪些? 我们可以通过两种方式使用 Spring 访问 Hibernate: 使用 Hibernate 模板和回调进行控制反转 扩展 HibernateDAOSupport 并应用 AOP 拦截器节点 5.5. 列举 spring 支持的事务管理类型 Spring 支持两种类型的事务管理: 程序化事务管理:在此过程中,在编程的帮助下管理事务。它为您提供极大的灵活性,但维护起来非常困难。 声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于 XML 的配置来管理事务。 5.6. spring 支持哪些 ORM 框架 Hibernate iBatis JPA JDO OJB 6、AOP 6.1. 什么是 AOP? AOP(Aspect-Oriented Programming), 即面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不同的抽象软件结构的视角. 在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是Aspect(切面) 6.2. 什么是 Aspect? aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中. AOP 的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个工作: 如何通过 pointcut 和 advice 定位到特定的 joinpoint 上 如何在 advice 中编写切面代码. 可以简单地认为, 使用 @Aspect 注解的类就是切面. 6.3. 什么是切点(JoinPoint) 程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理. 在 Spring AOP 中, join point 总是方法的执行点。 6.4. 什么是通知(Advice)? 特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一个 Advice 作为拦截器,在 JoinPoint “周围”维护一系列的拦截器。 6.5. 有哪些类型的通知(Advice)? Before- 这些类型的 Advice 在 joinpoint 方法之前执行,并使用 @Before 注解标记进行配置。 After Returning- 这些类型的 Advice 在连接点方法正常执行后执行,并使用@AfterReturning 注解标记进行配置。 After Throwing- 这些类型的 Advice 仅在 joinpoint 方法通过抛出异常退出并使用 @AfterThrowing 注解标记配置时执行。 After (finally)- 这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回,并使用 @After 注解标记进行配置。 Around- 这些类型的 Advice 在连接点之前和之后执行,并使用 @Around 注解标记进行配置。 6.6. 指出在 spring aop 中 concern 和 cross-cutting concern 的不同之处。 concern 是我们想要在应用程序的特定模块中定义的行为。它可以定义为我们想要实现的功能。 cross-cutting concern 是一个适用于整个应用的行为,这会影响整个应用程序。例如,日志记录,安全性和数据传输是应用程序几乎每个模块都需要关注的问题,因此它们是跨领域的问题。 6.7. AOP 有哪些实现方式? 实现 AOP 的技术,主要分为两大类: 静态代理 - 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强; 编译时编织(特殊编译器实现) 类加载时编织(特殊的类加载器实现)。 动态代理 - 在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。 JDK 动态代理 CGLIB 6.8. Spring AOP and AspectJ AOP 有什么区别? Spring AOP 基于动态代理方式实现;AspectJ 基于静态代理方式实现。 Spring AOP 仅支持方法级别的 PointCut;提供了完全的 AOP 支持,它还支持属性级别的 PointCut。 6.9. 如何理解 Spring 中的代理? 将 Advice 应用于目标对象后创建的对象称为代理。在客户端对象的情况下,目标对象和代理对象是相同的。 Advice + Target Object = Proxy 6.10. 什么是编织(Weaving)? 为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编织(Weaving)。在 Spring AOP 中,编织在运行时执行。请参考下图: 7、MVC 7.1. Spring MVC 框架有什么用? Spring Web MVC 框架提供模型-视图-控制器架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。 MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。 7.2. 描述一下 DispatcherServlet 的工作流程 DispatcherServlet 的工作流程可以用一幅图来说明: 向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获。 DispatcherServlet 根据-servlet.xml中的配置对请求的 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以HandlerExecutionChain 对象的形式返回。 DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的 preHandler(...)方法)。 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作: HttpMessageConveter: 将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息。 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。 Handler(Controller)执行完成后,向 DispatcherServlet 返回一个ModelAndView 对象; 根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的ViewResolver)返回给DispatcherServlet。 ViewResolver 结合Model和View,来渲染视图。 视图负责将渲染结果返回给客户端。 7.3. 介绍一下 WebApplicationContext WebApplicationContext 是 ApplicationContext 的扩展。它具有 Web 应用程序所需的一些额外功能。它与普通的 ApplicationContext 在解析主题和决定与哪个 servlet 关联的能力方面有所不同。

优秀的个人博客,低调大师

Python面试

什么(what)?如何做(how)?说区别/谈优势(difference)以及实践操作(practice)。 (what) 1. 什么是Python? a. Python是一种解释型语言,python代码在运行之前不需要编译。 b. Python是动态类型语言,在声明变量时,不需要说明变量的类型。 c. Python适合面向对象的编程,因为它支持通过组合与继承的方式定义类。 d. 在Python语言中,函数是第一类对象。 e. Python代码编写快,但是运行速度比编译语言通常要慢。 f. Python用途广泛,常被用作“胶水语言”,可帮助其他语言和组件改善运行状况。 g. 使用Python,程序员可以专注于算法和数据结构的设计,而不用处理底层的细节。 2. 什么是Python自省? python自省是python具有的一种能力,使程序员面向对象的语言所写的程序在运行时,能够获得对象的类python型。Python是一种解释型语言。为程序员提供了极大的灵活性和控制力。 3. 什么是PEP 8? PEP8是一种编程规范,内容是一些关于如何让你的程序更具可读性的建议。 4. 什么是pickling和unpickling? Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling。反之从存储的字符串文件中提取原始Python对象的过程,叫做unpickling。 5. 什么是Python装饰器? Python装饰器是Python中的特有变动,可以使修改函数变得更容易。 6. 什么是Python的命名空间? 在Python中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作——这就是命名空间。它就好像一个盒子,每一个变量名字都对应装着一个对象。当查询变量的时候,会从该盒子里面寻找相应的对象。 7. 什么是字典推导式和列表推导式? 它们是可以轻松创建字典和列表的语法结构。 8. Lambda函数是什么? 这是一个常被用于代码中的单个表达式的匿名函数。 9. *args,**kwargs?参数是什么? 如果我们不确定要往函数中传入多少个参数,或者我们想往函数中以列表和元组的形式传参数时,那就使要用*args;如果我们不知道要往函数中传入多少个关键词参数,或者想传入字典的值作为关键词参数时,那就要使用**kwargs。 10. 什么是Pass语句? Pass是一个在Python中不会被执行的语句。在复杂语句中,如果一个地方需要暂时被留白,它常常被用于占位符。 11. unittest是什么? 在Python中,unittest是Python中的单元测试框架。它拥有支持共享搭建、自动测试、在测试中暂停代码、将不同测试迭代成一组,等等的功能。 12. 构造器是什么? 构造器是实现迭代器的一种机制。它功能的实现依赖于yield表达式,除此之外它跟普通的函数没有两样。 13. doc string是什么? Python中文档字符串被称为docstring,它在Python中的作用是为函数、模块和类注释生成文档。 14. 负索引是什么? Python中的序列索引可以是正也可以是负。如果是正索引,0是序列中的第一个索引,1是第二个索引。如果是负索引,(-1)是最后一个索引而(-2)是倒数第二个索引。 15. 模块和包是什么? 在Python中,模块是搭建程序的一种方式。每一个Python代码文件都是一个模块,并可以引用其他的模块,比如对象和属性。一个包含许多Python代码的文件夹是一个包。一个包可以包含模块和子文件夹。 16. 垃圾回收是什么? 在Python中,为了解决内存泄露问题,采用了对象引用计数,并基于引用计数实现自动垃圾回收。 17. CSRF是什么? CSRF是伪造客户端请求的一种攻击,CSRF的英文全称是Cross Site Request Forgery,字面上的意思是跨站点伪造请求。 (How?) 1. 如何让你的程序更具可读性? 适当地加入非前导空格,适当的空行以及一致的命名。 2. Python是如何被解释的? Python是一种解释性语言,它的源代码可以直接运行。Python解释器会将源代码转换成中间语言,之后再翻译成机器码再执行。 3. 如何在Python中拷贝一个对象? 如果要在Python中拷贝一个对象,大多时候你可以用copy.copy()或者copy.deepcopy()。但并不是所有的对象都可以被拷贝。 4. 如何用Python删除一个文件? 使用函数os.remove("file") 5. 如何将一个数字转换成一个字符串? 你可以使用自带函数str()将一个数字转换为字符串。如果你想要八进制或者十六进制数,可以用oct()或hex()。 6. Python是如何进行内存管理的? Python的内存管理是由私有heap空间管理的。所有的Python对象和数据结构都在一个私有heap中。程序员没有访问该heap的权限,只有解释器才能对它进行操作。为Python的heap空间分配内存是由Python的内存管理模块进行的,其核心API会提供一些访问该模块的方法供程序员使用。Python有自带的垃圾回收系统,它回收并释放没有被使用的内存,让它们能够被其他程序使用。 7. 如何实现tuple和list的转换? 以list作为参数将tuple类初始化,将返回tuple类型 以tuple作为参数将list类初始化,将返回list类型 8. Python里面如何生成随机数? random.random():生成一个0-1之间的随机浮点数 random.uniform(a, b):生成[a,b]之间的浮点数 random.randint(a, b):生成[a,b]之间的整数 random.randrange(a, b, step):在指定的集合[a,b)中,以step为基数随机取一个数 random.choice(sequence):从特定序列中随机取一个元素,这里的序列可以是字符串,列表,元组等 9. 如何在一个function里面设置一个全局的变量 如果要给全局变量在一个函数里赋值,必须使用global语句。global VarName的表达式会告诉Python, VarName是一个全局变量,这样Python就不会在局部命名空间里寻找这个变量了 10. Python如何实现单例模式?其他23种设计模式python如何实现? 单例模式主要有四种方法:__new__、共享属性、装饰器、import。 其他23种设计模式可基本分为创建型、结构型和行为型模式。 创建模式,提供实例化的方法,为适合的状况提供相应的对象创建方法。 结构化模式,通常用来处理实体之间的关系,使得这些实体能够更好地协同工作。 行为模式,用于在不同的实体建进行通信,为实体之间的通信提供更容易,更灵活的通信方法。 各模式的实现可根据其特点编写代码(限于篇幅,此处不做示例) 11. 如何判断单向链表中是否有环 首先遍历链表,寻找是否有相同地址,借此判断链表中是否有环。如果程序进入死循环,则需要一块空间来存储指针,遍历新指针时将其和储存的旧指针比对,若有相同指针,则该链表有环,否则将这个新指针存下来后继续往下读取,直到遇见NULL,这说明这个链表无环。 12. 如何遍历一个内部未知的文件夹? 常用的有以下这几种办法:os.path.walk(),os.walk(),listdir 13. mysql数据库如何分区、分表? 分表可以通过三种方式:mysql集群、自定义规则和merge存储引擎。 分区有四类: RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。 LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。 HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。 KEY 分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。 14. 如何对查询命令进行优化? a. 应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索。 b. 应尽量避免在 where 子句中对字段进行 null 值判断,避免使用!=或<>操作符,避免使用 or 连接条件,或在where子句中使用参数、对字段进行表达式或函数操作,否则会导致权标扫描 c. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。 d. 使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。 e. 很多时候可考虑用 exists 代替 in f. 尽量使用数字型字段 g. 尽可能的使用 varchar/nvarchar 代替 char/nchar h. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。 i. 尽量使用表变量来代替临时表。 j. 避免频繁创建和删除临时表,以减少系统表资源的消耗。 k. 尽量避免使用游标,因为游标的效率较差。 l. 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF m. 尽量避免大事务操作,提高系统并发能力。 n. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。 15. 如何理解开源? 开源,即开放源代码。开源诞生于软件行业,它不仅仅代表软件源代码的开放,本身即意味着自由、共享和充分利用资源。开源是一种精神,是一种文化,如今已经成为软件业发展的大势所趋。 16. 如何理解MVC/MTV框架? MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起。MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同。 17. MSSQL的死锁是如何产生的? 如下是死锁产生的四个必要条件: 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。 18. Sql注入是如何产生的,如何防止? 程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。产生Sql注入。下面是防止办法: a. 过滤掉一些常见的数据库操作关键字,或者通过系统函数来进行过滤。 b. 在PHP配置文件中将Register_globals=off;设置为关闭状态 c. SQL语句书写的时候尽量不要省略小引号(tab键上面那个)和单引号 d. 提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的 e. 对于常用的方法加以封装,避免直接暴漏SQL语句 f. 开启PHP安全模式:Safe_mode=on; g. 打开magic_quotes_gpc来防止SQL注入 h. 控制错误信息:关闭错误提示信息,将错误信息写到系统日志。 i. 使用mysqli或pdo预处理。 19. xxs如何预防? XSS漏洞难以检测,但是为了WEB安全仍需要尽力避免: 针对反射型和存储型XSS,需要服务端和前端共同预防,针对用户输入的数据做解析和转义,对于前端开发而言,则是善于使用escape,针对data URI内容做正则判断,禁止用户输入非显示信息。 对于DOM XSS,由于造成XSS的原因在于用户的输入,因此在前端,需要特别注意用户输入源,并对可能造成的XSS的操作需要进行字串转义。 20. 如何生成共享秘钥? 如何防范中间人攻击? 密钥的生成是通过使用全局配置命令完成的:对于不可输出密钥是<crypto key generate rsa label {label string},而对于可输出密钥则是<crypto key generate rsa exportable label {label string}>。标记(label)是可选择的;如果没有指定标记,那么密钥名称将是hostname.domain-name。 对于中间人的攻击,可以采用如下防范手段: a. 通过采用动态ARP检测、DHCP Snooping等控制操作来加强网络基础设施 b. 采用传输加密 c. 使用CASBs(云访问安全代理) d. 创建RASP(实时应用程序自我保护) e. 阻止自签名证书 f. 强制使用SSL pinning g. 安装DAM(数据库活动监控) 21. 如何管理不同版本的代码? 进行版本管理。可举例告知如何使用Git(或是其他工具)进行追踪。 (Difference) 数组和元组之间的区别? 数组在python中叫作列表。列表可以修改,而元组不可以修改,如果元组中仅有一个元素,则要在元素后加上逗号。元组和列表的查询方式一样。元组只可读不可修改,如果程序中的数据不允许修改可用元组。 new和init的区别? init是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。 new是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。 也就是,new在init之前被调用,new的返回值(实例)将传递给init方法的第一个参数,然后init给这个实例设置一些参数。 Python中单下划线和双下划綫的区别? "单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量; "双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。 浅拷贝与深拷贝的区别是? 在python中,对象赋值实际上是对象的引用。浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变,而深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变。 使用装饰器的单例和使用其他方法的单例,在后续使用中,有何区别? Import方法改变了类本身,new方法,但是只是把所有实例对象共享属性,每次产生一个新对象。算作伪单例,共享属性方法实例化了许多个相同属性。所以,装饰器方法最为实用。 多进程与多线程的区别? a. 简而言之,一个程序至少有一个进程,一个进程至少有一个线程。 b. 线程的划分尺度小于进程,使得多线程程序的并发性高。 c. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 d. 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 e. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 select和epoll的区别? a. select实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。 b. select每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。 TCP和UDP的区别?边缘触发和水平触发的区别? a. 基本区别: 基于连接与无连接 TCP要求系统资源较多,UDP较少; UDP程序结构较简单 流模式(TCP)与数据报模式(UDP); TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UDP不保证 b. 编程中的区别 socket()的参数不同 UDP Server不需要调用listen和accept UDP收发数据用sendto/recvfrom函数 TCP:地址信息在connect/accept时确定 UDP:在sendto/recvfrom函数中每次均 需指定地址信息 UDP:shutdown函数无效 HTTP连接:get和post的区别? GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。 POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数据。 因此,GET请求的数据会暴露在地址栏中,而POST请求则不会。 varchar与char的区别? char 长度是固定的,不管你存储的数据是多少他都会都固定的长度。而varchar则处可变长度但他要在总长度上加1字符,这个用来存储位置。所以在处理速度上char要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型。 BTree索引和hash索引的区别? Hash 索引因其结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。但也有如下明显的缺点: a. Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。 b. Hash 索引无法被用来避免数据的排序操作。 c. Hash 索引不能利用部分索引键查询。 d. Hash 索引在任何时候都不能避免表扫描。 e. Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。 primary key和unique的区别? a. 作为Primary Key的域/域组不能为null,而Unique Key可以。 b. 在一个表中只能有一个Primary Key,而多个Unique Key可以同时存在。 C. 逻辑设计上讲,Primary Key一般在逻辑设计中用作记录标识,这也是设置Primary Key的本来用意,而Unique Key只是为了保证域/域组的唯一性。 ecb和cbc模式有什么区别? ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。 CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。ECB和CBC的加密结果是不一样的,两者的模式不同,而且CBC会在第一个密码块运算时加入一个初始化向量。 对称加密与非对称加密的区别? 对称加密,需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。所以,对称性加密也称为密钥加密。 而非对称加密算法需要两个密钥:公开密钥和私有密钥。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。 Xrange和range的区别? range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列。xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。range会直接生成一个list对象,而xrange则不会直接生成一个list,而是每次调用返回其中的一个值。 os与sys模块的区别? 前者提供了一种方便的使用操作系统函数的方法。后者提供访问由解释器使用或维护的变量和与解释器进行交互的函数。 NoSQL和关系数据库的区别? a. SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档、哈希表或者其他方式。 b. 在SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key),索引(index),触发器(trigger),存储过程(stored procedure)等。表结构可以在被定义之后更新,但是如果有比较大的结构变更的话就会变得比较复杂。在NoSQL中,数据可以在任何时候任何地方添加,不需要先定义表。 c. SQL中如果需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部数据表。而在NoSQL中除了这种规范化的外部数据表做法以外,我们还能用如下的非规范化方式把外部数据直接放到原数据集中,以提高查询效率。缺点也比较明显,更新审核人数据的时候将会比较麻烦。 d. SQL中可以使用JOIN表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。NoSQL暂未提供类似JOIN的查询方式对多个数据集中的数据做查询。所以大部分NoSQL使用非规范化的数据存储方式存储数据。 e. SQL中不允许删除已经被使用的外部数据,而NoSQL中则没有这种强耦合的概念,可以随时删除任何数据。 f. SQL中如果多张表数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成功。这种场景可以通过事务来控制,可以在所有命令完成后再统一提交事务。而NoSQL中没有事务这个概念,每一个数据集的操作都是原子级的。 g. 在相同水平的系统设计的前提下,因为NoSQL中省略了JOIN查询的消耗,故理论上性能上是优于SQL的。 (Practice) 这种实践操作类题目比较丰富多样,如下几类比较常见: 1. 补充缺失的代码 例如: image def print_directory_contents(sPath): import os for sChild in os.listdir(sPath): sChildPath = os.path.join(sPath,sChild) if os.path.isdir(sChildPath): print_directory_contents(sChildPath) else: print sChildPath 2. 下面这段代码的输出结果是什么?****请解释。 例如: image list1 = [10, 'a']list2 = [123]list3 = [10, 'a'] 新的默认列表只在函数被定义的那一刻创建一次。当extendList被没有指定特定参数list调用时,这组list的值随后将被使用。这是因为带有默认参数的表达式在函数被定义的时候被计算,不是在调用的时候被计算。 3. 下面的代码能够运行么?请解释? 例如: image 能够运行。当key缺失时,执行DefaultDict类,字典的实例将自动实例化这个数列。 4. 将函数按照执行效率高低排序,并证明自己的答案是正确的。 例如: image 按执行效率从高到低排列:f2、f1和f3。要证明这个答案是正确的,你应该知道如何分析自己代码的性能。Python中有一个很好的程序分析包,可以满足这个需求。 image ……

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。