常考八股文

常考

计算机网络

分层

分层类型:

七层:应、表、会、传输层、网络层、数据链路层、物理层

五层:

四层:应、传、网、网络接口层

各层作用:

应用层

  1. 功能:为用户提供网络服务

  2. 该层的协议:HTTP、FTP、SMTP、DNS

  3. 数据的形式:报文

传输层

  1. 功能:为两个主机中进程之间的通信提供数据传输服务

  2. 协议:tcp udp

  3. 设备:网关

  4. 数据形式:报文段

网络层

  1. 功能:选择合适的网间路由和交换节点,根据ip地址寻找mac地址

流量控制和拥塞控制的区别是:流量控制只是端端之间,只需要管理两个端之间的流量传输即可,也就是局部的。但是拥塞控制是全局的,是整个网络所做的事情,需要所有的路由器主机一起努力完成的事情。在传输层,既有流量控制也有拥塞控制。

HTTP和TCP的区别

  1. 应用层,传输层

  2. http协议是基于tcp协议

  3. http专注于要传输的信息,是信息的载体;tcp关注传输的可靠性

Java

Java容器

常用容器

  1. Collection

    List、Set、Queue(LinkedList, PriorityQueue)

  2. Map(HashMap, HashTable, ConcurrentHashMap)

HashMap

  1. 底层结构:一个entry数组+链表/红黑树,数组里面存放的是链表的头节点,每一个节点里面包含四个字段:hash值、key、value、Node<K, V> next。

  2. 往HashMap中添加数据时:先根据hash值通过哈希算法找到对应的数组下标,若对应数组下标处没有数据,则将该节点直接存入数组下标处;如果对应下标处有节点,则遍历该链表,用key的equals方法判断是否存在相同key的节点,如果发现存在相同key的节点,则将key相同的节点的value值改为要插入的value值;如果没有key相同的节点,那么就将要插入的数据插到链表的尾部。

  3. 取数据时:首先通过key求出hash值,再通过hash值找到数组下标,找到相应的链表,如果没有就返回null;如果找到了,就遍历链表,对链表的每个节点用equals方法判断是否存在对应key的节点,如果存在则返回该节点的value,如果不存在则返回null。

遍历集合的三种方式

for、foreach、iterator

JUC

Java锁

  1. 公平锁、非公平锁

  2. 可重入锁

  3. 自旋锁:尝试获取的线程不会立即阻塞,而是采用循环的方式不断区尝试获取锁,这样的好处是减少线程上下文切换带来的消耗,缺点是循环会消耗CPU

  4. 读写锁

Synchronized和Lock(ReentrantLock)的区别

  1. 二者都是可重入锁:(同)

    可重入锁的意思是,自己可以再次获取自己内部的锁。当一个线程获得了某个对象的锁,在锁释放之前,该线程可以再次获取该对象的锁,这样可以避免死锁。同一线程每次获取锁,锁的计数器+1。

  2. 底层实现上:synchronized依赖于JVM,是java关键字;而ReentrantLock依赖于API

  3. 是否手动释放:synchronized不需要手动释放锁,在执行完相应代码后会自动让线程释放对锁的占用;ReentrantLock则需要手动释放锁,一般通过lock()和unlock()结合try/finally语句块来完成,一般unlock是在finally中完成。

  4. 是否可中断:synchronized是不可中断类型的锁,正在等待的线程会一直等待下去,直到锁释放;ReentrantLock则可以中断,可以通过tryLock设置超时时间或者通过lock.lockInterruptibly()来实现这个机制,也就是说,正在等待的线程可以选择放弃等待,改为处理其他事情。

  5. 是否公平锁:synchronized为非公平锁,而ReentrantLock则可以指定公平锁还是非公平锁,默认是非公平;公平锁就是先等待的线程先获得锁。

  6. 锁是否可绑定条件Condition:synchronized不可绑定,只能通过wait()/notify()/notifyAll()方法要么随机唤醒一个线程,要么唤醒全部线程;而ReentrantLock可以通过结合Condition实现”选择性通知“,线程对象可以注册在指定的Conditon中,而Condition实例的signalAll()方法只会唤醒注册在该Condition实例中的所有等待线程。

i++线程安全问题

不安全,涉及到jmm

设计模式

工厂模式

解耦:将对象的创建和使用分离

可复用:对于创建过程比较复杂且在很多地方都使用到的对象,使用工厂模式可以提高对象创建代码的可复用性

便于管理:由于复杂对象通过工厂进行统一管理,所以只需要修改工厂内部的对象创建过程即可维护对象,从而达到降低成本的额目的

类型

简单工厂模式

工厂方法模式

抽象工厂模式

实现

以简单为例,造汽车,首先创建一个汽车接口,里面定义方法名;然后定义不同的类实现这个接口,并重写里面的方法,如aodi, bmw;接下来,创建汽车工厂,里面实现汽车的创建方法,根据传入的参数名来确定调用的是哪一种汽车的构造方法,并返回相应的对象。

package factory.simple;
​
import factory.model.Computer;
import factory.model.HuaweiComputer;
import factory.model.XiaomiComputer;
​
public class ComputerFactory {
​
​
    public Computer create(String type){
        if (type == null || type.length() == 0){
            return null;
        }
        if ("Huawei".equalsIgnoreCase(type)) {
            return new HuaweiComputer();
        } else if ("Xiaomi".equalsIgnoreCase(type)) {
            return new XiaomiComputer();
        }
        return null;
    }
}

数据库

redolog、undolog、binlog

redolog是InnoDB层面的,binlog是MySQL层面

redolog:mysql中数组是以页为单位,查一条数据时,会从硬盘把一整页数据加载进内存,后续的查询也是先去内存查,没查到再去硬盘,减少io;对于更新也是如此,如果发现内存中有需要更新的数据(如果没有则同上),那么就直接在内存中更新,然后将进行的修改操作写入redolog中。具体什么时候将redolog

binlog用于主从复制

undolog用于回滚,保证原子性

框架

Spring

IOC

(是什么,what)控制反转,将原本在程序中手动创建对象的控制权,交由Spring框架来管理。

(有什么用,why)将对象之间的相互依赖关系交给IOC容器来管理,并由IOC容器完成对象的注入,这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。

(怎么实现,how)IOC容器就像是一个工厂,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不需要考虑对象是如何被创建出来的。

bean的作用域(@Scope())

  1. singleton:单例模式,在IOC容器中只会存在一个bean实例,默认是创建容器时就自动创建该bean对象,也可以通过设置lazy-init="true",设置为懒加载。

  2. prototype:原型模式,懒加载,每次请求都会创建一个对象,不仅仅是http请求,还有将其注入到另一个bean中,或者直接调用getBean()方法都会创建一个新的实例。

  3. request:每一次http请求都会产生一个新的bean,该bean只在当前http request内有效,请求结束后,该bean的生命周期结束。只适用于web程序。

  4. session:在当前http session内有效,同一个会话的多个请求可以服用scope为session的bean实例。

  5. globalSession

单例bean的线程安全

https://www.jianshu.com/p/ed20bd1b11c2

Spring中单例Bean的线程安全问题采坑_软件开发随心记的博客-CSDN博客_spring 单例bean 线程安全问题

线程安全与否取决于是否有共享的资源竞争关系存在,即bean是有状态的还是无状态的,有状态指的是有数据存储功能,比如存储用户信息等全局变量,无状态就是无数据存储功能。

解决方法:1.尽量避免在bean中定义全局的成员变量(不太现实)

2. 使用threadlocal,将可变的成员变量保存在其内

@Component和@Bean的区别

  1. 作用对象不同,Component是作用于类,bean是作用于方法

bean的生命周期

Spring事务

Spring常用注解

  1. 将类声明为bean(注入ioc容器)

    • @Component:通用的注解

    • Service

    • Controller

    • Repository

  2. 注入bean的注解

  3. 配置类

    • Configuration;声明当前类为配置类

    • @ComponentScan :扫描设置的扫描路径,并自动将符合条件的组件注入到ioc容器中

  4. bean的属性:Scope

spring和springboot的区别

springboot是spring的扩展,使得开发、测试和部署更加方便

  1. 简化依赖:比如

  2. 简化配置:

  3. 简化部署

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python八股文是指对于算法工程师来说,在面试或考试中常被问到的一些Python知识点和面试题目总结。下面是一些常见的Python八股文知识点: 1. Python的内存管理以及垃圾回收机制:Python使用引用计数来管理内存,并通过垃圾回收机制来处理循环引用的情况。 2. Python中的pass有什么作用:pass是一个空语句,用于占位,不做任何操作。 3. Python的strip:strip函数用于去除字符串两端的空白字符。 4. Python多线程中的IO型操作:在Python中,由于全局解释器锁(GIL)的存在,多线程并不能真正实现并行执行。对于IO型操作,多线程可以提高效率。 5. Python如何进行数据类型转换:可以使用int()、float()、str()等函数进行数据类型转换。 6. Python中的单下划线_和双下划线__:单下划线_是一个惯例,表示一个私有属性或方法,双下划线__是用于名称修饰,以避免名称冲突。 7. Python中的self、cls、@staticmethod、@classmethod:self是指实例本身,cls是指类本身,@staticmethod表示静态方法,@classmethod表示类方法。 8. Python中的super函数:super函数用于调用父类的方法。 9. Python中的特殊方法(魔法函数):特殊方法是以双下划线开头和结尾的方法,用于实现对象的特殊行为,比如__init__()用于初始化对象。 10. Python中的\_\_new\_\_()和\_\_init\_\_()和\_\_call\_\_()[1:\_\_new\_\_()用于创建对象,\_\_init\_\_()用于初始化对象,\_\_call\_\_()用于使对象可调用。 11. UTF-8和GBK的区别:UTF-8是一种可变长度的Unicode编码,支持多种语言,而GBK是用于中文字符的编码。 12. Python中的zip()函数:zip函数用于将多个可迭代对象打包成一个元组的列表。 以上是一些常见的Python八股文知识点,掌握了这些知识可以帮助你在面试或考试中更好地回答相关问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [python 知识点/面试题目总结(八股文)算法工程师必备](https://blog.csdn.net/CSSDCC/article/details/127050797)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Python八股文](https://blog.csdn.net/weixin_43570470/article/details/127726404)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值