Java
JavaSE
Java GC
- 对象的创建和分配内存:当您在Java程序中创建对象时,Java虚拟机(JVM)会负责为对象分配内存空间。这个过程通常发生在堆内存中。
- 引用计数:Java不使用引用计数来跟踪对象的引用,而是使用基于可达性的垃圾回收算法。这意味着只有可以通过一系列有向引用到达的对象才被认为是可访问的。
- 垃圾对象识别:垃圾回收器会定期检查堆中的对象,查找不再可达的对象。不再可达的对象是不会被程序再次使用的对象。
- 回收垃圾对象:一旦垃圾回收器确定某个对象不再可达,它会将该对象标记为垃圾,并释放该对象所占用的内存。这个过程称为垃圾收集。
- 垃圾收集算法:Java有不同的垃圾收集算法,如标记-清除、复制、标记-整理等。这些算法决定了如何标记和清理垃圾对象。不同的算法适用于不同的场景和堆内存配置。
- 垃圾回收器:Java提供了不同类型的垃圾回收器,如Serial收集器、Parallel收集器、G1收集器和CMS收集器等,以满足不同应用程序的需求。开发人员可以根据应用程序性能需求选择不同的垃圾回收器。
- 内存管理:垃圾回收机制允许Java程序员专注于业务逻辑,而不必担心手动释放内存。但是,开发人员仍然需要注意避免内存泄漏,这是因为即使有垃圾回收,如果对象仍然被引用而无法被回收,内存也可能被耗尽。
Java 特性
- 跨平台性(Platform Independence):Java程序可以在不同的操作系统上运行,因为它是一种跨平台的语言。这是通过Java的"Write Once, Run Anywhere"(一次编写,到处运行)特性实现的,即一次编写的代码可以在任何支持Java的平台上运行,只要有对应的Java虚拟机(JVM)。
- 面向对象(Object-Oriented):Java是一种面向对象的编程语言,它支持面向对象编程原则,如封装、继承和多态。这有助于创建模块化和可维护的代码。
- 简单和易学(Simple and Easy to Learn):Java设计追求简单性,具有清晰的语法和丰富的标准库。这使得它相对容易学习和使用,尤其对于初学者来说。
- 安全性(Security):Java提供了多层次的安全性,包括字节码验证和安全管理器。这些机制有助于防止恶意代码对系统的破坏。
- 自动内存管理(Automatic Memory Management):Java具有垃圾回收机制,可以自动管理内存分配和释放,减少了内存泄漏和悬挂指针等常见错误的发生。
- 多线程支持(Multithreading Support):Java内置了多线程支持,使开发者能够轻松创建多线程应用程序,提高了并发性能。
- 强类型检查(Strongly Typed):Java是一种强类型语言,这意味着变量的类型必须在编译时明确定义,有助于减少类型错误。
- 其他特性: 大型生态系统(Large Ecosystem):Java拥有丰富的标准库和第三方库,可用于各种领域的应用开发,包括网络、数据库、图形用户界面(GUI)等。 开放源代码(Open Source):Java有一个强大的开发社区,提供了许多开源工具和框架,可以加速应用程序开发。 平台独立性(Architecture Neutral):Java的中间表示形式是字节码,这使得它在不同体系结构的计算机上运行时具有平台独立性。 动态性(Dynamic):Java具有一些动态编程特性,如反射,可以在运行时获取和操作类的信息。 网络支持(Networking Support):Java内置了丰富的网络库,支持网络通信和分布式应用程序的开发。
Java 为什么是单继承
- 减少复杂性:单继承可以减少编程语言的复杂性,使语言更容易学习和使用。多继承会引入复杂的继承图和潜在的歧义,因为一个类可以继承多个父类的属性和方法,这可能导致不确定性和难以排查的问题。
- 避免菱形继承问题:多继承可能导致菱形继承问题,也称为钻石问题。这种情况发生在一个类从两个不同的父类继承相同的方法或属性时,编译器难以确定应该使用哪个方法或属性。单继承可以消除这种歧义,因为每个子类只有一个直接的父类。
- 提高代码可读性:单继承使代码更易于理解。当一个类只有一个直接的父类时,你可以更容易地追踪类的行为和属性来源,而不需要考虑多个父类之间的交互。
- 促进接口的使用:为了弥补单继承的限制,Java引入了接口(interface)的概念,允许类实现多个接口。这样,类可以获得来自多个源头的行为,而不会引入多继承的复杂性问题。
- 维护灵活性:单继承使得类的继承关系更稳定,这有助于减少代码的脆弱性。如果一个类具有多个父类,当其中一个父类的实现发生变化时,可能会影响所有子类,这可能导致不可预测的结果。
Spring
介绍spring boot
Spring Boot是一个用于简化和加速Spring应用程序开发的开源框架。它是基于Spring框架的,但旨在更容易地创建独立的、生产级别的应用程序。以下是关于Spring Boot的简要介绍:
简化配置:Spring Boot通过自动配置(Auto-Configuration)来减少了传统Spring应用程序中的样板式配置。它可以自动检测并配置应用程序所需的各种组件,包括数据源、Web服务器、消息队列等。这样,开发人员可以专注于编写业务逻辑,而不必花费太多时间在配置上。
集成Spring框架:Spring Boot是构建在经典的Spring框架之上的,因此继承了Spring的强大功能,如依赖注入、面向切面编程(AOP)、事务管理等。它允许您使用Spring的各种模块,如Spring MVC、Spring Data、Spring Security等,以构建全功能的应用程序。
内嵌式Web服务器:Spring Boot内置了多个Web服务器,如Tomcat、Jetty和Undertow。这意味着您可以创建独立的可执行JAR文件或WAR文件,其中包含了您的应用程序和Web服务器,无需额外配置。
约定优于配置:Spring Boot遵循"约定优于配置"的原则,通过约定和默认设置来减少配置需求。这使得应用程序的结构更加清晰,并且开发人员可以快速了解项目的组织方式。
丰富的起步依赖(Starter Dependencies):Spring Boot提供了大量的起步依赖,这些依赖包含了常见场景下所需的库和配置。您可以通过引入适当的起步依赖,轻松地集成数据库、消息队列、安全性等功能。
自动化生产级别功能:Spring Boot为生产环境提供了各种功能,如性能监控、健康检查、安全性、日志记录等。这些功能使得应用程序容易部署和维护。
spring boot有哪些功能模块、操作数据库的模块是哪个
自动配置(Auto-Configuration):Spring Boot根据应用程序的依赖和类路径自动配置各种组件,如数据源、Web服务器、消息队列等,减少了繁琐的手动配置工作。
起步依赖(Starter Dependencies):Spring Boot提供了一系列预定义的起步依赖,它们包含了常见场景下所需的库和配置。开发人员可以轻松地引入这些依赖,以集成数据库、消息队列、安全性等功能。
Spring Boot AOP:支持面向切面编程(AOP)的模块,可以方便地实现横切关注点,如日志、性能监控等。
Spring Boot CLI:命令行界面工具,用于快速创建和运行Spring Boot应用程序。
Spring Boot Initializer:Web界面工具,用于生成Spring Boot项目的初始代码。您可以选择所需的项目配置和依赖,然后生成项目结构。
Spring Boot Web:包括Spring MVC和Spring Webflux,用于构建Web应用程序的模块。
内嵌式Web服务器:Spring Boot支持多个内嵌式Web服务器,包括Tomcat、Jetty和Undertow。这些服务器可以轻松地集成到应用程序中,无需额外的配置。
Spring Boot Actuator:提供了用于监控和管理应用程序的功能,包括健康检查、性能监控、日志记录和应用信息端点。
Spring Boot DevTools:开发工具,提供了自动重启应用程序、实时重新加载和其他开发辅助功能,加速开发周期。
Spring Boot Data:简化数据访问的模块,包括Spring Data JPA、Spring Data MongoDB、Spring Data Redis等,使得与数据库和其他数据存储的交互更加容易。
Spring Boot Security:用于身份验证和授权的安全性模块,可以轻松添加安全性功能到应用程序中。
Spring Boot Test:用于编写单元测试和集成测试的测试框架,提供了各种测试工具和注解。
Spring Boot Cloud:用于构建云原生应用程序的模块,包括服务注册与发现、负载均衡、配置管理等。
Spring Boot Batch:用于批处理处理的模块,简化了大数据量处理任务的开发。
Spring Boot Messaging:用于消息传递的模块,包括JMS和Apache Kafka的集成,支持异步消息处理。
Spring Boot Integration:用于与外部系统集成的模块,包括HTTP、FTP、AMQP等。
spring中应用到的设计模式是哪些
依赖注入模式(Dependency Injection):Spring最显著的设计模式之一。通过依赖注入,对象的依赖关系由容器负责管理,而不是在对象内部创建依赖对象。这有助于降低组件之间的耦合,提高代码的可测试性和可维护性。
工厂模式(Factory Pattern):Spring使用工厂模式来创建和管理对象。Bean工厂(如BeanFactory和ApplicationContext)负责创建和配置应用程序中的对象。这使得对象的创建过程可以集中管理,并且可以根据需要生成单例或原型对象。
单例模式(Singleton Pattern):Spring容器管理的默认范围是单例,因此它通过保持一个单一实例来确保应用程序中的某些对象只被创建一次。这有助于节省资源并提高性能。
模板模式(Template Pattern):Spring在JDBC、JMS等模块中使用模板模式。例如,JdbcTemplate为数据库操作提供了一个模板,开发者只需提供自己的回调方法,而模板处理了底层的操作,如连接管理和异常处理。
观察者模式(Observer Pattern):Spring的事件机制基于观察者模式。组件可以发布事件,而其他组件可以监听这些事件并在事件发生时做出响应。
策略模式(Strategy Pattern):Spring的DispatcherServlet使用策略模式来确定请求应该由哪个处理器来处理。开发者可以注册不同的处理策略,以处理不同类型的请求。
适配器模式(Adapter Pattern):Spring的AOP模块使用适配器模式来将切面织入到目标对象中。通过使用代理对象,AOP可以在目标方法执行前后添加额外的行为。
装饰者模式(Decorator Pattern):Spring的@Transactional注解和AOP代理可以视为装饰者模式的应用,它们在方法执行前后添加了事务管理的行为。
建造者模式(Builder Pattern):在Spring中,SpringApplicationBuilder用于创建Spring Boot应用程序的构建器。它提供了链式调用的方式来配置和构建应用程序。
八股
浏览器输入网址到看到结果的全过程
首先是解析url,然后进行缓存判断,判断请求的资源在不在缓存中,如果在缓存中且没有失效,就直接使用,否则就要向服务器发起请求。然后进行DNS解析,为了获得输入的url的ip地址。当获取到ip地址后,进行数据传输还需要使用ARP协议获取MAC地址,然后进行TCP连接,TCP3次握手,然后进行HTTPS握手,当页面请求发送到服务器端后,服务器返回一个HTML文件给客户端,然后浏览器渲染网页页面。
(1)解析URL: 首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。
(2)缓存判断: 浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求。
(3)DNS解析: 下一步首先需要获取的是输入的 URL 中的域名的 IP 地址,首先会判断本地是否有该域名的 IP 地址的缓存,如果有则使用,如果没有则向本地 DNS 服务器发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址后,再向顶级域名服务器请求,然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,最终获得域名的 IP 地址后,本地 DNS 服务器再将这个 IP 地址返回给请求的用户。用户向本地 DNS 服务器发起请求属于递归请求,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求。
(4)获取MAC地址: 当浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址,因为应用层下发数据给传输层,TCP 协议会指定源端口号和目的端口号,然后下发给网络层。网络层会将本机地址作为源地址,获取的 IP 地址作为目的地址。然后将下发给数据链路层,数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相与,可以判断是否与请求主机在同一个子网里,如果在同一个子网里,可以使用 APR 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。
(5)TCP三次握手: 下面是 TCP 建立连接的三次握手的过程,首先客户端向服务器发送一个 SYN 连接请求报文段和一个随机序号,服务端接收到请求后向服务器端发送一个 SYN ACK报文段,确认连接请求,并且也向客户端发送一个随机序号。客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。
(6)HTTPS握手: 如果使用的是 HTTPS 协议,在通信前还存在 TLS 的一个四次握手的过程。首先由客户端向服务器端发送使用的协议的版本号、一个随机数和可以使用的加密方法。服务器端收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用证书中的公钥对随机数加密,然后发送给服务器端,并且还会提供一个前面所有内容的 hash 值供服务器端检验。服务器端接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的 hash 值供客户端检验。这个时候双方都有了三个随机数,按照之前所约定的加密方法,使用这三个随机数生成一把秘钥,以后双方通信前,就使用这个秘钥对数据进行加密后再传输。
(7)返回数据: 当页面请求发送到服务器端后,服务器端会返回一个 html 文件作为响应,浏览器接收到响应后,开始对 html 文件进行解析,开始页面的渲染过程。
(8)页面渲染: 浏览器首先会根据 html 文件构建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,要不然 script 的加载和执行会造成页面的渲染的阻塞。当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制。这个时候整个页面就显示出来了。
(9)TCP四次挥手: 最后一步是 TCP 断开连接的四次挥手过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态。
DNS执行过程
先看浏览器缓存中有没有ip地址,然后请求本地DNS服务器,本地DNS服务器查看自己的缓存中有没有,如果没有,本地DNS服务器向根域名服务器请求,根域名服务器会返回所查询的顶级域名服务器的地址,然后本地DNS服务器向顶级域名服务器发送请求,顶级域名服务器查询自己的缓存,如果有记录就返回结果给本地DNS服务器,如果没有就返回下一级权威域名服务器地址给本地DNS服务器。然后本地DNS服务器向权威域名服务器发起请求,权威域名服务器返回对应的结果,本地DNS服务器将返回结果返回给浏览器
- 首先会在浏览器的缓存中查找对应的IP地址,如果查找到直接返回,若找不到继续下一步
- 将请求发送给本地DNS服务器,在本地域名服务器缓存中查询,如果查找到,就直接将查找结果返回,若找不到继续下一步
- 本地DNS服务器向根域名服务器发送请求,根域名服务器会返回一个所查询域的顶级域名服务器地址
- 本地DNS服务器向顶级域名服务器发送请求,接受请求的服务器查询自己的缓存,如果有记录,就返回查询结果,如果没有就返回相关的下一级的权威域名服务器的地址
- 本地DNS服务器向权威域名服务器发送请求,域名服务器返回对应的结果
- 本地DNS服务器将返回结果保存在缓存中,便于下次使用
- 本地DNS服务器将返回结果返回给浏览器
OSI七层模型介绍,各层作用
物理层(Physical Layer):
主要功能:处理物理媒介传输数据的细节。
作用:负责在物理媒介上传输原始比特流,包括电压、电流、光信号等。它定义了物理连接的特性,如电缆类型、传输速率和信号编码。
数据链路层(Data Link Layer):
主要功能:在直接连接的两个设备之间提供可靠的数据传输。
作用:将物理层提供的比特流分组成数据帧,并负责数据的错误检测和纠正。它还管理访问共享介质的方式,通常使用MAC地址来唯一标识设备。
网络层(Network Layer):
主要功能:实现数据包的路由和转发,为数据在不同网络之间的传输提供路径。
作用:负责逻辑寻址、数据包的路由选择和跨网络的数据传输。IP协议是网络层的代表。
传输层(Transport Layer):
主要功能:为端到端通信提供可靠的数据传输。
作用:负责数据的分段、错误检测和纠正,以及流量控制和拥塞控制。TCP(传输控制协议)和UDP(用户数据报协议)是传输层的代表。
会话层(Session Layer):
主要功能:建立、管理和终止会话(通信会话)。
作用:负责建立应用程序之间的会话,处理会话过程中的同步和控制。通常用于实现不同应用程序之间的数据交互。
表示层(Presentation Layer):
主要功能:数据格式转换、数据加密和解密。
作用:负责数据的编码、压缩、解码和解压缩,以确保数据在不同系统之间的兼容性。它还可以提供数据的安全性和加密。
应用层(Application Layer):
主要功能:为用户应用程序提供网络服务。
作用:这是用户与网络互动的层,提供各种应用和服务,如电子邮件、文件传输、远程登录、网页浏览等。应用层协议定义了应用程序之间的通信规则和数据格式。
OSI七层模型的优势在于将网络通信分解为更小的部分,使不同的协议和技术能够更容易地集成和协同工作。然而,在实际网络中,通常使用更简化的模型,如TCP/IP模型,它将OSI模型的七层合并为四个更大的层次。这种模型更符合实际应用,但OSI模型仍然是学习网络基础知识的有用框架。
**## TCP三次握手四次挥手
三次握手**:
首先是客户端向服务器发送一个SYN标志位为1,初始序号seq=x的数据包,服务器收到之后,进行确认,同样然后发送一个SYN标志位为1,ACK标志位为1,确认号ack为x 1,初始序号为seq=y的数据包,然后客户端收到服务器的响应之后,向服务器发送一个ACK标志为1,ack确认号为y 1,同时序列号为x 1的数据包,此时可以携带数据。这样三次握手就完成了。
四次挥手:
客户端首先发送一个FIN标志位为1的数据包给服务器,表示自己要结束连接了,然后进入fin_wait_1状态,然后服务端返回ACK标志位的数据包,确认收到了对方的关闭请求,然后进入closewait状态。这是服务器还可以向客户端发送数据。当服务器也要结束连接的时候,它也向客户端发送一个FIN标志位为1的数据包,表示自己数据发送完了,要结束连接,然后进入lsat_ack状态,然后客户端接收到后发送一个ACK标志位的数据包,确认收到了请求,然后服务器进入time wait状态,等待两倍的报文段寿命,然后关闭链接。同时客户端也从fin wait 1状态变为time wait状态,等待一段时间后,关闭连接。
第一次握手(SYN):
客户端向服务器发送一个特殊的TCP数据包,其中包含SYN(同步)标志位,以请求建立连接。
此时,客户端选择一个随机的序列号(Client ISN),用于标识客户端发送的数据包。
- 同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号
第二次握手(SYN-ACK):
服务器接收到客户端的请求后,确认并同样发送一个带有SYN标志位的数据包,以及ACK(确认)标志位,表示接收到了客户端的请求。
服务器也会选择一个随机的序列号(Server ISN),用于标识服务器发送的数据包。
此时,服务器会为客户端分配资源,并准备接收客户端发送的数据。
- 确认报文段中SYN=1,ACK=1,确认号ack=x 1,初始序号seq=y
第三次握手(ACK):
客户端接收到服务器的响应后,向服务器发送一个带有ACK标志位的数据包,表示确认了服务器的响应。同时,客户端还会将之前选择的序列号加1,作为客户端数据包的序列号。
服务器接收到这个确认后,也将客户端的序列号加1,表示已准备好接收客户端的数据。
- 确认报文段ACK=1,确认号ack=y 1,序号seq=x 1(初始为seq=x,第二个报文段所以要 1),ACK报文段可以携带数据,不携带数据则不消耗序号
至此,TCP三次握手完成,连接建立成功。此后,客户端和服务器之间可以开始进行双向通信。三次握手的目的是确保双方都已准备好通信,同时在连接建立之前进行双方的序列号同步,以确保数据包按顺序传递且不会被重复接收。如果在握手过程中有任何一方未能收到确认,它将重新发送请求,直到连接建立成功或达到最大尝试次数。这样可以提高连接的可靠性和稳定性。
为什么不能是两次握手:
如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源
四次挥手
第一次挥手(FIN):
客户端或服务器中的一方(通常是客户端)决定不再向对方发送数据,并发送一个带有FIN(结束)标志位的TCP数据包,以表示它的数据发送完毕。
这一方的数据发送完成后,进入FIN_WAIT_1状态,等待对方的确认。
第二次挥手(ACK):
接收到第一次挥手的一方接着发送一个ACK(确认)标志位的数据包,以确认收到了对方的结束请求。
在这个阶段,接收到第一次挥手的一方仍可以向对方发送数据,进入CLOSE_WAIT状态。
第三次挥手(FIN):
当接收到第一次挥手的一方确定不再向对方发送数据时,它也会发送一个带有FIN标志位的数据包,以表示它的数据发送完毕。
然后,它进入LAST_ACK状态,等待对方的确认。
第四次挥手(ACK):
最后,接收到第三次挥手的一方发送一个ACK标志位的数据包,以确认收到了对方的结束请求。
接收到第四次挥手的一方进入TIME_WAIT状态,等待一段时间(通常为2倍的最大报文段寿命,以确保所有可能的数据包都已传递完毕),然后关闭连接。
同时,发送第一次挥手的一方从FIN_WAIT_1状态进入TIME_WAIT状态,也等待一段时间后关闭连接。
TCP 使用四次挥手的原因是因为 TCP 的连接是全双工的,所以需要双方分别释放到对方的连接,单独一方的连接释放,只代表不能再向对方发送数据,连接处于的是半释放的状态。
最后一次挥手中,客户端会等待一段时间再关闭的原因,是为了防止发送给服务器的确认报文段丢失或者出错,从而导致服务器 端不能正常关闭
http,https区别
安全性:
HTTP:HTTP是不安全的协议,传输的数据是明文的,容易受到窃听和中间人攻击的威胁。这意味着在HTTP连接上传输的敏感信息(如用户名和密码、信用卡号)可能会被恶意用户截获。
HTTPS:HTTPS通过使用SSL/TLS协议对数据进行加密,以确保传输的数据是加密的。这使得数据更难以被窃听和篡改,提供了更高的安全性。HTTPS通常用于安全交易、登录和敏感数据传输的场景。
加密方式:
HTTP:HTTP不提供数据加密机制,数据以明文形式传输。
HTTPS:HTTPS使用SSL/TLS加密协议来对数据进行加密和解密。这种加密可以使用不同的加密算法,包括RSA、AES等,以确保数据的隐私和完整性。
端口号:
HTTP:HTTP默认使用端口80进行通信。
HTTPS:HTTPS默认使用端口443进行通信。当您在浏览器中访问一个HTTPS网站时,浏览器会自动连接到443端口。
证书认证:
HTTP:HTTP不涉及服务器身份验证,因此不提供任何方式来验证您连接的服务器是否是您预期的服务器。
HTTPS:HTTPS使用数字证书来验证服务器的身份。这些证书由受信任的证书颁发机构(CA)签发,可以确保您连接的服务器是合法的,从而防止中间人攻击。
性能:
HTTP:由于不涉及加密和证书验证等额外的过程,HTTP通常比HTTPS更快,因此在某些场景下,如静态内容传输,HTTP可能更适合。
HTTPS:HTTPS的数据加密和证书验证会增加一些处理开销,可能导致轻微的性能损失。但是,随着硬件和协议优化的进步,这种性能差距在很大程度上被减小。
HTTP和HTTPS之间的主要区别在于安全性和数据加密。HTTPS用于需要保护敏感信息的情况,例如在线支付、登录和个人信息传输。而HTTP通常用于不涉及敏感数据的一般数据传输。在选择使用哪种协议时,需要根据应用程序的需求和安全性要求做出权衡。
进程和线程区别
从本质上说,进程和线程都是 CPU 工作时间片的一个描述:
进程描述了 CPU 在运行指令及加载和保存上下文所需的时间,放在应用上来说就代表了一个程序。
线程是进程中的更小单位,描述了执行一段指令所需的时间。
一个进程就是一个程序的运行实例。详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。
进程和线程之间的关系:
出错:进程中的任意一线程执行出错,都会导致整个进程的崩溃
通信:线程之间共享同一进程中的数据,而进程通信需要借助 进程间通信
资源:进程是资源分配的最小单位,线程是CPU调度的最小单位。
调度:进程切换比线程切换的开销要大。线程是CPU调度的基本单位,线程的切换不会引起进程切换,但某个进程中的线程切换到另一个进程中的线程时,会引起进程切换
cookie和session
存储位置:
Cookie:Cookie是存储在客户端(用户浏览器)的小型文本文件。每次请求都会将Cookie发送到服务器,从而在客户端和服务器之间传递数据。
Session:Session是存储在服务器端的数据对象。每个会话都有一个唯一的标识符(通常是一个会话ID),该标识符存储在Cookie中或通过URL重写传递给客户端,以便将来的请求可以与正确的会话关联。
数据类型:
Cookie:Cookie只能存储文本数据,通常用于存储小量的用户信息,如用户ID、首选语言或会话令牌。
Session:Session可以存储各种数据类型,包括对象和复杂数据结构。因此,它更适合存储较大或复杂的数据,如购物车内容或用户登录状态。
存储容量:
Cookie:每个Cookie通常限制在4KB左右的存储容量。因此,Cookie适用于小量数据。
Session:服务器上的Session对象通常可以存储更大的数据,取决于服务器的配置。这使得它适合存储大量或复杂的数据。
安全性:
Cookie:Cookie存储在客户端,因此可能受到一些安全风险,如Cookie被窃取或篡改。可以通过设置Cookie的属性来增加安全性,如将Cookie标记为HTTP Only,以防止客户端脚本访问它。
Session:Session存储在服务器上,因此通常更安全。但是,仍然需要注意会话劫持和会话固定等攻击。
生命周期:
Cookie:Cookie可以具有不同的生命周期,可以在浏览器会话期间保持,也可以在过期之前持久保存。这由设置Cookie时的属性决定。
Session:Session通常在客户端关闭时结束(会话结束)。但是,也可以配置为在一段时间内保持活动状态,即使客户端关闭。
服务器负担:
Cookie:由于每次请求都会带有Cookie数据,因此它可能会增加服务器的负载,尤其是在大量并发请求的情况下。
Session:Session数据存储在服务器上,客户端只包含一个标识符。因此,Session对服务器的负载影响较小。
综上所述,Cookie和Session都有各自的用途和优势。Cookie适用于小型文本数据和客户端状态管理,而Session适用于存储更大、更复杂的数据和服务器端状态管理。选择哪种机制取决于应用程序的需求和安全性考虑。通常,在Web应用程序中,Cookie和Session经常一起使用,以实现不同层次的状态管理
算法
快排算法
分治思想
选择基准元素:从待排序的数组中选择一个元素作为基准元素。通常选择第一个元素、最后一个元素或者随机选择一个元素作为基准元素。
分割:将数组中的其他元素按照与基准元素的大小关系划分为两个子数组,一个子数组中的元素都小于基准元素,另一个子数组中的元素都大于基准元素。基准元素被放置在最终排序的位置上。
递归排序:对划分后的两个子数组分别进行快速排序。递归地重复上述过程,直到子数组的大小为1或0,因为这些子数组已经是有序的。
代码语言:javascript复制private static void quickSortHelper(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int pivotIndex = partition(arr, left, right);
quickSortHelper(arr, left, pivotIndex - 1);
quickSortHelper(arr, pivotIndex 1, right);
}
private static int partition(int[] arr, int left, int right) {
int pivot = arr[right];
int i = left - 1;
for (int j = left; j < right; j ) {
if (arr[j] < pivot) {
i ;
swap(arr, i, j);
}
}
swap(arr, i 1, right);
return i 1;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
冒泡算法
各个排序算法怎么实现
测试方面
白盒黑盒测试说一下,分别是怎样
白盒测试(White Box Testing):
定义:白盒测试也被称为结构测试或透明盒测试。在白盒测试中,测试者具有详细的了解被测试软件的内部结构、算法和代码。测试者可以看到源代码,并根据这些知识来设计和执行测试用例。
关注点:白盒测试侧重于验证程序的内部逻辑、路径覆盖、代码执行情况和错误处理。测试者通常关注代码的每个分支、每个语句和每个函数,以确保所有可能的路径都被测试到。
优点:白盒测试可以发现代码级别的错误和缺陷,有助于提高代码的质量和可维护性。
缺点:白盒测试通常需要测试者具备编程和源代码分析的技能,且测试范围受限于源代码的可见性。
黑盒测试(Black Box Testing):
定义:黑盒测试是一种功能性测试方法,测试者不需要了解被测试软件的内部结构或源代码。测试者将软件视为一个黑盒,只关注输入和输出之间的关系。
关注点:黑盒测试侧重于验证软件是否符合规格、需求和功能规范。测试者不考虑程序的内部实现细节,而是根据规格和需求来设计测试用例。
优点:黑盒测试不需要了解内部代码,因此可以由测试人员、领域专家和非技术人员来执行。它侧重于用户视角,能够捕捉到用户体验相关的问题。
缺点:黑盒测试可能无法发现代码级别的错误和缺陷,例如逻辑错误、性能问题和内存泄漏。
主要区别总结如下:
知识要求:白盒测试需要具备源代码和内部结构的知识,而黑盒测试不需要。
关注点:白盒测试关注内部逻辑和代码覆盖,黑盒测试关注功能、需求和用户界面。
执行者:白盒测试通常由开发人员或专业测试人员执行,黑盒测试可以由多种角色执行,包括测试人员、领域专家和最终用户。
测试层次:白盒测试常用于单元测试和集成测试,黑盒测试通常用于功能测试、验收测试和系统测试。
在实际软件开发中,通常会同时使用白盒测试和黑盒测试,以确保软件在多个方面的质量和可靠性。这两种测试方法相辅相成,有助于全面评估软件的质量。
单元测试
单元测试是软件开发中的一种测试方法,用于验证代码中的最小可测试单元(通常是函数、方法或类的某个特定功能)是否按照预期工作。单元测试旨在隔离和测试代码的不同部分,以确保它们在单独测试时都能正常运行
具有以下特性:
独立性:单元测试应该是相互独立的,不依赖于其他单元测试的执行结果
自动化:单元测试通常是自动化执行的
粒度小:单元测试的目标是测试最小的代码单元
支持重构:单元测试在重构代码时起到关键作用
单元测试通常使用测试框架(例如JUnit、pytest、unittest等)编写和运行。开发人员编写一系列测试用例,每个测试用例包括输入数据、预期输出以及断言(验证代码的实际输出是否与预期输出一致)。通过执行这些测试用例,开发人员可以验证代码的正确性,并在发现问题时快速定位和修复
自动化测试
自动化测试是一种软件测试方法,它使用自动化工具和脚本来执行测试用例,比手动测试更加高效和可重复。自动化测试的目标是在软件开发过程中自动执行测试任务,以确保应用程序在不同情况下(例如不同的输入、配置或操作系统)仍能够按预期工作。
测试用例自动化:自动化测试的核心是将测试用例转化为可执行的脚本或程序,这些脚本可以模拟用户的操作、输入数据,然后验证应用程序的响应是否符合预期。
测试自动化工具:为了执行自动化测试,通常需要使用测试自动化工具。这些工具提供了一种执行测试脚本、生成测试报告、管理测试用例等功能。
持续集成和持续交付(CI/CD):自动化测试通常与CI/CD流程结合使用,以便在每次代码提交或部署过程中自动运行测试。这有助于及早发现问题并提高交付速度。
自动化测试的工具有哪些
- 单元测试工具: JUnit: 用于Java应用程序的单元测试,特别适用于测试Java代码。
- 功能测试工具: Selenium: 用于Web应用程序的自动化测试,支持多种浏览器和编程语言。
- 集成测试工具: Postman: 用于API测试和集成测试的工具,支持创建和执行HTTP请求。
- 性能测试工具: Apache JMeter: 用于性能和负载测试的工具,可模拟多种协议和场景。
- 自动化测试框架: Robot Framework: 一个通用的自动化测试框架,支持Web、移动、API等多种测试类型。 TestNG: 用于Java应用程序的测试框架,支持测试套件的组织和并发执行。
接触过什么类型的测试
如何设计测试用例、自动化测试用例
针对一个接口如何设计等价类
理解接口功能:首先,你需要充分理解接口的功能和要求。这包括了接口的输入参数、输出结果以及接口的预期行为和边界条件。
确定输入数据的特性:根据接口的输入参数,确定可能影响接口行为的不同特性,如数据类型、范围、格式、有效性等。这些特性将成为等价类的依据。
划分等价类:将输入数据的不同特性结合起来,划分出不同的等价类。等价类是指在测试中具有相同行为和期望结果的一组输入数据。
正常等价类:包含了符合接口要求的有效输入数据,预期输出结果应该是符合预期的。
边界等价类:包含了接近边界值的输入数据,这些数据可能导致接口行为的变化,需要特别关注。
异常等价类:包含了不符合接口要求的无效输入数据,预期输出结果应该是错误或异常的。
选择代表性测试用例:从每个等价类中选择代表性的测试用例,以覆盖不同的场景和输入组合。确保每个等价类至少有一个测试用例进行测试。
对于正常等价类,选择具有典型特征的输入数据。
对于边界等价类,选择接近边界值的输入数据,包括边界值本身和边界值的邻近值。
对于异常等价类,选择能够触发异常行为的无效输入数据。
补充边界条件和特殊情况:除了等价类,还需要考虑边界条件和特殊情况。例如,输入参数的最小值、最大值、空值、重复值等情况,以及可能的异常处理和错误提示。
设计附加测试用例:根据具体的需求和场景,设计其他的测试用例来覆盖更多的情况。这些测试用例可以是特殊情况、边界情况、性能测试等。
测试案例
1. 在下单的时候,会拉起收银台,会有展示方式,有优惠券,金额展示,有确认支付按钮,现在有需求,验证满300减20 这个优惠券是否可以正确使用,介绍一下测试思路,测试方案
验证优惠券逻辑:
确保在订单满足300元以上时,优惠券可以被正确识别和应用。
验证在订单金额低于300元时,优惠券不能被应用。
验证在订单金额等于或超过300元时,优惠券可以被应用,并且订单金额会减去优惠金额。
边界值测试:
针对订单金额等于300元的情况,验证优惠券是否能够正确应用,并且订单金额减去优惠金额后为280元。
针对订单金额超过300元的情况,验证优惠券是否能够正确应用,并且订单金额减去优惠金额后是否符合预期结果。
多优惠券组合测试:
验证在同时使用满300减20优惠券和其他优惠券的情况下,系统是否能够正确计算订单金额,并生成正确的优惠后金额。
异常情况测试:
验证在输入无效优惠码或已过期的优惠券时,系统是否能够正确处理,并给出相应的错误提示。
验证在订单金额已满足条件的情况下,但未正确应用优惠券的情况下,系统是否能够正确处理,并给出相应的错误提示。
兼容性测试:
验证在不同操作系统和浏览器环境下,优惠券的展示和使用是否一致且正常工作。
性能测试:
针对使用优惠券的场景,进行大量并发用户下单的测试,验证系统在高负载情况下仍然能够正确处理优惠券的使用,并且保持稳定性和性能。
回归测试:
验证在系统升级或修改后,满300减20优惠券的使用功能是否仍然正常工作,并与之前的预期结果进行比对。
假如给你测试微信红包你用哪些方法哪些思路去解决?
功能测试:
验证红包发送功能:确保用户可以成功发送红包,并验证接收者是否能够正确收到红包。
验证红包接收功能:验证接收者是否能够成功领取红包,并确保金额和发送者的要求一致。
验证红包过期功能:测试红包的有效期限是否能够正确处理,确保过期的红包不能被领取。
边界值测试:
针对红包金额的边界值进行测试,如发送和接收0元红包、发送和接收最大金额的红包等。
验证红包个数的边界值,如发送和接收最大个数的红包是否能够正常处理。
异常情况测试:
验证在发送红包时输入无效金额或负数金额时,系统是否能够正确处理并给出相应的错误提示。
验证在接收红包时出现网络中断或其他异常情况时,系统是否能够正确处理并保证红包的安全性和一致性。
并发性能测试:
在高并发情况下,模拟多个用户同时发送和领取红包,并验证系统的性能和稳定性。
测试在大量红包发送和领取的情况下,系统是否能够正常处理,并保持良好的响应时间和并发能力。
兼容性测试:
验证在不同版本的微信客户端和操作系统上,红包功能是否一致且正常工作。
确保红包功能在不同设备和网络环境下的兼容性,如手机、平板、Wi-Fi和移动数据网络等。
安全性测试:
验证红包功能的安全性,防止恶意用户进行红包欺诈或非法操作。
确保用户的个人信息和红包金额的安全性,防止信息泄露或被篡改。
回归测试:
验证在系统更新、修复和升级后,红包功能是否仍然正常工作,并与之前的预期结果进行比对。
知名电商京东淘宝,怎么样测试用户的购物车
基本功能测试:
验证添加商品到购物车功能:确保用户可以成功将商品添加到购物车,并验证购物车中的商品数量和信息是否正确。
验证从购物车删除商品功能:验证用户可以成功从购物车中删除商品,并验证购物车中的商品数量和信息是否正确。
验证修改购物车中商品数量功能:测试用户可以更改购物车中商品的数量,并验证购物车中的商品数量和金额是否正确。
边界值测试:
针对购物车中商品数量的边界值进行测试,如购物车为空、购物车中只有一个商品、购物车中有最大数量的商品等情况。
针对商品数量的边界值进行测试,如商品数量为0、商品数量超过库存量等情况。
异常情况测试:
验证在添加商品到购物车时,处理无效商品ID或商品不存在的情况,确保系统能够给出正确的错误提示。
验证在修改购物车中商品数量时,处理无效数量、非法字符或超出库存范围的情况,确保系统能够正确处理并给出相应的提示。
购物车结算测试:
验证用户从购物车进入结算流程的功能,确保用户可以顺利跳转到支付页面,并显示正确的商品信息和总金额。
测试不同支付方式的兼容性,如信用卡、支付宝、微信支付等,确保用户可以选择并成功完成支付操作。
兼容性测试:
验证购物车功能在不同浏览器和操作系统上的兼容性,如Chrome、Firefox、Safari、Windows、iOS、Android等。
确保购物车功能在不同设备上的兼容性,如手机、平板、电脑等。
性能测试:
在大量用户同时操作购物车的情况下,测试系统的性能和稳定性,确保购物车功能能够处理高并发情况并保持良好的响应时间。
回归测试:
验证在系统升级、修复或修改后,购物车功能是否仍然正常工作并与之前的预期结果一致。
电梯测试用例设计
功能测试:
验证电梯的基本功能,包括楼层选择、开关门、运行状态等。
确保电梯能够根据乘客选择的楼层,准确地到达目标楼层,并开启或关闭门。
验证电梯在不同楼层之间的切换是否流畅、准确。
验证紧急按钮是否有效,能够停止电梯并呼叫救援。
边界值测试:
针对电梯的最大承载量进行测试,确保电梯能够正确处理超载情况,并给出相应的警报或限制。
验证电梯在最高楼层和最低楼层之间的运行情况,确保电梯能够正确停止或切换方向。
验证电梯在不同楼层之间的切换时间是否在合理范围内。
安全性测试:
验证电梯的安全装置是否正常工作,如防止电梯门夹人的安全光幕、紧急停止按钮等。
测试电梯在突发情况下的应对能力,如停电、火灾等,确保电梯能够安全地停在最近的楼层并打开门。
兼容性测试:
验证电梯的兼容性,包括不同型号或制造商的电梯控制系统之间的互操作性。
确保电梯的界面和按钮在不同语言或文化环境下的可用性和易用性。
可靠性和稳定性测试:
在长时间运行的情况下,测试电梯系统的稳定性和可靠性,确保电梯能够持续正常工作而不出现故障或异常情况。
模拟高负载情况下的并发使用,测试电梯系统的性能和稳定性。
用户体验测试:
通过模拟真实用户场景,测试电梯的操作界面、指示灯、声音等是否符合用户习惯和期望。
确保电梯的指示系统和提示信息清晰易懂,能够为用户提供正确的信息和引导。
Mysql
Mysql的查询优化
优化查询语句:编写高效的查询语句是提升查询性能的关键。确保查询语句使用正确的索引,避免全表扫描和不必要的数据检索。使用适当的JOIN操作和WHERE条件来限制返回的数据集大小。避免在查询中使用大量的通配符(如%),因为它们会导致索引失效。
创建索引:索引是提高查询性能的重要因素。通过创建适当的索引,可以减少数据库的扫描量,加快查询速度。需要根据查询语句的特点和数据访问模式来选择合适的索引类型(如B-Tree索引、哈希索引、全文索引等)。同时,避免创建过多的索引,因为它们会增加写操作的开销并占用存储空间。
分析和优化数据模型:合理的数据模型设计可以提高查询性能。通过正确地划分表和字段,避免冗余和重复数据,优化关联关系,可以减少数据的读取和处理工作量。设计良好的数据模型可以使查询更加简洁和高效。
使用合适的数据类型:选择合适的数据类型可以减少存储空间和内存使用,并提高查询性能。对于数值型数据,选择合适的整数类型和浮点数类型。对于字符型数据,根据实际需要选择合适的字符集和长度。
配置合理的缓存和缓冲区:MySQL提供了多种缓存和缓冲区参数的配置选项。适当地配置查询缓存、查询缓冲区、排序缓冲区和连接池等参数,可以减少磁盘IO和网络开销,提高查询性能。
使用分区表和分布式架构:对于大型数据库,可以考虑使用分区表和分布式架构来提高查询性能。通过将数据划分为多个分区,可以并行处理查询操作。使用分布式架构可以将负载分散到多个节点,提高并发性和可扩展性。
定期优化和维护:定期进行数据库的优化和维护工作是保持查询性能的重要步骤。包括优化表结构、重新分析和重建索引、清理无用数据、定期收集统计信息等操作。定期监控数据库性能,并根据需求进行调整和优化
sql 删除重复电子邮箱
sql:修改成绩,分组查询avg
mysql什么引擎
in-no db
Linux
Linux命令:,,文件查找字符串
一个文件追加到另一个文件: cat source.txt >> destination.txt
文件重命名:mv old_name.txt new_name.txt
文件查找字符串:grep "要查找的字符串" 文件名
linux 动态查看a/b 目录下test.log中error和condition的两行
tail -f a/b/test.log | grep -e "error" -e "condition" -C 1