首页 文章 精选 留言 我的

精选列表

搜索[禅道],共6167篇文章
优秀的个人博客,低调大师

2019年12道RabbitMQ高频面试题你都会了吗?(含答案解析)

RabbitMQ 面试题 1、什么是 rabbitmq2、为什么要使用 rabbitmq3、使用 rabbitmq 的场景4、如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?5.如何避免消息重复投递或重复消费?6、消息基于什么传输?7、消息如何分发?8、消息怎么路由?9、如何确保消息不丢失?10、使用 RabbitMQ 有什么好处?11、RabbitMQ 的集群12、mq 的缺点 1、什么是 rabbitmq 采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦 2、为什么要使用 rabbitmq (1)在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;(2)拥有持久化的机制,进程消息,队列中的信息也可以保存下来。(3)实现消费者和生产者之间的解耦。(4)对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作。(5)可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单。 3、使用 rabbitmq 的场景 (1)服务间异步通信(2)顺序消费(3)定时任务(4)请求削峰 4、如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息? 发送方确认模式将信道设置成 confirm 模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的 ID。一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一 ID)。如果 RabbitMQ 发生内部错误从而导致消息丢失,会发送一条 nack(notacknowledged,未确认)消息。发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。 接收方确认机制消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。只有消费者确认了消息,RabbitMQ 才能安全地把消息从队列中删除。这里并没有用到超时机制,RabbitMQ 仅通过 Consumer 的连接中断来确认是否需要重新发送消息。也就是说,只要连接不中断,RabbitMQ 给了 Consumer 足够长的时间来处理消息。保证数据的最终一致性;下面罗列几种特殊情况(1)如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ 会认为消息没有被分发,然后重新分发给下一个订阅的消费者。(可能存在消息重复消费的隐患,需要去重)(1)2如果消费者接收到消息却没有确认消息,连接也未断开,则 RabbitMQ 认为该消费者繁忙,将不会给该消费者分发更多的消息。 5.如何避免消息重复投递或重复消费? 在消息生产时,MQ 内部针对每条生产者发送的消息生成一个 inner-msg-id,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列;在消息消费时,要求消息体中必须要有一个 bizId(对于同一业务全局唯一,如支付 ID、订单 ID、帖子 ID 等)作为去重的依据,避免同一条消息被重复消费。 6、消息基于什么传输? 由于 TCP 连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ 使用信道的方式来传输数据。信道是建立在真实的 TCP 连接内的虚拟连接,且每条 TCP 连接上的信道数量没有限制。 7、消息如何分发? 若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。通过路由可实现多消费的功能 8、消息怎么路由? 消息提供方->路由->一至多个队列消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设定。通过队列路由键,可以把队列绑定到交换器上。消息到达交换器后,RabbitMQ 会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则);常用的交换器主要分为一下三种:fanout:如果交换器收到消息,将会广播到所有绑定的队列上direct:如果路由键完全匹配,消息就被投递到相应的队列topic:可以使来自不同源头的消息能够到达同一个队列。 使用 topic 交换器时,可以使用通配符 9、如何确保消息不丢失? 消息持久化,当然前提是队列必须持久化RabbitMQ 确保持久性消息能从服务器重启中恢复的方式是,将它们写入磁盘上的一个持久化日志文件,当发布一条持久性消息到持久交换器上时,Rabbit 会在消息提交到日志文件后才发送响应。一旦消费者从持久队列中消费了一条持久化消息,RabbitMQ 会在持久化日志中把这条消息标记为等待垃圾收集。如果持久化消息在被消费之前 RabbitMQ 重启,那么 Rabbit 会自动重建交换器和队列(以及绑定),并重新发布持久化日志文件中的消息到合适的队列。 10、使用 RabbitMQ 有什么好处? (1)服务间高度解耦(2)异步通信性能高(3)流量削峰 11、RabbitMQ 的集群 镜像集群模式你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,然后每次你写消息到 queue 的时候,都会自动把消息到多个实例的 queue 里进行消息同步。好处在于,你任何一个机器宕机了,没事儿,别的机器都可以用。坏处在于,第一,这个性能开销也太大了吧,消息同步所有机器,导致网络带宽压力和消耗很重!第二,这么玩儿,就没有扩展性可言了,如果某个 queue 负载很重,你加机器,新增的机器也包含了这个 queue 的所有数据,并没有办法线性扩展你的 queue 12、mq 的缺点 (1)系统可用性降低系统引入的外部依赖越多,越容易挂掉,本来你就是 A 系统调用 BCD 三个系统的接口就好了,人 ABCD 四个系统好好的,没啥问题,你偏加个 MQ 进来,万一MQ 挂了咋整?MQ 挂了,整套系统崩溃了,你不就完了么。(2)系统复杂性提高硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已(3)一致性问题A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,最好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了 10 倍。但是关键时刻,用,还是得用的。欢迎大家关注我的公种浩【程序员追风】,2019年多家公司java面试题整理了1000多道400多页pdf文档,文章都会在里面更新,整理的资料也会放在里面。 最后 欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!

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

快看看这30道高频面试题!

前言 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)。 很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知识,对于理解一项技术还是有帮助的。 关于Dubbo的知识总结了个思维导图 Dubbo 面试题 1、为什么要用 Dubbo? 2、Dubbo 的整体架构设计有哪些分层? 3、默认使用的是什么通信框架,还有别的选择吗? 4、服务调用是阻塞的吗? 5、一般使用什么注册中心?还有别的选择吗? 6、默认使用什么序列化框架,你知道的还有哪些? 7、服务提供者能实现失效踢出是什么原理? 8、服务上线怎么不影响旧版本? 9、如何解决服务调用链过长的问题? 10、说说核心的配置有哪些? 11、Dubbo 推荐用什么协议? 12、同一个服务多个注册的情况下可以直连某一个服务吗? 13、画一画服务注册与发现的流程图? 14、Dubbo 集群容错有几种方案? 15、Dubbo 服务降级,失败重试怎么做? 16、Dubbo 使用过程中都遇到了些什么问题? 17、Dubbo Monitor 实现原理? 18、Dubbo 用到哪些设计模式? 19、Dubbo 配置文件是如何加载到 Spring 中的? 20、Dubbo SPI 和 Java SPI 区别? 21、Dubbo 支持分布式事务吗? 22、Dubbo 可以对结果进行缓存吗? 23、服务上线怎么兼容旧版本? 24、Dubbo 必须依赖的包有哪些? 25、Dubbo telnet 命令能做什么? 26、Dubbo 支持服务降级吗? 27、Dubbo 如何优雅停机? 28、Dubbo 和 Dubbox 之间的区别? 29、Dubbo 和 Spring Cloud 的区别? 30、你还了解别的分布式框架吗? 下面是Dubbo 面试题答案解析 1、为什么要用 Dubbo? 随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。就这样为分布式系统的服务治理框架就出现了,Dubbo 也就这样产生了。 2、Dubbo 的整体架构设计有哪些分层? 接口服务层(Service):该层与业务逻辑相关,根据 provider 和 consumer 的业务设计对应的接口和实现配置层(Config):对外配置接口,以 ServiceConfig 和 ReferenceConfig 为中心服务代理层(Proxy):服务接口透明代理,生成服务的客户端 Stub 和 服务端的 Skeleton,以 ServiceProxy 为中心,扩展接口为 ProxyFactory服务注册层(Registry):封装服务地址的注册和发现,以服务 URL 为中心,扩展接口为 RegistryFactory、Registry、RegistryService路由层(Cluster):封装多个提供者的路由和负载均衡,并桥接注册中心,以Invoker 为中心,扩展接口为 Cluster、Directory、Router 和 LoadBlancce监控层(Monitor):RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory、Monitor 和 MonitorService远程调用层(Protocal):封装 RPC 调用,以 Invocation 和 Result 为中心,扩展接口为 Protocal、Invoker 和 Exporter信息交换层(Exchange):封装请求响应模式,同步转异步。以 Request 和Response 为中心,扩展接口为 Exchanger、ExchangeChannel、ExchangeClient 和 ExchangeServer网络 传输 层(Transport):抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel、Transporter、Client、Server 和 Codec数据序列化层(Serialize):可复用的一些工具,扩展接口为 Serialization、ObjectInput、ObjectOutput 和 ThreadPool 3、默认使用的是什么通信框架,还有别的选择吗? 默认也推荐使用 netty 框架,还有 mina。 4、服务调用是阻塞的吗? 默认是阻塞的,可以异步调用,没有返回值的可以这么做。Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。 5、一般使用什么注册中心?还有别的选择吗? 推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。 6、默认使用什么序列化框架,你知道的还有哪些? 推荐使用 Hessian 序列化,还有 Duddo、FastJson、Java 自带序列化。 7、服务提供者能实现失效踢出是什么原理? 服务失效踢出基于 zookeeper 的临时节点原理。 8、服务上线怎么不影响旧版本? 采用多版本开发,不影响旧版本。 9、如何解决服务调用链过长的问题? 可以结合 zipkin 实现分布式服务追踪。 10、说说核心的配置有哪些? 11、Dubbo 推荐用什么协议? 12、同一个服务多个注册的情况下可以直连某一个服务吗? 可以点对点直连,修改配置即可,也可以通过 telnet 直接某个服务。 13、画一画服务注册与发现的流程图? 14、Dubbo 集群容错有几种方案? 15、Dubbo 服务降级,失败重试怎么做? 可以通过 dubbo:reference 中设置 mock="return null"。mock 的值也可以修改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规则是 “接口名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑 16、Dubbo 使用过程中都遇到了些什么问题? 在注册中心找不到对应的服务,检查 service 实现类是否添加了@service 注解无法连接到注册中心,检查配置文件中的对应的测试 ip 是否正确 17、Dubbo Monitor 实现原理? Consumer 端在发起调用之前会先走 filter 链;provider 端在接收到请求时也是先走 filter 链,然后才进行真正的业务逻辑处理。默认情况下,在 consumer 和 provider 的 filter 链中都会有 Monitorfilter。1、MonitorFilter 向 DubboMonitor 发送数据2、DubboMonitor 将数据进行聚合后(默认聚合 1min 中的统计数据)暂存到ConcurrentMap statisticsMap,然后使用一个含有 3 个线程(线程名字:DubboMonitorSendTimer)的线程池每隔 1min 钟,调用 SimpleMonitorService 遍历发送 statisticsMap 中的统计数据,每发送完毕一个,就重置当前的 Statistics 的 AtomicReference3、SimpleMonitorService 将这些聚合数据塞入 BlockingQueue queue 中(队列大写为 100000)4、SimpleMonitorService 使用一个后台线程(线程名为:DubboMonitorAsyncWriteLogThread)将 queue 中的数据写入文件(该线程以死循环的形式来写)5、SimpleMonitorService 还会使用一个含有 1 个线程(线程名字:DubboMonitorTimer)的线程池每隔 5min 钟,将文件中的统计数据画成图表 18、Dubbo 用到哪些设计模式? Dubbo 框架在初始化和通信过程中使用了多种设计模式,可灵活控制类加载、权限控制等功能。工厂模式 Provider 在 export 服务时,会调用 ServiceConfig 的 export 方法。ServiceConfig中有个字段: private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtensi on(); Dubbo 里有很多这种代码。这也是一种工厂模式,只是实现类的获取采用了 JDKSPI 的机制。这么实现的优点是可扩展性强,想要扩展实现,只需要在 classpath下增加个文件就可以了,代码零侵入。另外,像上面的 Adaptive 实现,可以做到调用时动态决定调用哪个实现,但是由于这种实现采用了动态代理,会造成代码调试比较麻烦,需要分析出实际调用的实现类。 装饰器模式Dubbo 在启动和调用阶段都大量使用了装饰器模式。以 Provider 提供的调用链为例,具体的调用链代码是在 ProtocolFilterWrapper 的 buildInvokerChain 完成的,具体是将注解中含有 group=provider 的 Filter 实现,按照 order 排序,最后的调用顺序是: EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter -> ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter -> ExceptionFilter 更确切地说,这里是装饰器和责任链模式的混合使用。例如,EchoFilter 的作用是判断是否是回声测试请求,是的话直接返回内容,这是一种责任链的体现。而像ClassLoaderFilter 则只是在主功能上添加了功能,更改当前线程的 ClassLoader,这是典型的装饰器模式。 观察者模式Dubbo 的 Provider 启动时,需要与注册中心交互,先注册自己的服务,再订阅自己的服务,订阅时,采用了观察者模式,开启一个 listener。注册中心会每 5 秒定时检查是否有服务更新,如果有更新,向该服务的提供者发送一个 notify 消息,provider 接受到 notify 消息后,运行 NotifyListener 的 notify 方法,执行监听器方法。 动态代理模式Dubbo 扩展 JDK SPI 的类 ExtensionLoader 的 Adaptive 实现是典型的动态代理实现。Dubbo 需要灵活地控制实现类,即在调用阶段动态地根据参数决定调用哪个实现类,所以采用先生成代理类的方法,能够做到灵活的调用。生成代理类的代码是 ExtensionLoader 的 createAdaptiveExtensionClassCode 方法。代理类主要逻辑是,获取 URL 参数中指定参数的值作为获取实现类的 key。 19、Dubbo 配置文件是如何加载到 Spring 中的? Spring 容器在启动的时候,会读取到 Spring 默认的一些 schema 以及 Dubbo 自定义的 schema,每个 schema 都会对应一个自己的 NamespaceHandler,NamespaceHandler 里面通过 BeanDefinitionParser 来解析配置信息并转化为需要加载的 bean 对象!欢迎大家关注我的公种浩【程序员追风】,2019年多家公司java面试题整理了1000多道400多页pdf文档,文章都会在里面更新,整理的资料也会放在里面。 20、Dubbo SPI 和 Java SPI 区别? JDK SPI:JDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展吃实话很耗时,但也没用上,很浪费资源。所以只希望加载某个的实现,就不现实了DUBBO SPI:1、对 Dubbo 进行扩展,不需要改动 Dubbo 的源码2、延迟加载,可以一次只加载自己想要加载的扩展实现。3、增加了对扩展点 IOC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。4、Dubbo 的扩展机制能很好的支持第三方 IoC 容器,默认支持 Spring Bean。 21、Dubbo 支持分布式事务吗? 目前暂时不支持,可与通过 tcc-transaction 框架实现介绍:tcc-transaction 是开源的 TCC 补偿性分布式事务框架TCC-Transaction 通过 Dubbo 隐式传参的功能,避免自己对业务代码的入侵。 22、Dubbo 可以对结果进行缓存吗? 为了提高数据访问的速度。Dubbo 提供了声明式缓存,以减少用户加缓存的工作量其实比普通的配置文件就多了一个标签 cache="true" 23、服务上线怎么兼容旧版本? 可以用版本号(version)过渡,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。这个和服务分组的概念有一点类似。 24、Dubbo 必须依赖的包有哪些? Dubbo 必须依赖 JDK,其他为可选。 25、Dubbo telnet 命令能做什么? dubbo 服务发布之后,我们可以利用 telnet 命令进行调试、管理。Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令连接服务telnet localhost 20880 //键入回车进入 Dubbo 命令模式。查看服务列表 dubbo>ls com.test.TestService dubbo>ls com.test.TestService create delete query · ls (list services and methods)· ls : 显示服务列表。· ls -l : 显示服务详细信息列表。· ls XxxService:显示服务的方法列表。· ls -l XxxService:显示服务的方法详细信息列表。 26、Dubbo 支持服务降级吗? 以通过 dubbo:reference 中设置 mock="return null"。mock 的值也可以修改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规则是 “接口名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑 27、Dubbo 如何优雅停机? Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。 28、Dubbo 和 Dubbox 之间的区别? Dubbox 是继 Dubbo 停止维护后,当当网基于 Dubbo 做的一个扩展项目,如加了服务可 Restful 调用,更新了开源组件等。 29、Dubbo 和 Spring Cloud 的区别? 根据微服务架构在各方面的要素,看看 Spring Cloud 和 Dubbo 都提供了哪些支持。使用 Dubbo 构建的微服务架构就像组装电脑,各环节我们的选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心,但是如果你是一名高手,那这些都不是问题;而 Spring Cloud 就像品牌机,在Spring Source 的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础有足够的了解。 30、你还了解别的分布式框架吗? 别的还有 spring 的 spring cloud,facebook 的 thrift,twitter 的 finagle 等 最后 欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!

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

三年Java开发面试,16道MySQL面试题集锦(附答案)

说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了。后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,很少提到我们的集群配置优化方案。 1.索引是什么?有什么作用以及缺点 答:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。也可以理解为索引就是一本书的目录,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引那么需要的空间就会更大。 2.索引的目的是什么 答:为了高效的查找得到我们所需要的数据,减少分组和排序时间,提高我们的mysql的性能 3.索引对数据库系统的负面影响 答:虽然索引对于数据库的查询提高了效率,但一定程度上增加了空间的占用,同时写入的速度降低了不少,和原有写入数据相比较,多了一步去维护索引的操作。 4.建立索引的原则 答:选择唯一性索引,为经常需要查询、排序、分组和联合操作的字段建立索引,限制索引的数目,最左前缀匹配原则(非常重要的原则),尽量选择区分度高的列作为索引,字段尽力设置不为null,索引列上不计算。 5.主键、外键和唯一索引的区别 答:定义: 主键:唯一标识一条记录,不能有重复的,不允许为空 外键:表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引:该字段没有重复值,但可以有空值 作用: 主键:用来保证数据完整性 外键:用来和其他表建立联系用的 索引:是提高查询排序的速度 个数: 主键:主键只能有一个 外键:一个表可以有多个外键 索引:一个表可以有多个唯一索引 6.MySQL底层实现,MySQL有什么引擎 答:mysql底层采用B+tree的存储结构,也就是只有叶子节点携带真实数据,每个节点大小为16Kb,大致三层的B+tree就可以存2000W左右的数据,大大的减少了磁盘的IO。我们常见的存储引擎有InnoDB和MyISAM。 7.InnoDB和MyISAM区别,InnoDB替代了MyISAM,那么MyISAM是否一无是处。 答:InnoDB支持事务,支持行锁,在磁盘上只存两个文件,一个是索引文件,另一个是数据文件,在B+Tree的主键索引上,叶子节点携带全部数据,MyISAM不支持事务,不支持行锁,磁盘上存了三个文件,一个是索引文件,另一个是数据文件,还有一个存放的对应关系文件,从查询的角度来说,InnoDB没有MyISAM的单条查询速度高,MyISAM采用Hash存储回行得到数据的查询过程,单MyISAM对于范围查询不是很友好。因此我们可以看出InnoDB用的更广一些,但同时MyISAM对于非范围查询的高效还是有很大用处的,而且MyISAM对于表内的总数查询,维护了单独的数据,也是很高效的。 8.什么是事务,事务特性 答:事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。在我们的mysql里也是如此,也就是我们的ACID原则。A原子性,把一系列的动作视为一个最小的操作(原子操作)C一致性,从一个状态到另一个状态是一致的,I隔离性:事务与事务之间是不可见相互隔离的,D持久性:一旦事务提交,则所做修改就会被永久保存到数据库中。可以简单说一下可重复读的MVCC机制,面试官也懵圈。 9.如何设计一个高并发的系统(对于mysql来讲) 答:这个后面会结合别的技术来说,只讲mysql不太好说。大致就是我们首先应该考虑到的是读写分离操作(过几天博客里会详细说这个),再就是我们常见的分库分表操作,水平切分垂直切分。还可以加入缓存redis操作。合理使用索引,explain进行sql优化。 10.锁的优化策略 答:优化,也就是最小力度的锁我们的数据,也就是行锁,InnoDB的行锁其实是加在索引字段的,避免行锁的升级为表锁,再就是我们尽量避免间隙锁,尽量避免我们的范围修改,如果真的必须范围修改,那么我应该尽可能的缩小到最小的范围。 11.优化SQL的方法 答:设置一个主键索引,需主要主键索引一般没有真正业务含义,使用int类型自动增长的,而且不能为null,非主键索引字段优先考虑区分度高的业务情况和最左前缀原则,设置为null。如果真的数据量不大,不建议加索引,反而会影响效率的。选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,使用连接(JOIN)来代替子查询,适用联合(UNION)来代替手动创建的临时表。学会使用explain进行SQL分析,实在不行可以打开trace进行分析SQL情况,用完记得关闭。 12.谈谈三大范式,什么时候使用反范式设计 答:第一范式(1NF):确保每列保持原子性即列不可分 第二范式(2NF):属性完全依赖于主键,也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。 第三范式(3NF):属性和主键不能间接相关(减少数据冗余,这样就可以通过主外键进行表之间连接) 比如我们表比较多,需要关联时,但我们的A表只需要关联B表的一个字段,而且每次都需要关联查询你,这时我们可以采用A表放置一个冗余字段来存B表的那个字段。这个操作其实就是一个反范式的。 13.说几个mysql中你常用的函数答: 答:sum、count 、avg、min、max 14.varchar(100)和varchar(200)的区别 答:占用内存空间大小肯定是不一致的,但是占用我们磁盘的大小是一致的,我们存储字符串"abc",完全是一样的磁盘空间,但是对于varchar(100)来说,接收到的字符串长度太长了就会报错的。后面的数字代表可存储的字节数。 15.varchar(20)和int(20)中的20含义一样吗 答:显然不一致,int(M) M表示的不是数据的最大长度,只是数据宽度,并不影响存储多少位长度的数据;varchar(M) M表示的是varchar类型数据在数据库中存储的最大长度,超过则不存; 16.如何开启慢日志查询? 答:有2种方式,一是修改mysql的配置文件,二是通过set global语句来实现。slow_query_log = ON,打开日志,long_query_time = 2,设置时间,2秒就算是慢查询,然后重启mysql服务即可,进入mysql控制台,输入SET GLOBAL slow_query_log = 'ON';SET GLOBAL long_query_time = X;不需要重启服务就可以得到慢查询日志。 需要java学习路线图的私信笔者“java”领取哦!另外喜欢这篇文章的可以给笔者点个赞,关注一下,每天都会分享Java相关文章!还有不定时的福利赠送,包括整理的学习资料,面试题,源码等~~

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

9月最新184道阿里、百度、腾讯、头条Java面试题合集

阿里面试题 如何实现一个高效的单向链表逆序输出? 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt(2)精确到小数点后10位 给定一个二叉搜索树(BST),找到树中第 K 小的节点 LRU缓存机制 关于epoll和select的区别,以下哪些说法是正确的 从innodb的索引结构分析,为什么索引的 key 长度不能太长 MySQL的数据如何恢复到任意时间点? NFS 和 SMB 是最常见的两种 NAS(Network Attached Storage)协议,当把一个文件系统同时通过 NFS 和 SMB 协议共享给多个主机访问时,以下哪些说法是错误的 输入 ping IP 后敲回车,发包前会发生什么? 请解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决? 现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容缩容)来负责具体的邮件发送任务,如何让系统尽快地完成发送? 有一批气象观测站,现需要获取这些站点的观测数据,并存储到 Hive 中。但是气象局只提供了 api 查询,每次只能查询单个观测点。那么如果能够方便快速地获取到所有的观测点的数据? 如何实现两金额数据相加(最多小数点两位) 关于并行计算的一些基础开放问题 请计算XILINX公司VU9P芯片的算力相当于多少TOPS,给出计算过程与公式16.一颗现代处理器,每秒大概可以执行多少条简单的MOV指令,有哪些主要的影响因素 17.请分析 MaxCompute 产品与分布式技术的关系、当前大数据计算平台类产品的市场现状和发展趋势 对大数据平台中的元数据管理是怎么理解的,元数据收集管理体系是怎么样的,会对大数据应用有什么样的影响19.你理解常见如阿里,和友商大数据平台的技术体系差异以及发展趋势和技术瓶颈,在存储和计算两个方面进行概述 在云计算大数据处理场景中,每天运行着成千上万的任务,每个任务都要进行 IO 读写。存储系统为了更好的服务,经常会保证高优先级的任务优先执行。当多个作业或用户访问存储系统时,如何保证优先级和公平性 最大频率栈 给定一个链表,删除链表的倒数第N个节点,并且返回链表的头结点 如果让你设计一个通用的、支持各种数据库秒级备份和恢复的系统,你会如何设计 如果让你来设计一个支持数据库、NOSQL 和大数据之间数据实时流动的数据流及处理的系统,你会考虑哪些问题?如何设计? 给定一个整数数组和一个整数,返回两个数组的索引,这两个索引指向的数字的加和等于指定的整数。需要最优的算法,分析算法的空间和时间复杂度26.假如给你一个新产品,你将从哪些方面来保障它的质量? 请评估一下程序的执行结果?欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。 腾讯面试题 Java基础 JAVA中的几种基本数据类型是什么,各自占用多少字节。 String类能被继承吗,为什么。3.String,Stringbuffer,StringBuilder的区别。 ArrayList和LinkedList有什么区别。 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。7.JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的。 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。 继承和聚合的区别在哪。 IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。 反射的原理,反射创建类实例的三种方式是什么。 反射中,Class.forName和ClassLoader区别 。14.描述动态代理的几种实现方式,分别说出相应的优缺点。 15.动态代理与cglib实现的区别。 为什么CGlib方式可以对接口实现代理。17.final的用途。 18.写出三种单例模式实现 。19.如何在父类中为子类自动完成所有的hashcode和equals实现?这么做有何优劣。 请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。 深拷贝和浅拷贝区别。22.数组和链表数据结构描述,各自的时间复杂度。 error和exception的区别,CheckedException,RuntimeException的区别。 请列出5个运行时异常。 在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么。 说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法。27.在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。 这样的a.hashcode() 有什么用,与a.equals(b)有什么关系。 有没有可能2个不相等的对象有相同的hashcode。 Java中的HashSet内部是如何工作的。31.什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。 java8的新特性。 JVM33.什么情况下会发生栈内存溢出。 JVM的内存结构,Eden和Survivor比例。 JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。36.JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数。 37.你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。 垃圾回收算法的实现原理。 当出现了内存溢出,你怎么排错。40.JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。 41.简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。 讲讲JAVA的反射机制。 你们线上应用的JVM参数有哪些。44.g1和cms区别,吞吐量优先和响应优先的垃圾收集器选择。 怎么打出线程栈信息。开源框架 简单讲讲tomcat结构,以及其类加载器流程,线程模型等。 tomcat如何调优,涉及哪些参数 。 讲讲Spring加载流程。 Spring AOP的实现原理。50.讲讲Spring事务的传播属性。 Spring如何管理事务的。 Spring怎么配置事务(具体说出一些关键的xml 元素)。 说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。 Springmvc 中DispatcherServlet初始化过程。 netty的线程模型,netty如何基于reactor模型上实现的。 为什么选择netty。 什么是TCP粘包,拆包。解决方式是什么。58.netty的fashwheeltimer的用法,实现原理,是否出现过调用不够准时,怎么解决。 netty的心跳处理在弱网下怎么办。 netty的通讯协议是什么样的。 springmvc用到的注解,作用是什么,原理。 springboot启动机制。操作系统 Linux系统下你关注过哪些内核参数,说说你知道的。 Linux下IO模型有几种,各自的含义是什么。 epoll和poll有什么区别。 平时用到哪些Linux命令。 用一行命令查看文件的最后五行。 用一行命令输出正在运行的java进程。 介绍下你理解的操作系统中线程切换过程。 进程和线程的区别。 top 命令之后有哪些内容,有什么作用。 线上CPU爆高,请问你如何找到问题所在。欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。 百度面试题 1.在函数内定义一个字符数组,用gets函数输入字符串的时候,如果输入越界,为什么程序会崩溃?2.C++中引用与指针的区别 C/C++程序的内存分区 快速排序的思想、时间复杂度、实现以及优化方法5.IO模型——IO多路复用机制? 常用的Linux命令 C中变量的存储类型有哪些? 动态规划的本质 实践中如何优化MySQL? 什么情况下设置了索引但无法使用? SQL语句的优化 数据库索引的底层实现原理和优化 HTTP和HTTPS的主要区别? 如何设计一个高并发的系统? 两条相交的单向链表,如何求他们的第一个公共节点? 求单向局部循环链表的环入口? IP地址如何在数据库中存储? new/delete和malloc/free的底层实现?19.overload、override、overwrite的介绍? 20.小端/大端机器? 守护进程 多线程的优缺点 长连接与短连接 二分图应用于最佳匹配问题(游客对房间的满意度之和最大问题) class与struct的区别? 虚函数和纯虚函数 menset()函数28.实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。 找到满足条件的数组 一个大的含有50M个URL的记录,一个小的含有500个URL的记录,找出两个记录里相同的URL31.海量日志数据,提取出某日访问百度次数最多的那个IP 有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。如何按照query的频度排序? 蚂蚁爬杆问题 当在浏览器中输入一个url后回车,后台发生了什么?比如输入url后,你看到了百度的首页,那么这一切是如何发生的呢? 判断两棵树是否相等,请实现两棵树是否相等的比较,相等返回1,否则返回其他值,并说明算法复杂度36.三个警察和三个囚徒的过河问题 从300万字符串中找到最热门的10条 如何找出字典中的兄弟单词。给定一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给定一个字典,用户输入一个单词,如何根据字典找出这个单词有多少个兄弟单词? 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。 找出被修改过的数字 设计DNS服务器中cache的数据结构。要求设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快。(题目还给出了一系列的数据,比如:站点数总共为5000万,IP地址有1000万,等等) 找出给定字符串对应的序号 找出第k大的数字所在的位置。写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。 给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中? 在一个文件中有10G个整数,乱序排列,要求找出中位数。内存限制为2G。 时分秒针在一天之类重合多少次?(24小时) 将多个集合合并成没有交集的集合。 平面内有11个点,由它们连成48条不同的直线,由这些点可连成多少个三角形? 今日头条面试题 1.个人去一个海岛寻宝,最后一共找到了100枚金币。他们约定了一个分配方案。 给你一个有序整数数组,数组中的数可以是正数、负数、零,请实现一个函数,这个函数返回一个整数:返回这个数组所有数的平方值中有多少种不同的取值。 一个环有10个节点,编号0-9。从0点出发,走N步又能回到0点,共有多少种走法? 一个乱序数组,求第K大的数。排序方式使用字典序。 一棵二叉树,求最大通路长度。(即最大左右子树高度之和) 进程和线程的区别,使用线程真的能节省时间? go协程的调度方式,使用协程真的能节省时间? 水平触发边沿触发的区别?在边沿触发下,一个socket有500的数据,已读取200然后不再处理,是不是剩下的300就永远无法读取?9.有函数如下,输入1,返回什么? 10 设计http协议,A端发送 AAAA,至少让B端知道AAAA已发送完成。 流量总入口为api_gateway,api_gateway挂了会导致全部挂挂,用什么机制增大可用性? mysql为什么要用b+树,不用平衡二叉树做索引结构? 创建数据库索引应该怎么考虑? 使用int 做primary key和使用string 有什么优劣? 数据库分表的方法? 表结构,订单纪录如下,写一个语句,求卖的最好的 top 10 product_id。 微服务,A服务请求B服务B1接口,B1接口又请求A服务A2接口。会不会有问题?18.不使用高级工具,只使用Linux自带的工具,你会如何debug? 如何预估一个mysql语句的性能?20.go函数中,返回值未命名,发生了panic,但是在函数内recover了。函数返回什么值? socket中,在tcp协议层面,数据分为10个报文发放。1-7次很顺利,第8次丢失。这次通信一定失败吗?如果第8次数据会重发,那在接收端是不是:先读取到1-7次的数据,然后读取到8-10次的数据?还是9-10次的数据会先到达? free -h,buffers 和cached有什么不同 后台进程有什么特点,如果要你设计一个进程是后台进程,你会考虑什么24.僵尸进程是什么,如果产生一个僵尸进程,如何查找僵尸进程 25.孤儿进程是什么26.一个进程有20个线程,在某个线程中调用fork,新的进程会有20个线程吗? tcp/ip 流量控制和拥塞控制 301/302有什么区别?应用上有什么异同。 50X相关错误码的内涵是什么? close wait和time wait是什么?如何排查?有什么意义? http req和resp的中数据有哪些 什么是连接的半打开,半关闭状态 假如一个业务依赖单点redis,此redis故障将导致业务不可用,如何改进 redis sharding有哪些做法 当大量数据要求用redis保存,单机单点难以满足需要,设计(换寻找)一个负载均衡的方案 当redis 采用hash做sharding,现在有8个节点,负载方案是 pos = hash(key) % 8,然后保存在pos节点上。这样做有什么好处坏处?当8个节点要扩充到10个节点,应该怎么办?有什么更方便扩充的方案吗?(一致性hash, presharding) 如何保证redis和数据库数据的一致性。比如用户名既保存在数据库,又保存在redis做缓存。有如下操作 update_db(username); update_redis(username)。但是执行update_db后故障,update_redis没有执行。有什么简单办法解决这个问题。

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

『功守道』软件供应链安全大赛·C源代码赛季启示录

背景 软件供应链安全,这可以说是一个新近的人造的概念热词。泛泛来讲,如今的软件系统中任何一方都不是孤立的;套用到企业的场景,就有了供应链的概念。 以典型互联网企业为例。线上生产环境所依赖的操所系统,配套的基础软件,是最基础设施,这方面RedHat、Linux的开源生态、Oracle等底层平台供应者是供应链上游,企业是下游;而每个企业都有大量的PC端、移动端等通过各式渠道分发的客户端软件,很多企业近些年开始有对开源界的贡献,这些软件、代码运行在终端设备上,这里企业是上游,客户是下游。类似的二元关系可以用来定义如今这个行业的所有链路。 没有一条链路,是我们能够自信完整掌控的;对此的隐忧,在之前或许只是杞人忧天,但如今却已真实来到面前。且看外部关注点,面对过去两年事件频发的看似独立的情况,在RSA上已经将软件供应链安全作为问题抛出。孤立的事件

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

阿里CTO首次披露芯片布局,“中国芯”换道超车的机会在这!

4月21日,阿里巴巴集团首席技术官张建锋接受媒体采访,首次详细披露阿里巴巴在芯片战略方面的长期布局与规划。 就在前一天的4月20日,阿里巴巴宣布全资收购中国大陆唯一的自主嵌入式CPU IP Core公司——中天微系统有限公司。 张建锋介绍,阿里巴巴四年前即开始布局芯片战略。2014年阿里首次投资中天微,2017年再次追投,到今年全资收购已是水到渠成。 CCTV“中国芯”报道 除了嵌入式芯片的中天微,在网络芯片、手机端芯片、IOT芯片等方面,阿里巴巴同样有一系列投资和部署。截至目前,阿里还投资了寒武纪、Barefoot Networks、深鉴、耐能(Kneron)、翱捷科技(ASR)等五家芯片公司。 同时,作为阿里IOT战略的重要部分,阿里巴巴达摩院已组建高级专业团队进行AI芯片的自主研发。 “阿里巴巴的IOT战略必须要做资源可控、技术可控、拥

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

一道百度机器学习工程师职位的面试题

题目:现在有 a 到 z 26 个元素, 编写程序打印 a 到 z 中任取 3 个元素的组合(比如 打印 a b c ,d y z等) 分析: 大家看看我这么做行不 char a, b, c; for(a = 'a'; a<='z'; a++) for(b= a+1; b<='z'; b++) for(c = b+1; c<='z'; c++) printf("%c%c%c\n", a, b, c); 问题1:不可能出现 bac等。因为每次我多加了 1 看看嵌套的 for 有什么不同,但是题目要求只求组合不管顺序。 问题2:如果你要这么做 ,面试官必然会问 ,如果我要求 4 个字母的组合呢?(一脸懵逼状=。=) 思路: 我设想 a - z 每个字母给一个标记 0 或 1 ,如果为 1 的时候表示这个字符在组合中 ,如果为 0 那么表示这个字符不在组合中。 这样子,我们需要 26 个标记位。 这个时候我们会发现 ,当所有变量都在组合中时, 那么就是 26 个 1;当一个变量都不在集组合中时,就是 26 个 0。 我们把 26 个 1 和 26 个 0 看成数字,那么就是 0 和 (1 << 26) - 1。 那么其它的组合,肯定是 0 到 (1 << 26) - 1 之间的数字,对吧 比如 cba 就是 ...0000000111 dcba 就是 ...00000000001111 所以说 我们做一个循环 从 0 开始 到(1 << 26) - 1 然后只取有 3 个 1 的数字 然后再看对应的 1 代表哪个字符就可以了 具体就要看程序了: #include <stdio.h> //某个数二进制位上有几个 1 int bit(unsigned int x) { int c = 0; while( x ) { c++; x = (x & (x - 1)); } return c; } void print(unsigned int x, int count) { int i = 0; //控制,假如count为3, x 里边有三个 1 if( bit(x) == count ) { for(i=0; i<26; i++) { if( x & 1) { printf("%c ", (char)('a' + i)); } x = (x >> 1); } printf("\n"); } } int main() { const unsigned int N = 26; const unsigned int C = 3; const unsigned int X = (1 << N) - 1; //X=(1<<26)-1 unsigned int i = 0; for(i=0; i<X; i++) { print(i, C); } return 0; } 这个解法真是666!#=,=

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

『千举万变,其道一也』教你一招玩转阿里云

前言 在开始正文之前,我们先看下面几个问题: 阿里云刚刚开放了新一个产品,还没有发布SDK,直接接入API签名逻辑太复杂了搞不定怎么办? 我们的应用非常轻量,但阿里云的SDK比较重(API请求/应答类非常多),有没有轻量的使用方法? 阿里云的XX产品刚刚开放了一个新的API,但SDK还没有更新怎么办? 以上所有问题的答案,都是:“用SDK的CommonRequest!” CommonRequest是什么? CommonRequest,是阿里云官方推出的、泛用型的OpenAPI调用接口,您可以使用CommonRequest,实现任意OpenAPI接口的调用,CommonReques有如下特点: 轻量:只需Core包即可发起调用,无需下载安装各产品线SDK。 简便:无需更新SDK即可调用最新发布的API。 泛用:只需传入OpenApi标识信息,就可以调用任意OpenApi。 CommonRequest支持哪些语种? CommonRequest是阿里云SDK核心包中的功能,也就是说,SDK支持哪些语种,CommonRequest就支持哪些语种。目前,可以支持的语种有:Java、Go、Python、C#、C++ 什么场景下,我该使用CommonRequest? 任何场景下,都可以使用CommonRequest,您可以自由选择调用方式。除了前言中提到的场景外,下列场景下,我们建议您选用CommonRequest: 平台开发,用户可能会调用任意一个Api,CommonRequest可以免去您反射SDK代码或穷举编写的麻烦。 经典用法下,SDK的请求/应答字段与实际不符时。当然这种场景下也希望您能将具体的情况反馈给我们。 我该如何使用CommonRequest? 阿里云SDK文档中,提供了详细的使用方法和示例代码,具体的链接如下: Java:https://help.aliyun.com/document_detail/61469.html Go:https://help.aliyun.com/document_detail/66221.html Python:https://help.aliyun.com/document_detail/61476.html C#:https://help.aliyun.com/document_detail/61473.html C++:https://help.aliyun.com/document_detail/65189.html CommonRequest的原理是什么? 简单来说,从代码结构上讲,各产品的SDK,其实是对CommonRequest的一种封装。 CommonRequest实现了所有阿里云 OpenApi的底层共用逻辑,例如:身份凭据维护、签名校验、域名路由等等,而特定的每个Api的请求与应答结构,则是基于CommonRequest的基础上,进行的开发/封装。 当然,"Talk is cheap, show me the code.",您可以直接在github上查看SDK以及CommonRequest的源码 Java:https://github.com/aliyun/aliyun-openapi-java-sdk Go:https://github.com/aliyun/alibaba-cloud-sdk-go Python:https://github.com/aliyun/aliyun-openapi-python-sdk C#:https://github.com/aliyun/aliyun-openapi-net-sdk C++:https://github.com/aliyun/aliyun-openapi-cpp-sdk

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

编程大神一道题带你搞定Python函数中形参和实参问题

昨天在Python学习群里有位路人甲问了个Python函数中关于形参和实参一个很基础的问题,虽然很基础,但是对于很多小白来说不一定简单,反而会被搞得稀里糊涂。人生苦短,我用Python。 为了解答大家的这个疑惑,小编在此举个栗子,希望大家能够彻底的理解实参和形参在Python中的用法。 首先,大家一起看个栗子。 不可更改的对象 这个函数的输出值是多少?很多人会回答7,其实程序运行之后,其答案是6,点解呢? 为什么在这里形参的数值并不改变实参的数值? 这里需要给大家普及一个Python中的基础,在python中,string(字符串), tuples(元组), 和number(数值)是不可更改的对象,而list(列表),dict(字典)等则是可以修改的对象。 也就是说,这里形参的数值对于外部的实参的数值(number类型,不可变)来说是没有任何关系的,他们虽然是同一个名字,但是其指向对象是不一样的。所以当在程序最后进行打印a输出值的时候,其输出仍然是6。 下面这个栗子我们来看看可变的对象,以list(列表)作为实验对象。 可更改的对象 这个函数的输出值是多少?很多人会回答[1,2],其实程序运行之后,其答案是[2,1]。 与第一个栗子刚刚相反,这里形参的数值调用把实参改变了。因为本例中参数传递的是列表,其是可更改的对象,在函数内部经过系列赋值变化之后,所以在程序运行之后其输出值产生了变化。 山重水复疑无路,柳暗花明又一村。这道题经常会被招聘公司和企业拿去作为面试题,考察面试狗的Python基础知识,希望大家好好参详,日后碰到类似的问题加以注意,少走弯路! 最后感谢在Python群中积极提问的好学者,然我们大家一起为学好Python而奋斗吧!

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册