文章目录

  • 面向对象的理解
  • ==和equals
  • final
  • String,StringBuilder,StringBuffer
  • 重写和重载的区别
  • 接口和抽象类的区别
  • List和Set的区别
  • hashCode和equals
  • ArrayList和LinkedList区别
  • hashMap和hashTable的区别
  • CurrentHashMap原理
  • 实现一个IOC容器
  • 字节码
  • java类加载器
  • 双亲委托模型
  • Java中的异常体系
  • GC如何判断对象可以被回收
  • 线程的生命周期。线程有几种状态。
  • Sleep(),Wait(),join(),yeild()的区别
  • 线程安全的理解
  • Thread和Runnable的区别
  • 对守护线程的理解
  • ThreadLocal的原理和使用场景
  • ThreadLocal内存泄漏原因,如何避免
  • 并发的三大特性
  • 线程池
  • 阻塞队列
  • 线程池中线程复用的原理
  • spring是什么
  • AOP的理解
  • IOC的理解
  • BeanFactory和ApplicationContext有什么区别
  • SrpingBean的生命周期
  • 解释一下Spring支持的几种Bean的作用域
  • Srping中的单例Bean是线程安全的吗
  • Spring框架用到了哪些设计模式
  • Spring事务的实现方式和原理以及隔离级别

面向对象的理解

面向过程是直接做,面向对象会分析对象以及对象行为。
面向过程更加高效,面向对象更易于复用、扩展和维护。
面向对象 封装继承多态。封装:黑盒 继承:复用 多态:继承/方法重写/父类引用指向子类对象

==和equals

==比较栈中的值,基本数据类型是变量值。引用类型比较的是堆中内存对象的地址。
equals:object默认采用 = = 比较,通常会重写。

final

修饰类:类不能被继承
修饰方法:不可以被覆盖,但是可以重载
修饰变量:一旦被赋值就不可改变

修饰成员变量:在声明时就需要赋值或者代码块中赋值,或者构造器赋值。静态,即类变量,在声明时就需要赋值,或者在静态代码块中赋值
修饰局部变量:必须由程序员初始化。,在使用前一定要赋值。

修饰基本数据类型和引用类型:修饰基本类型后数值不能更改,修饰引用类型后,对齐初始化后,不能再让其指向另一个对象,引用值是可变的。
为什么局部内部类和匿名内部类只能访问局部final变量?
因为在进行编译后会生成多个class文件,内部类并不会因为主类的结束而结束。

外部类方法结束,局部变量会被销毁,内部类访问的是局部变量的复制。为了保证这两个变量相同,加final。

String,StringBuilder,StringBuffer

String 是final修饰的,不可变,每次修改都会产生新的String对象。
Stringbuffer和StirngBuilder是在源对象上操作
StringBuffer线程安全,StringBuilder不然。
StringBuffer通常用synchronized修饰
性能StringBuilder>StirngBuffer>String

线程安全:多线程环境,共享变量,结果不受影响。
优先使用sbuilder,多线程共享变量使用sbuffer

重写和重载的区别

重载发生在一个类中,方法名必须相同,个数不同,顺序不同,参数类型不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写发生在继承中,方法名参数列表相同,返回值范围/抛出异常小于等于父类,访问修饰符大于等于父类。如果父类方法为private则不能重写。

接口和抽象类的区别

抽象类中可以有普通方法,接口中只能有抽象方法。
抽象类单继承,接口多实现。
抽象类中成员变量是多种类型的,在接口中成员变量只能是public static final类的。
接口的设计是为了强制不同类有相同的行为。
抽象类是为了代码复用。抽象类,先有子类,再有父类。抽象类不允许实例化。
抽象类是 is a,抽象类包含共性,个性子类自己实现。
接口是like a,核心是定义行为。
抽象类功能超过接口,但抽象类的定义代价高。这抽象类中,必须继承或者编写出其所有子类的所有共性。接口功能弱,但它只是对一个动作的描述可以实现多个接口降低设计难度。

List和Set的区别

list有序重复,可以存储多个null,可用迭代器和下标。
set无序不可重复,只能存储一个null,只能用迭代器。

hashCode和equals

对象存储在堆中,如何找到指定对象,维护了一张哈希表,哈希表的索引就是hashcode。
hashcode()定义在object中,java中任何类都包含有hashcode函数。

“hashset如何检查重复?”
hashset对象放入时,计算hashcode,如果不同,则认为没有重复,如果相同,实用equals检查两个对象是否相同,相同则不会添加成功。
如果equals不同,则重新散列到其他位置,大大减少equals的次数,提高执行速度。

ArrayList和LinkedList区别

array动态数组,连续内存存储,适合下标访问,使用尾插法并指定初始容量可以极大提升性能(从头部插会不停的复制) 甚至超过l(link每次插入需要创建大量node对象)
link链表,存储在分散内存中,适合做数据插入和删除(只能用迭代器遍历,indexOf也会全部遍历)

hashMap和hashTable的区别

table线程安全(在所有的方法里加锁),map线程不安全。map允许key为null,table不允许。
map底层是数组+链表
jdk8开始 链表高度到8,数
组长度超过64,链表转换为红黑树,元素以内部类Node节点存在
1.计算key的哈希值,根据哈希值二次哈希根据数组长度取模,对应到数组下标
2.如果没有哈希冲突(下标位置没有元素),直接创建node存入数组
3.如果产生哈希冲突,先equals进行比较,相同取代该元素,不同,则判断链表高度插入链表,链表高度达到8,并且数组长度超过64则转变为红黑树,长度低于6则将红黑树转回链表。
4.key为null,存在下标0的位置
数组扩容

CurrentHashMap原理

jdk7
数据结构:ReentranLock+Segment+HashEntry,一个segment包含一个hashEntry数组,每个hashEntry又是一个链表结构。
元素查询:二次哈希,第一次hash定位到segment,第二次定位到元素所在链表的头部。
分段锁:segment继承RenntranLock锁定指定segment,其他segment不受影响。并发度为segment的个数,数组扩容不会影响其他segment。
get方法无需加锁,通过volatile修饰val保证可见性。
jdk8
数据结构:synchronized+CAS+Node+红黑树,Node的val和next都用volatile修饰,保证可见性.
查找替换赋值使用CAS
:锁链表的head节点,不影响其他元素的读写,锁粒度更细。扩容会阻塞所有读写操作
读操作无锁,node的val和next用volatile修饰,读写线程对该变量相互可见。
数组用volatile修饰,保证扩容时被读线程感知。

实现一个IOC容器

思路
1.配置文件配置包扫描路径
2.递归包扫描获取.class文件
3.反射,确定需要交给IOC管理的类
4.对需要进行注入的类进行依赖注入

字节码

java 编译器和解释器
java在机器(win)和编译程序(要跑的项目)之间加入抽象的虚拟的机器,这台编译器在任何平台都提供弄给编译程序一个共同的接口。
编译程序只需要面向虚拟机,生成虚拟机能理解的字节码。字节码不面向任何特定处理器,只面向虚拟机。
jvm(虚拟机)将字节码发给解释器(不同系统有不同的解释器),解释器翻译为在特定机器上的机器码。
java源代码>编译器>jvm可执行的字节码>jvm>jvm中的解释器>机器可执行的二进制机器码>程序运行
好处:实现跨平台;通过字节码的方式,一定程序上解决了传统解释性语言执行效率低的问题。

java类加载器

JDK自带的三个类加载器:bootstrap ClassLoader,ExtClassLoader,AppClassLoader
bootstrap是ext的父类加载器,默认负责加载%JAVA_HOME%lib下的jar包和class文件。
ext是app的父类加载器,负责加载%JAVA_HOME%lib/ext下的jar包和class文件。
app是自定义类加载器的父类,负责加载classPath下的类文件。默认的系统类加载器,线程上下文加载器(贯穿于三个类加载器中,三个类加载器都可以访问到)

双亲委托模型


每个类加载器都有缓存,加载类时,如果app找不到会向上委派,去ext和boot缓存中查找是否有该类,如果都没有就向下查找路径
向上查找缓存,向下查找路径
向上委派到顶层加载器为止,向下查找到发起加载的加载器为止。
好处:
安全性,避免自己编写的类动态替换Java的一些核心类,比如String。
避免了类的重复加载。jvm区分不同类,不仅仅根据类名,相同的class文件被不同的ClassLoader加载就是两个不同的类。

Java中的异常体系

顶级父类flowable
两个子类exception和error
error是程序无法处理的错误,一旦出现这个错误,则程序会被迫停止。
exception不会导致程序停止,分为RuntimeException运行异常和CheckedException检查异常。
runtime发生在程序运行过程中,会导致当前线程执行失败。checked发生在程序编译过程中,会导致程序编译不通过。

GC如何判断对象可以被回收

引用计数法:新增引用计数+1,引用释放计数-1,计数为0就被释放。(相互引用的类同时不再使用无法回收)
可达性分析法:从GCroots开始向下搜索,搜索走过的路径为引用链。当一个对象到GC Roots没有任何引用链相连的时候,证明该对象不可用,即为可回收对象。
GC root的对象由:

  • 虚拟机栈(栈桢中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象
    可达性算法中的不可达对象并不是立即死亡的,在第一次不可达后会标记,第二次是在由虚拟机自动建立的finalizer队列中判断是否需要执行finalize()方法。
    当对象变为不可达,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,回收,否则复活。
    每个对象只能触发一次finalize方法。

线程的生命周期。线程有几种状态。

1.线程的五种状态:创建,就绪,运行,阻塞和死亡状态。
2.阻塞的情况又分为三种:
(1)等待阻塞:wait,该线程会释放所有占有的资源,JVM会把该线程放入“等待迟”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify或者notifyAll方法才能被唤醒,wait是object类的方法。
(2)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
(3)其他阻塞:运行的线程执行sleep或join方法,或者发出了I/O请求时,JVM会把该线程设置为阻塞状态。当sleep状态超时,join等待线程终止或者超时,或者I/O处理完毕时,线程重新转入就绪状态。sleep是Thread类的方法。
1.新建状态(New):新建了一个线程对象
2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start方法。该状态的线程位于可运行的线程池中,变得可运行,等待获取CPU使用权
3.运行状态(Runnning):就绪状态的线程获取了CPU,执行程序代码
4.阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
5.死亡状态(Dead):线程执行完了或者因异常推出了run方法,该线程结束生命周期。

Sleep(),Wait(),join(),yeild()的区别

1.锁池
所有要竞争同步锁的线程都会放在锁池当中,当某个对象的锁被一个线程拿到,剩下的线程只能在锁池等待,当前面线程释放锁后竞争同步锁,当某个线程的到后就会进入就绪队列进行等待CPU资源分配。
2.等待池
当我们调用wait方法后,线程就会放放到等待池中,等待池中的线程不会竞争锁。只有调用了notify()或者notifyAll()后等待的线程才会开始去竞争锁,notify()是随机从等待池中选出一个线程放到锁池,而notifyAll()是将等待池所有线程放到锁池中。

线程安全的理解

线程安全应为内存安全,堆是共享内存,可以被所有线程访问
当多线程访问某个对象,不需要协调和同步操作,调用也能得到正确结论,则说明这个线程安全。
是进程和线程共有的空间,分为全局堆(没有分配的)和局部堆(用户分配的空间)。
堆在操作系统中对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,用完需要归还,否则就是内存泄漏。
在java中,堆是java虚拟机所管理的内存中的一块,是所有的线程共享的一块内存区域,在虚拟机启动时创建。堆所在的内存区域的唯一目的就是存放实体对象,几乎所有的对象实例以及数组都在这里分配内存。
栈是每个线程独有的,保存其运行状态和局部自动变量。栈在线程开始的时候初始化,每个线程的栈相互独立,因此,栈是线程安全的。操作系统在切换线程时会自动切换栈。栈空间不需要在高级语言里面显式的分配和释放。

Thread和Runnable的区别

Thread和Runnable是继承关系,没有可比性。

对守护线程的理解

任何一个守护线程都是整个JVM中所有用户线程的保姆。
守护线程的终止自身无法控制,随进程的终端而结束。
守护线程是为其他线程提供服务支持。
需要正常关闭的线程使用户线程。
所有用户线程退出,守护线程就会退出。
不能把正在运行的常规线程设置为守护线程。在守护线程产生的新线程也是守护线程。
守护线程不能访问固定资源,因为不定时中断。
Java自带的多线程框架,比如ExecutorService,会将守护线程转换为用户线程,所以如果要使用后台线程就不能使用java的线程池。

ThreadLocal的原理和使用场景

每个Thread对象均含有一个ThreadLocalMap类型的成员变量threadLocals,它存储本线程中所有ThreadLocal对象及其对应的值。
ThreadLocalMap是ThreadLocal的一个内部类。

ThreadLocalMap对象由一个个Entry对象构成。
Entry继承自WeakReference<ThreadLocal<?>>,一个Entry由一个ThreadLocal对象和Object构成。由此可见,Entry的key是ThreadLocal对象,并且是一个弱引用。当没有指向key的强引用后,该key就会被垃圾收集器回收。
当执行set方法时,threadlocal会先获取当前的线程对象,然后获取当前线程的ThreadLocalMap对象。再以以前的ThreadLocal对象为key,将值存储进ThreadLocalMap对象中。
get方法类似,获取当前线程,线程的threadLocalMap,以threadLocal为key获取value。
因为每个线程都私有ThreadLocalMap容器,因此不会产生线程安全问题。
使用场景
1.在进行对象跨层传递的时候(controller,service,dao层传值),使用ThreadLocal可以避免多次传递。
2.线程间数据隔离
3.进行事务操作,用于存储线程事务信息。
4.数据库连接,Session会话管理。

Spring框架的jdbc connection就是放在ThreadLocal中。

ThreadLocal内存泄漏原因,如何避免

不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄漏。
强引用:使用普遍的new,反射也属于强引用。一个对象具有强引用,不会被垃圾回收器回收。当内存空间不足,java虚拟机宁可抛出oom是程序异常终止,也不会回收这种对象。
如果想取消强引用和某个对象之间的关联,可以显示的将引用赋值为null,这样可以使JVM在合适的时间就会回收该对象。
弱引用:JVM垃圾回收都会回收的被弱引用关联的对象。

实线强引用,虚线弱引用。

并发的三大特性

原子性(直到写入工作内存的步骤一起执行)
可见性(总线锁定,MESI)(写入工作内存和写入主内存一起执行)
有序性

线程池

为什么使用线程池,提高线程利用率,降低创建和销毁线程的消耗。
提高响应速度(不用及时创建)。
提高线程可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。
corePoolSize代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后不会消除,而是一种常驻线程。
maxinumPoolSize代表的是最大线程数,它与和核心线程对应。keepAliveTime Unit
workQueue用来存放待执行的任务。当核心线程满时,会添加到待执行线程。当待执行线程满时,会创建线程直到最大线程。
handler任务拒绝策略。当达到最大线程数并且待执行任务满了就会拒绝。线程没有能力继续处理新提交的任务也会拒绝。
ThreadFactory是一个线程工厂,用来生产线程执行任务。

阻塞队列

帮助阻塞线程,唤醒线程,保存任务在阻塞队列中。
为什么要先添加队列而非创建最大线程
创建线程要获取全局锁,此时其他线程都得阻塞。影响效率。为了避免频繁创建线程。

线程池中线程复用的原理

线程和任务解耦,线程中没有任务的业务逻辑,每个线程执行"循环任务",在循环任务中检测是否有任务需要被执行,有则执行任务中的run方法,而非每次执行任务调用Thread.start方法,通过这种方式只使用固定的线程就将所有任务的run方法串联起来。

spring是什么

轻量级的开源J2EE框架。他是一个轻量级的IOC和AOP容器框架,用来装javaBean(java对象),中间层框架。

AOP的理解

将程序中的交叉逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑当中去)。AOP可以对某个对象或某些对象的功能进行增强。

IOC的理解

容器概念,控制反转,依赖注入
ioc容器:实际上就是一个map(key,value),里面存储的是各种对象(在xml里配置的bean节点,@repository,@service,@controller,@component)在项目启动时会读取配置文件里的Bean节点,根据全限定类名/扫描注解使用反射创建对象放到map里。
此时map中里有各种对象,在需要使用到当中的对象时,再通过DI注入。

控制反转:自己new,到ioc容器给注入
依赖注入是实现ioc的方法。

BeanFactory和ApplicationContext有什么区别

ApplicationContext是BeanFactory的子接口。
Application提供了更完整的功能:
1.继承MessageSource,因此支持国际化
2.统一的资源文件访问方式
3.提供在监听器中注册Bean的事件。
4.同时加载多个配置文件
5.载入多个上下文,是每一个上下文专注特定的层次。
BeanFactory采用延迟加载,即在使用到某个Bean时,才对该对象进行实例化。不利于发现问题
ApplicationContext在容器启动时,一次性的创建Bean。相较于BeanFactory占用空间。
BeanFactory通常以编程的方式创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader。
BeanFactory和ApplicationContext都是支持BeanPostProcessor,BeanFactoryPostProcessor.但是BeanFactory需要手动注册,ApplicationContext则是自动注册。

SrpingBean的生命周期

1.解析类得到beanDefinition(扫描指定包路径获取类)
2.多个构造方法,推断构造方法
3.确定构造方法,实例化对象
4.对对象中的加了@Autowired注解的属性进行属性填充
5.回调Aware方法,比如BeanNameAware,BeanFactoryAware。
6.调用BeanPostProcessor的初始化前方法。
7.调用初始化方法。
8.调用BeanPostProcessor的初始化后方法,在这里进行AOP
9.如果当前创建的Bean是单例,会把它放入单例池
10.使用Bean
11.Spring容器关闭时调用DisposableBean中的Destory方法。

解释一下Spring支持的几种Bean的作用域

singleton:默认,每个容器中只有一个Bean实例。单例的模式由BeanFactory自身来维护。该对象的生命周期和SpringIOC容器一致,但是在第一次注入时才会被创建。
prototype:原型模式。为每一个bean提供一个实例。每次注入都会创建一个新的对象。
request: bean被定义为在每个http请求中创建一个单例对象,也就是说在单个请求中会复用这个对象。请求结束就会被回收。
session:与request范围相似。每个回话都会有一个bean实例,session过期后失效。也是单例对象。
application:ServeletContext的生命周期中复用一个单例对象。
websocket:websocket生命周期

globalSession:全局作用域,globalSession和Porlet应用相关。

Srping中的单例Bean是线程安全的吗

Spring框架没有对bean进行多线程的封装处理。
如果bean有状态即有数据存储功能,就存在线程安全问题。

Spring框架用到了哪些设计模式

简单工厂:由一个工厂类根据传入的参数,动态的决定创建哪一个产品类。Spring的BeanFactory,通过传入唯一标识来获取Bean对象。
工厂方法:实现了FactoryBean接口的Bean是一类叫做Factory的Bean。使用getBean自动调用该bean的getObject方法。A类getBean得到B对象
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。全局访问点BeanFactory。
适配器模式:springMVC Controller HandlerAdapter excute
装饰器模式:动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类功能为灵活。
spring中用到的包装器模式在类名上有两种表现,一种是类名中含有wrapper,另一种是类名中含有Decorator。
动态代理
观察者模式:spring的事件驱动模型,如listener的实现。
策略模式:Spring 框架的资源访问Resource接口访问底层资源。

Spring事务的实现方式和原理以及隔离级别

编程式,声明式,@Transaction注解就是声明式的。
spring事务就是数据库事务,隔离级别Spring配置会覆盖数据库配置(spring设置的隔离级别数据库不支持,采用数据库配置)。

java 面试(一)相关推荐

  1. java面试常见问题之Hibernate总结

    1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象.) Ø  OID检索(按照对象的OID来检索对象.) Ø  HQL检索(使用面向对象的HQL查询语言.) ...

  2. 2021年Java面试题目最新总结【90%面试会踩的坑】

    学会java技术之后大家面临的最多的问题就是面试这关,求职面试java岗位是否能够成功是直接影响我们的工作机会的,所以对于Java程序员面试你准备好了吗?今天小编汇总了一下关于Java程序员面试,90 ...

  3. Github 一夜爆火:这份金九银十 Java 面试手册我给跪了

    这几天给筒子们整理了一份<Java面试手册>,106页,目前大约6万字左右,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间. 废话不多说,本手册目前为第一版,后 ...

  4. Java面试参考指南(二)

    2019独角兽企业重金招聘Python工程师标准>>> 访问修饰符 对于基本的OOPS(面向对象)概念,请看Java面试参考指南的第一部分.访问修饰符规定了一个类如何访问另一个类及它 ...

  5. 卧槽,又一个Java面试神器!!!

    临近秋招,又到了"金九银十"面试求职高峰期,在金三银四时也参与过不少面试,2020都说工作不好找,也是对开发人员的要求变高.前段时间自己有整理了一些Java后端开发面试常问的高频考 ...

  6. 200 道 Java 面试题解!某阿里 P7 只答上来 70%!

    最近,经常有读者朋友们在后台给我留言,问我有没有什么面试资料可以分享的,因为之前一直比较忙,所以没有时间整理. 最近终于抽出一些时间,整理了一下,一发不可收拾了,一口气整理出好几本电子书出来.其中有一 ...

  7. 美团架构师开源5万字的《Java面试手册》PDF免费下载!

    美团一位架构师利用空余时间在github整理了一份<Java面试手册>,现整理成PDF,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间. 前两天,朋友圈分享了这 ...

  8. 5万字的《Java面试手册》V1.0版本,高清PDF免费获取

    利用空余时间整理了一份<Java面试手册>,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间. 前两天,朋友圈分享了这份这份面试手册的初稿,再几位同学的提议下,对 ...

  9. JAVA面试解析(有赞二面)

    作者:孤独烟 来自:打杂的ZRJ 本文的题目出自博客 http://www.54tianzhisheng.cn/2018/07/12/youzan/ 但是作者没有给出答案,博主斗胆来制作答案版. 也是 ...

  10. Java 面试,这样拿 Offer!

    (含答案) 所有面试资料及技术好文精选文档都整理到网盘了. Java面试官手册需要加微信免费领取 长按扫码或搜索微信号:gupao666666,免费领取

最新文章

  1. 读书笔记之快速排序(一)
  2. k8s节点亲和性:pod和node的亲和性、硬策略、软策略
  3. 升级 ubuntu_Ubuntu 19.04 已经到期!现有用户必须升级到 Ubuntu 19.10
  4. dsniff 和 Ettercap 和 bettercap 详解 - 网络嗅探工具包
  5. vue可以多次导入吗_vue组件怎么复用,比如有abc三个组件,b是可复用组件,引入到a和c中,但是怎么才能在a和c中的数?...
  6. Bing Maps开发扩展三:Bing Maps中渲染ESRI SHP空间数据
  7. 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
  8. rs485与modbus流程图_RS485通讯基础及通讯应用详解
  9. 小组学习电子教室等同屏工具调研
  10. 用Python代码实现将exl表格内容,批量写到word里面
  11. 全球首场神经影像人机对决:AI战胜25位医界“最强大脑”!
  12. linux系统可以下steam吗,linux – 是否可以使用optirun运行Steam游戏?
  13. 一个电源工程师要学哪些软件?
  14. [473]tf.nn.*()函数and tf.add()函数
  15. 正规的股票交易软件有哪些?
  16. 横向扩展 纵向扩展 数据库_理解数据库扩展模式的指南
  17. 为什么不能直接通过IP访问网站
  18. YOLOv5的损失函数
  19. 如何使用ansys将等高线txt文件转为iges文件
  20. 2019超值电话卡——校园卡最新消息,物联网卡推荐

热门文章

  1. sql镶嵌查询_超实用的SQL语句之嵌套查询
  2. 面试时计算机工程自我介绍范文,计算机专业大学生面试自我介绍范文
  3. js 手机端网站底部悬浮html广告代码
  4. 10 种主数据模型设计示例分享,推荐收藏
  5. 极光推送广告,美名为:日活优化
  6. 网站域名被DNS劫持了怎么办?dns被劫持了怎么处理
  7. 并查集详解,不会的同学可以来瞅瞅,转载的,不过加了一些自己的理解。
  8. 软件设计师刷题知识点-算法部分
  9. windows 位图结构详解
  10. 十三:Dubbo负载均衡(一)介绍、配置