4.有1万个左右的脏词,每次发帖要判断帖子里边是否包括有脏词,数据库应该如何设计
可以建立一个脏词字典表,写好函数判断帖子正文里面是否有脏词。然后再这个帖子正文字段上面建立check 约束。
4.linux如何查找文件
cat、vi、,find,locate,whereis
find :find <指定目录> <指定条件> <指定动作>
使用locate搜索linux系统中的文件,它比find命令快。因为它查询的是数据库(/var/lib/locatedb),数据库包含本地所有的 文件信息。使用locate命令在根目录下搜索interfaces文件的命令为”locate interfaces“
使用”whereis“命令可以搜索linux系统中的所有可执行文件即二进制文件。使用whereis命令搜索grep二进制文件的命令为”whereis grep“。
1.Mysql和mongodb索引原理(说一下B+tree和B-tree区别,为什么一个用b+一个用b-,为什么索引用btree不用平衡二叉树)
B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。
这就决定了B+树更适合用来存储外部数据,也就是所谓的磁盘数据。
从Mysql(Inoodb)的角度来看,B+树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上。
那么Mysql如何衡量查询效率呢?磁盘IO次数,B-树(B类树)的特定就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数,当查询数据的时候,最好的情况就是很快找到目标索引,然后读取数据,使用B+树就能很好的完成这个目的,但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时啊!),而B+树除了叶子节点其它节点并不存储数据,节点小,磁盘IO次数就少。这是优点之一。
另一个优点是什么,B+树所有的Data域在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。
至于MongoDB为什么使用B-树而不是B+树,可以从它的设计角度来考虑,它并不是传统的关系性数据库,而是以Json格式作为存储的nosql,目的就是高性能,高可用,易扩展。首先它摆脱了关系模型,上面所述的优点2需求就没那么强烈了,其次Mysql由于使用B+树,数据都在叶节点上,每次查询都需要访问到叶节点,而MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql(但侧面来看Mysql至少平均查询耗时差不多)。
总体来说,Mysql选用B+树和MongoDB选用B-树还是以自己的需求来选择的。
19.继承的好处和坏处
优点:可重用
1.可以使用父类的所有非私有方法;而且单继承可由接口来弥补。
2.可以继承父类中定义的成员方法以及成员变量,使得子类可以减少代码的书写。还可以重写父类的方法以增加子类的功能。
缺点:
1.耦合性太大
2.就是破坏了类的封装性,其实继承一般多用于抽象方法的继承和接口的实现
15.servlet是单个实例么?
是,他的实例是由tomcat容器决定的,
一般来说,servlet是单例的,tomcat容器会给他创建一个实例,同一个实例可以同时有多个用户访问,这个没有任何问题。问题在于servlet是否有状态,对这些状态的访问是否必须是synchronized的。如果是,那么在同一个时间就只有一个用户可以访问这些状态了,这就大大降低了性能。所以一般来说servlet都是无状态的。
因此说servlet一般是线程不安全的,多个客户端(相当于多线程)去请求同一个servlet实例,假设都对服务器的一个资源实例进行修改,就会出现线程安全问题,我们只需s对资源实例加锁就好,无需对servlet加锁,对servlet加锁没有意义。
只是Web容器在维护这些Servlet的时候只给创建一个实例存在JVM中,用户请求服务时,服务器只调用它已经实例化好的Servlet对象来处理请求。
所以,告诉你的是Servlet并不是单例,只是容器让它只实例化一次,变现出来的是单例的效果而已。
但需要注意的是,化Servlet是web容器来控制实例化的,并不是你自己用你编写的代码来实例,即使你自己编写代码实例化你的servlet,Web服务器也不会直接调用你的实例化的Servlet对象的。
11.socket实现过程,具体用的方法;怎么实现异步socket.(不会)
Socket编程基本就是create,listen,accept,connect,read和write等等。在建立连接前,必须知道对方的IP地址和端口号。一个指定的端口号不能被多个程序共用。
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:绑定套接字到一个IP地址和一个端口上(bind());
3:将套接字设置为监听模式等待连接请求(listen());
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:用返回的套接字和客户端进行通信(send()/recv());
6:返回,等待另一连接请求;
7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
客户端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:向服务器发出连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
10.new 实例化过程
1加载类2给对象分配内存--进行初始化---父类,父类的加载,父类的内存分配,父类static,当前类static,父类普通变量,当前类普通变量,父类构造,当前类构造
寻找类定义;
加载类定义,jvm启动时,会用启动类加载器加载,对于用户的class,则会用应用程序类加载器实时加载,所谓实时加载,指的是遇到的时候再加载,而不是预先一次 性加载。关于类加载器,有三级,jvm严格的限制了每一级的加载权限,加载模式为“双亲委托模式”,加载任何类,都先由父加载器加载。
给对象分配内存空间;jvm在内存“堆”中,开辟一个空间,该空间按照MyObject类定义开辟,并将该空间中的各个内存段设置默认值,对应的就是对象的属性初始化默认值。
对象的初始化顺序 :
如果第一次加载其父类/其类的话,需要先实例化类对象,如果不是则直接实例化对象==即先对类对象进行实例化(父类/子类)【给父类静态变量默认值,对父类静态变量赋值,执行父类静态块;给当前类静态变量默认值,对当前类静态变量赋值,执行当前类静态块】;给父类变量默认值,对父类变量赋值,执行父类构造函数;给当前类变量默认值,对当前类变量赋值,执行当前类构造函数。
对象构造完成;
5.输出用户表里重名的用户,说sql语句
select myname, count(*) from tab group by myname having count(*) > 1
如果觉得《校招面试题3--去哪/微店/蘑菇街/招银科技》对你有帮助,请点赞、收藏,并留下你的观点哦!