当前位置: 首页 > news >正文

服务端开发Java面试复盘篇1

上周投了一些简历,约了8-9家面试,其中完成了3家的第一轮面试,由于面试的是Java 的实习生,感觉问的题目都比较基础,不过有些问题回答的不是很好,在这里对回答的不太好的题目做一下总结和复盘。

目录

一、后端开发Java面试复盘

1.1、23种设计模式

1.2、数据库(MySQL)的索引失效情况

1.3、线程池的使用

1.4、ConcurrentHashMap的使用及底层原理

1.5、Spring的传递依赖问题

1.6、MySQL事务的四种隔离级别


一、后端开发Java面试复盘

1.1、23种设计模式

设计模式:就是代码设计经验的总结。使用设计模式可以提高代码的可靠性和可重用性。

设计模式共有23中,整体分为3大类,如下:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

设计模型有6大原则,具体如下

1)开放封闭原则:尽量通过扩展软件实体应对需求的改变,而不是修改原有代码

2)里氏代换原则:使用的基类可以在任何地方使用继承的字类,完美的替换基类

3)依赖倒转原则:即面向接口编程,依赖抽象而不依赖具体

4)接口隔离原则:使用多个隔离的接口替代单个接口,降低耦合

5)迪米特法则:一个类尽量减少对其他类的依赖

6)单一职责:一个方法尽量只负责一件事

单例模式,分为饿汉模式和懒汉模式,都是每个类中只创建一个实例,并提供全局访问点来访问这个实例。饿汉模型是线程安全的,懒汉模式线程不安全,需要使用双重检测锁保证线程安全,具体的Java代码实现如下:

/*** 单例模式:确保每个类只有一个实例,并提供全局访问点来访问这个实例*/
//饿汉模式:线程安全
class Singleton1 {private static Singleton1 instance = new Singleton1() ;public Singleton1 getInstance(){return instance ;}
}//懒汉模式:线程不安全,需要通过双重检查锁定机制控制
class Singleton2{private static Singleton2 instance2 = null ;public Singleton2 getInstance2(){if(instance2 == null){instance2 = new Singleton2() ;}return instance2 ;}
}
//使用双重检查锁的方式保重线程安全
class Singleton3{//使用双重检查进行初始化的实例必须使volatile关键字修饰private volatile static Singleton3 instance3 = null ;public Singleton3 getInstance3(){if(instance3 == null){synchronized (Singleton3.class){if(instance3 == null){instance3 = new Singleton3();}}}return instance3 ;}
}
public class Main {public static void main(String[] args) {Singleton1 singleton1 = new Singleton1() ;Singleton1 singleton2 = new Singleton1() ;Singleton2 singleton21 = new Singleton2() ;Singleton2 singleton22 = new Singleton2() ;Singleton1 instance1 = singleton1.getInstance();Singleton1 instance2 = singleton2.getInstance();Singleton2 instance21 = singleton21.getInstance2();Singleton2 instance22 = singleton22.getInstance2();System.out.println(instance1 == instance2);System.out.println(instance21 == instance22);}
}

下面在了解一下工厂模式和代理模式。

工厂模式是一种创建对象的最佳方式,在创建对象时不对客户端暴露创建逻辑,通过使用一个共同的接口来指向新创建的对象,实现创建者和调用者的分离,工厂模式分为简单工厂,工厂方法和抽象工厂。我们熟知的Spring的IOC容器使用工厂模式创建Bean,只需要交给Bean进行管理即可,这样我们在业务层调接口层的方法时候就不需要再new了,可以直接注入。

1)简单工厂模式:也称为静态工厂方法,可以根据参数的不同返回不同类的实例,简单工厂模式专门定义一个类来负责创建其它类的实例,被创建的实例通常都有共同的父类。

首先创建工厂:

public interface Car {public void run() ;
}

定义工厂中的两个产品:

public class Car1 implements Car {@Overridepublic void run() {System.out.println("我是小汽车");}
}
public class Bus implements Car {@Overridepublic void run() {System.out.println("我是大卡车");}
}

创建核心工厂类,决定调用工厂中的哪一种方法,具体如下:


/*** 创建工厂类,在工厂类中决定调用哪一种产品*/
public class CarFactory {public static Car createCar(String name){if("小汽车".equals(name)){return new Car1() ;}if("大卡车".equals(name)){return new Bus() ;}return null ;}}

演示创建共创对象,并调用工厂中的产品,具体如下:

/*** 演示简单工厂*/
public class Factory1 {public static void main(String[] args) {//通过工厂类创建工厂对象Car car = CarFactory.createCar("小汽车");Car car1 = CarFactory.createCar("大卡车");//调用工厂方法car.run();car1.run();}
}
  • 优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
  • 缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则。

2)工厂方法模式:也称多态性工厂模式,核心的工厂类不在负责所有产品实例的创建,而是将具体的创建交给具体的子类去做,该核心类成为一个抽象工厂角色,仅仅给出具体工厂字类必须实现的接口,而不涉及具体哪一个产品被实例化。

首先是创建工厂和工厂的两个产品,具体如下:

public interface Car {public void run() ;
}public class Car1 implements Car {@Overridepublic void run() {System.out.println("我是小汽车");}
}public class Bus implements Car {@Overridepublic void run() {System.out.println("我是大卡车");}
}

然后创建工厂方法调用接口,并创建工厂实例。

/*** 创建创建工厂方法调用接口,所有工厂产品需要实现该接口,并重写接口方法*/
public interface Factorys {Car createFactory() ;
}public class CarF implements Factorys {@Overridepublic Car createFactory() {return new Car1() ;}
}public class BusF implements Factorys {@Overridepublic Car createFactory() {return new Bus() ;}
}

最后演示工厂方法的实现。

public class Factory2 {public static void main(String[] args) {Car car = new CarF().createFactory();Car car1 = new BusF().createFactory();car.run() ;car1.run() ;}
}

3)抽象工厂模式:即工厂的工厂 ,抽象工厂可以创建具体工厂,由具体工厂来生产具体产品。

首先创建第一个子工厂及其实现类,如下:

/*** 创建第一个工厂接口及其实现类*/
public interface A  {void run() ;
}
class CarA implements A{@Overridepublic void run() {System.out.println("奔驰");}
}
class CarB implements A{@Overridepublic void run() {System.out.println("宝马");}
}

创建第2个子工厂及其实现类,具体如下:

public interface B {void run() ;
}
class Animal1 implements B{@Overridepublic void run() {System.out.println("狗");}
}
class Animal implements B{@Overridepublic void run() {System.out.println("猫");}
}

创建一个总工厂及其实现类,由总工厂的实现类决定调用哪个工厂的哪个实例。

/*** 总工厂,包含创建工厂工厂的接口*/
public interface TotalFactory {A createA() ;B createB() ;
}/*** 总工厂的实现类,决定创建哪个工厂的哪个实例*/
class TotalFactoryImpl implements TotalFactory{@Overridepublic A createA() {return new CarA() ;}@Overridepublic B createB() {return new Animal1();}
}

最后演示抽象工厂模式,如下:

public class Test {public static void main(String[] args) {A a = new TotalFactoryImpl().createA();B b = new TotalFactoryImpl().createB();a.run();b.run() ;}
}

下面我们看一下代理模式,我们正常在Spring会接触到代理模式。我们先了解一下什么是代理。

  • 通过代理控制对象的访问,可以在这个对象调用方法之前、调用方法之后去处理/添加新的功能。(也就是AOP的实现)
  • 代理在原有代码乃至原业务流程都不修改的情况下,直接在业务流程中切入新代码,增加新功能,这也和Spring的(面向切面编程)很相似

我们常见的代理模式分为3种,即静态代理,JDK动态代理和CGLIB动态代理。

静态代理:简单代理模式,是动态代理的理论基础。常见使用在代理模式。
JDK 代理 : 基于接口的动态代理技术·:利用拦截器(必须实现invocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理,从而实现方法增强。
CGLIB代理:基于父类的动态代理技术:动态生成一个要代理的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截技术拦截所有的父类方法的调用,顺势织入横切逻辑,对方法进行增强。

1)静态代理

我们首先看如下一个接口类,如何在不改变接口类的基础上,在接口方法中开启和关闭事务,我们可以使用静态代理的方式。


public interface UserDao {void save() ;
}class UserDaoImpl implements UserDao{@Overridepublic void save() {System.out.println("添加数据");}
}
public class Test2 {public static void main(String[] args) {UserDaoImpl userDao = new UserDaoImpl();userDao.save();}
}

下面是静态代理实现的代码,如下:

public class UserDaoProxy extends UserDaoImpl {public UserDaoImpl userDao ;public UserDaoProxy(UserDaoImpl userDao){this.userDao = userDao ;}@Overridepublic void save() {System.out.println("开启事务");super.save();System.out.println("关闭事务");}
}
public class Test2 {public static void main(String[] args) {UserDaoImpl userDao = new UserDaoImpl();UserDaoProxy userDaoProxy = new UserDaoProxy(userDao);userDaoProxy.save();}
}

2)下面看一下JDK动态代理,它是基于接口的动态代理技术,用拦截器(必须实现invocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理,从而实现方法增强。

首先编写可以重复使用的代理类,如下,可以重复使用,不像静态代理那样每次都要重复编写带泪类,具体如下:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class InvocationHandlerImpl implements InvocationHandler {//通过构造方法传入目标对象public Object target ;InvocationHandlerImpl(Object target){this.target = target ;}/*** 动态代理实际运行的代理方法,以反射的方式创建对象* @param proxy* @param method* @param args* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("开始");Object invoke = method.invoke(target, args);System.out.println("结束");return invoke ;}
}
public class Test2 {public static void main(String[] args) {//已构造方法的方式传入被代理的对象UserDaoImpl userDaoImpl = new UserDaoImpl() ;InvocationHandlerImpl invocationHandler = new InvocationHandlerImpl(userDaoImpl);//类加载器ClassLoader classLoader = userDaoImpl.getClass().getClassLoader();Class<?>[] interfaces = userDaoImpl.getClass().getInterfaces();UserDao proxyInstance = (UserDao)Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);proxyInstance.save();}
}

3)最后我们看一下CGLIB动态代理,基于父类的动态代理技术:动态生成一个要代理的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截技术拦截所有的父类方法的调用,顺势织入横切逻辑,对方法进行增强。

简单地说就是实现MethodInterceptor接口并重写intercept()方法实现动态代理。

1.2、数据库(MySQL)的索引失效情况

1)查询条件有or关键字(必须所有查询条件都有索引)

2)模糊查询like以%开头

3)索引列上的条件where部分涉及计算或者函数

4)复合索引缺少左列字段

5)数据库认为全表扫描比索引更高效

1.3、线程池的使用

创建线程常见的几种方法包括继承Thread类并重写run()方法,实现Runnable()接口或实现Collable()等。一般来说,我们使用传统的方法每次创建和销毁线程的开销都比较大,故我们可以使用线程池的方式,减小开销。

使用线程池主要有如下的优势:

1)提高效率,创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
2)减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
3)提升系统响应速度,假如创建线程用的时间为T1,执行任务用的时间为T2,销毁线程用的时间为T3,那么使用线程池就免去了T1和T3的时间。
 

Executors类(并发包)提供了4种创建线程池方法,这些方法最终都是通过配置ThreadPoolExecutor的不同参数,来达到不同的线程管理效果。

推荐通过 new ThreadPoolExecutor() 的写法创建线程池,这样写线程数量更灵活开发中多数用这个类创建线程。

该类包含如下核心参数:核心线程数,最大线程数,闲置超时时间,超时时间的单位,线程池中的任务队列,线程工厂,拒绝策略。

 

最后一个参数为拒绝策略,一半包含四种拒绝策略,如下:

1. AbortPolicy

当任务添加到线程池中被拒绝时,直接丢弃任务,并抛出RejectedExecutionException异常

2. DiscardPolicy

当任务添加到线程池中被拒绝时,丢弃被拒绝的任务,不抛异常

3. DiscardOldestPolicy

当任务添加到线程池中被拒绝时,丢弃任务队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中

 4. CallerRunsPolicy

被拒绝任务的处理程序,直接在execute方法的调用线程中运行被拒绝的任务。

总结:就是被拒绝的任务,直接在主线程中运行,不再进入线程池。

下面看一个demo,创建线程池,并设置最大线程数目为2,设置拒绝策略为CallerRunsPolicy。

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class Test {public static void main(String[] args) {// 创建单线程-线程池,任务依次执行ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 2,60, TimeUnit.SECONDS,new LinkedBlockingDeque<>(2),new ThreadPoolExecutor.CallerRunsPolicy());for (int i = 0; i < 10; i++) {//创建任务Runnable runnable = new Runnable() {@Overridepublic void run() {try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName());}};// 将任务交给线程池管理threadPoolExecutor.execute(runnable);}}
}

1.4、ConcurrentHashMap的使用及底层原理

Map包括HashMap和HashTable。

HashMap性能高,但不是线程安全:
HashMap的性能比较高,但是HashMap不是线程安全的,在并发环境下,可能会形成环状链表导致get操作时,cpu空转,所以,在并发环境中使用HashMap是非常危险的。

HashTable是线程安全的,但性能差:
HashTable和HashMap的实现原理几乎一样,差别:HashTable不允许key和value为null。
HashTable是线程安全的,但是HashTable线程安全的策略实现代价却比较大,get/put所有相关操作都是synchronized的,这相当于给整个哈希表加了一把大锁,多线程访问时候,只要有一个线程访问或操作该对象,那其他线程只能阻塞,这就导致性能比较低。

ConcurrentHashMap是线程安全的且性能高:

JDK1.7版本: 容器中有多把锁,每一把锁锁一段数据,这样在多线程访问时不同段的数据时,就不会存在锁竞争了,这样便可以有效地提高并发效率。

JDK1.8版本:做了2点修改,取消segments字段,直接采用transient volatile HashEntry<K,V>[] table保存数据,采用table数组元素作为锁,从而实现了对每一行数据进行加锁,并发控制使用Synchronized和CAS来操作将原先table数组+单向链表的数据结构,变更为table数组+单向链表+红黑树的结构。
 

1.5、Spring的传递依赖问题

maven环境存在的依赖冲突问题,可以在pom文件中使用<exlusions>标签排除依赖,主动断开依赖的资源,被排除的资源无需指定版本。

在Spring中解决循环依赖问题,可以使用三级缓存,三级缓存如下:

 

1.6、MySQL事务的四种隔离级别

MySQL支持四种事务隔离级别,默认的事务隔离级别为repeatable read,Oracle数据库默认的隔离级别是read committed。

四种隔离级别分别为读未提交,读已提交,可重复读, 序列化/串行化。其中,读未提交是最低的隔离级别,序列化隔离级别最高。

1.读未提交(read uncommitted):没有提交就读取到了。
2.读已提交(read committed):已经提交的才能读取。
3.可重复读(repeatable read):事务结束之前。永远读取不到真实数据,提交了也读取不到,读取的永远都是最初的数据,即假象。
4.序列化(serializable):表示事务排队,不能并发,每次读取的都是最真实的数据。

同时运行多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。
1-脏读:对于两个事务T1和T2,T1读取了已经被T2更新但还没有提交的字段,之后,若T2回滚,则T1读取的数据就是临时且无效的。
2-不可重复读:对于两个事务T1和T2,T1读取了该字段,但是T2更新了该字段,T1再次读取这个字段,值就不同了。
3-幻读:对于两个事务T1和T2,T1从表中读取了一些字段,T2在表中插入了一些新的行,T1再次读取该表发现多几行。

read uncommitted:可以出现脏读,幻读,不可重复读。
read committed:避免脏读,出现幻读和不可重复读。
repeatable read:避免脏读和不可重复读,出现幻读。
serializable:避免脏读,幻读,不可重复读。

相关文章:

服务端开发Java面试复盘篇1

上周投了一些简历&#xff0c;约了8-9家面试&#xff0c;其中完成了3家的第一轮面试&#xff0c;由于面试的是Java 的实习生&#xff0c;感觉问的题目都比较基础&#xff0c;不过有些问题回答的不是很好&#xff0c;在这里对回答的不太好的题目做一下总结和复盘。 目录 一、后…...

Android框架WiFi架构

同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 一、wpa_supplicant:wpa_supplicant本身开源项目源码,被谷歌收购之后加入Android移…...

rt-thread 移植调试记录

rt-thread 移植调试记录 记录rt-thread移植的过程。这里移植仅仅是利用rt-thread源码目录已经移植好的文件&#xff0c;组建自己的工程&#xff0c;不需要自己编写汇编完成底层移植。 1. 搭建基础工程 这里使用的是正点原子的潘多拉开发板&#xff0c;MCU为stm32l475。需要先…...

红外线额温枪与红外线温度传感器的原理分析

额温枪主要针对测量人体额温基准而设计&#xff0c;使用也非常简单方便。测体温可以达到一秒即可准确测量。并且不需要接触人体&#xff0c;隔着空气即可一键测温。非常适合家庭、学校、企业等场所。 但是由于其精度原因&#xff08;一般为 0.2 ℃&#xff0c;也有更低的&#…...

2023牛客寒假算法集训营4

目录A. [清楚姐姐学信息论](https://ac.nowcoder.com/acm/contest/46812/A)&#xff08;数学&#xff09;B. [清楚姐姐学构造](https://ac.nowcoder.com/acm/contest/46812/B)&#xff08;数学 构造&#xff09;C. [清楚姐姐学01背包(Easy Version)](https://ac.nowcoder.com/…...

vue组合式API及生命周期钩子函数

一、组合式API 什么是组合式API&#xff1f; vue3中支持vue2的选项式、支持新的编程模式–函数式编程&#xff08;没有this指针&#xff09;做了一个兼容&#xff0c;可以在一个组件中使用函数式编程和OOP编程&#xff08;选项式&#xff09; setup()函数 可以使用setup属性…...

Python|每日一练|数组|回溯|二分查找|排序和顺序统计量|.update方法 |单选记录:组合总和|寻找峰值|编程通过键盘输入每一位运动员

1、组合总和&#xff08;数组、回溯&#xff09; 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&#xff08;包括 t…...

minio下载文件速度很慢的原因分析与说明

文章目录1.实战背景2.问题描述3.问题分析4.问题解决1.实战背景 最近在做一个项目&#xff0c;需要用到minio来搭建文件系统&#xff0c;先简单说一下我在项目中设置的上传文件流程&#xff1a; 前端将分块文件逐一传给后端&#xff0c;后端再存储到 linux服务器的minio 当中。…...

基于comsol软件弯曲单模光纤模拟仿真

在本节中&#xff0c;主要基于实验室实际光纤单模圆柱光纤进行模拟&#xff0c;与comsol案例库文件在分析过程和建模有些差异&#xff1a; 模拟主要通过以下三个步骤进行&#xff1a;模型的几何构建、物理场的添加研究、结构处理分析来进行。 下面是第一步骤&#xff1a;几何…...

如何开启多个独立Chrome浏览器

一、简介 作为测试或者开发人员&#xff0c;有些情况下会用到 Chrome 浏览器&#xff0c;但有时是同一个 Chrome 浏览器无法为我们提供隔离开的不同环境。这样 我们就需要清理 cache 、切换账号等&#xff0c;降低了我们的工作效率。今天的主题是如何开启多个独立的 Chrome 浏…...

erp5开源制造业erp主要业务会计分录处理

erp5开源制造业erp主要业务会计分录处理 采购业务的会计分录 收到发票时 借&#xff1a;材料采购 (1201) 应交税费-应交增值税&#xff08;进项税&#xff09;(21710101) 贷&#xff1a;应付账款 (2121) 付款时 借&#xff1a;应付账款 (2121) 贷&#xff1a;银行存款 (1002) 入…...

技能树基础——17四平方和(拉格朗日定理,嵌套循环)

题目&#xff1a;四平方和定理&#xff0c;又称为拉格朗日定理&#xff1a;每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去&#xff0c;就正好可以表示为4个数的平方和。比如&#xff1a;5 0^ 2 0^ 2 1^ 2 2^27 1^ 2 1^ 2 1^ 2 2^2 &#xff08;^符号表…...

JPA、EJB、事物管理---相关内容整理

目录 ■前言 ■实现原理&#xff1a;容器管理事务 ■代码实现简单描述&#xff1a; 1.JPA ■定义 ■1.1.配置文件 ■1.2.OSS jar ■1.3.一些OPA的类&#xff08;举例&#xff09; ■1.4. jpa 框架在实体类&#xff08;Entity&#xff09;中添加非数据库字段的属性--…...

C语言学习笔记(一):了解C语言

什么是C语言 C语言是一种高级编程语言&#xff0c;最早由丹尼斯里奇在1972年开发。它是一种通用编程语言&#xff0c;提供了高级编程语言的方便和易用性&#xff0c;同时又有较低级别的编程语言的灵活性和效率。C语言在许多操作系统、编译器和应用程序开发中广泛使用&#xff…...

回头看——《智能家居项目小结》

openAI兴起&#xff0c;于是拿着之前小组合作的项目&#xff08;承认优化较差&#xff09;&#xff0c;交给AI试着帮忙优化下&#xff11;.功能函数&#xff08;TCP_SER_INIT&#xff09;优化源代码&#xff1a;int TCP_SER_INIT(int *tcpsocket, const char *ip, const char *…...

社交登陆OAuth2.0

QQ、微博、github 等网站的用户量非常大&#xff0c;别的网站为了 简化自我网站的登陆与注册逻辑&#xff0c;引入社交登陆功能&#xff1b; 步骤&#xff1a; 1&#xff09;、用户点击 QQ 按钮 2&#xff09;、引导跳转到 QQ 授权页 3&#xff09;、用户主动点击授权&#xff…...

C++005-C++选择与分支2

文章目录C005-C选择与分支2条件语句C实现else if 语句题目描述 根据成绩输出成绩等级ABCDEif嵌套语句题目描述 输出三个数中的最大值题目描述 模拟游戏登录switch语句三元运算符题目描述 输出三个数中的最大值-基于3元运算符题目描述 根据1-7输出星期1-星期日案例练习题目描述 …...

IPFS 简介及概述

文章目录 IPFS 简介IPFS 包含的协议内容及其理解IPFS 和 BitTorrent 区别IPFS 简介 星际文件系统(InterPlanetary File System). IPFS 是一个分布式的网络文件系统, 点到点超媒体协议. 可以让我们的互联网速度更快, 更加安全, 并且更加开放. IPFS协议的目标是取代传统的互联网…...

初学者必读:讲解 VC 下如何正确的创建、管理及发布项目

Visual C 的项目文件组成&#xff0c;以及如何正确的创建及管理项目。 本内容是初学者必须要掌握的。不能正确的管理项目&#xff0c;就不能进一步写有规模的程序。 一、项目下各种常见文件类型的功能 1. 代码文件 扩展名为 .cpp、.c、.h 等。 通常情况下&#xff0c;项目…...

剑指offer(中等)

目录 二维数组中的查找 重建二叉树 矩阵中的路径 剪绳子 剪绳子② 数值的整数次方 表示数值的字符串 树的子结构 栈的压入、弹出序列 从上到下打印二叉树① 从上到下打印二叉树③ 二叉搜索树的后序遍历序列 二叉树中和为某一值的路径 复杂链表的复制 二叉搜索树与…...

微软发布会精华回顾:“台式电脑”抢了风头

Lightbot北京时间2016年10月26日晚10点&#xff0c;微软在纽约发布了名为 Surface Studio 的一体机、名为 Surface Dial 的配件以及外观未变的顶配版 Surface Book。同时&#xff0c;微软宣布了 Windows 10 下一个重要版本——“Creators Update”的数项新功能&#xff0c;包括…...

CF1561C Deep Down Below 题解

CF1561C Deep Down Below 题解题目链接字面描述Deep Down Below题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路TLE算法具体思想TLE特例AC思想代码实现备注题目 链接 https://www.luogu.com.cn/problem/CF1561C 字面描述 Deep Down Below 题面翻译…...

秒杀项目之服务调用分布式session

目录 nginx动静分离 服务调用 创建配置zmall-cart购物车模块 创建配置zmall-order订单模块 服务调用 spring session实战 什么是Spring Session 为什么要使用Spring Session 错误案例展示 配置spring-session 二级域名问题 用户登录 nginx动静分离 第1步&#xff…...

聊聊什么是架构,你理解对了吗?

什么是架构?软件有架构?建筑也有架构?它们有什么相同点和不同点? 下面咱们就介绍一下,容易混淆的几个概念 一、系统与子系统 系统 泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。它的意思是 “总体”、“整体”或“联盟” 子系…...

java多线程开发

1.并发和并行 并发&#xff1a;同一时间段内多个任务同时进行。 并行&#xff1a;同一时间点多个任务同时进行。 2.进程线程 进程&#xff08;Process&#xff09;&#xff1a;进程是程序的一次动态执行过程&#xff0c;它经历了从代码加载、执行、到执行完毕的一个完整过程…...

杂记7--opencv的ar码模块学习

背景&#xff1a;项目需要用到marker知识&#xff0c;所以到官网上临时补一些知识。 概要&#xff1a;主要介绍marker一些接口的含义&#xff0c;纯属个人理解&#xff0c;有误则希望大佬不吝赐教 1、 涉及ar码操作学习&#xff0c;其头文件为&#xff1a; #include <op…...

[项目设计]高并发内存池

目录 1、项目介绍 2、高并发内存池整体框架设计 3、thread cache <1>thread cache 哈希桶对齐规则 <2>Thread Cache类设计 4、Central Cache <1>Central Cache类设计 5、page cache <1>Page Cache类设计 6、性能分析 <1>定长内存池实现…...

28岁才转行软件测试,目前32了,我的一些经历跟感受

我是92年的&#xff0c;算是最早的90后&#xff0c;现在跟你介绍的时候还恬不知耻的说我是90后&#xff0c;哈哈&#xff0c;计算机专业普通本科毕业。在一个二线城市&#xff0c;毕业后因为自身能力问题、认知水平问题&#xff0c;再加上运气不好&#xff0c;换过多份工作&…...

Python导入模块的3种方式

很多初学者经常遇到这样的问题&#xff0c;即自定义 Python 模板后&#xff0c;在其它文件中用 import&#xff08;或 from...import&#xff09; 语句引入该文件时&#xff0c;Python 解释器同时如下错误&#xff1a;ModuleNotFoundError: No module named 模块名意思是 Pytho…...

select 与 where、order by、limit 子句执行优先级比较

当 select 和 其他三种语句的一者或者多者同时出现时&#xff0c;他们之间是存在执行先后顺序的。 他们的优先级顺序是&#xff1a;where > select > order by > limit 目录 1、select 与 where 2、select 与 order by 3、order by 与 limit 4、优先级证明 1、s…...

网站信息安全建设方案/网络营销平台的主要功能

计算机视觉的研究领域 图像分类 语义分割 分类和定位 目标检测 实例分割 人脸识别 生成模型 风格迁移 物体跟踪 图像问答 转载于:https://www.cnblogs.com/kexinxin/p/9858556.html...

电子商务网站设计是什么/连云港seo优化公司

经常有新手配置基于svnserve的subversion服务器后&#xff0c;在客户端访问subversion版本库时出现这个错误&#xff1a;svnserve.conf:12: Option expected为什么会出现这个错误呢&#xff0c;就是因为subversion读取配置文件svnserve.conf时&#xff0c;无法识别有前置空格的…...

凡科网怎么样可靠吗/sem 优化价格

整合ITIL&SOA&#xff0c;实践IT管理。Future S很有意思地将这两个看似不相干的概念放在一起。印象中收到邀请时对方只是提到SOA的概念。虽然现场的主题有些意外&#xff0c;但是也正好给了我一个了解二者关系的机会。 ITIL与SOA的关系是什么?是否存在相互依存的关系? -…...

网站建设费计入什么科目/灰色词网站seo

高中信息技术 知识7数据类型、常量和变量.pptx01 | 一段似曾相识的代码Dim x As IntegerDim y As IntegerDim z As IntegerDim max As IntegerxVal(Text1.Text)yVal(Text2.Text)zVal(Text3.Text)max0If x>y Then maxx Else maxyIf z>max Then maxzText4.textStr(max)对任…...

网站 关键词 挖掘/东莞seo推广机构帖子

NH2-UiO-66|CAS号1260119-00-3金属有机骨架 材料名称&#xff1a;NH2-UIO-66(Zr) 其他名称&#xff1a;NA CAS&#xff1a;1260119-00-3 结构信息 单位分子式 C48H5N6O32Zr6 单位分子量 1724.92 配位金属 Zr 配体 2-氨基对苯二甲酸&#xff08;CAS&#xff1a;10312-55-7&…...

网站制作的要求/郑州seo排名优化公司

从概念上来讲&#xff0c;构造函数的执行可以分成两个阶段&#xff0c;初始化阶段和计算阶段&#xff0c;初始化阶段先于计算阶段。 初始化阶段 所有类类型&#xff08;class type&#xff09;的成员都会在初始化阶段初始化&#xff0c;即使该成员没有出现在构造函数的初始化…...