不积跬步无以至千里,不积小流无以成江海。
1、static修饰类和内部类的区别?
- 用static修饰的类可以直接作为一个普通类使用,而不需要先实例一个外部类
而调用内部类需要先new一个外部类的对象,然后通过外部类调用内部类
2、内存泄漏
内存泄漏是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
3、什么是Oracle索引,数据库索引的优缺点:
在Oracle索引是一种供服务器在表中快速查找一个行的数据库结构。合理使用 索引能够大大提高数据库的运行效率。
优点:
1. 建立索引的列可以保证行的唯一性,生成唯一的rowId
2. 建立索引可以有效缩短数据的检索时间
3. 建立索引可以加快表与表之间的连接
4. 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序
缺点:
5. 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
6. 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储 空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
7. 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时 间变长
什么情况下需要建立索引?
当数据量大时,经常进行查询操作的表要建立索引。 用于排序的字段可以添加索引,用于分组的字段应当视情况看是否需要添加索 引。
表与表连接用于多表联合查询的约束条件的字段应当建立索引。
数据库索引有哪些?
聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序。 非聚集索引:就是给普通字段加上索引。
联合索引:就是好几个字段组成的索引,称为联合索引。
4、JQuery选择器有哪些?如何获取页面的节点元素?
Id选择器,Class选择器,属性过滤选择器
$(“#test1”).parent(); // 父节点 $(“#test1”).parents(); // 全部父节点
$(“#test1”).parents(“.mui-content”);//返回class为mui-content的父节点
$(“#test1”).children(); // 全部子节点 $(“#test1”).children(“#test1”);
//返回id为test1的子节点 $(“#test1”).contents(); // 返回id为test里面的所有内容,包括节点和文本
$(“#test1”).contents(“#test1”); //返回id为test里面的id为#test1的节点和文本
$(“#test1”).prev(); // 上一个兄弟节点 $(“#test1”).prevAll(); // 之前所有兄弟节点
$(“#test1”).next(); // 下一个兄弟节点 $(“#test1”).nextAll(); // 之后所有兄弟节点
$(“#test1”).siblings(); // 所有兄弟节点 $(“#test1”).siblings(“#test2”);
//返回id为test2的兄弟节点 $(“#test”).find(“#test1”); 选中id为test后代中 id为test1的节点
5、Set、List、Map的区别?
- List存储的数据是有序的,并且值允许重复,而Set存储的数据是的无序的,值不允许重复,元素在集合中的位置是固定的,因为他是根据hashcode来进行存储的,又因为这个位置是固定的所以用户不能改变他的位置,即set存储数据时是无序的。
Map储存的数据也是跟Set一样是无序的,他的key(键)是唯一的即不允许重复,value值可以重复。并且Map允许存放null键值对。
简单的来说就是:
Set 注重唯一,无序,没有重复值。 List 有序,可以有多个元素相同引用的对象。 Map
使用键值对储存数据,key唯一,但是value可以相同。
注意:
如果你想在这个问题上得到面试官的加分,可以引导面试官Map集合下的HashMap的知识点(讨论HashMap线程安全性问题)`
6、谈一谈线程锁
可重入锁、死锁、自旋锁、公平锁、非公平锁、独占锁、共享锁、读写锁
参考:http://www.imooc.com/article/284628
7、说说Git(分布式)和Svn(集中式)的区别和联系。
(1)集中式:版本库存放在中央服务器。
(2)分布式:没有中央服务器,版本库存在每个人自己的计算机上。
svn的作用
① 协作多人开发同一个项目同一个文件,并且不会出现文件覆盖问题。
② 针对一个文件可以创建许多不同版本,并且可以随时查看不同版本的内容。
③ 公司领导可以通过svn查看每个人的工作情况
区别:
1.SVN为集中式管理,有版本号, Git为分布式管理,没有版本号。
2.开发人员可以从中央服务器获得最新版本的项目然后在本地开发,开发完通过
Commit提交到中央服务器
,通过这一点可以看出Svn需要服务器的支持,所以在断网的时候不能进行代码的推送和提交
,又因为Svn提交代码时需要网络的支持故在分支的文件比较大时提交的就会比较缓慢;而Git没有中央服务器
,开发人员可以在断网的的情况下也可以执行commit、查看版本提交记录、以及分支操作,在有网络的情况下执行
push 到 Remote Repository。
推送的方式不同
3. GIT提交是本地操作,需要执行push操作才会到主要版本库。
4. SVN 提交的文件会直接记录到中央版本库。
8.触发器的作用是什么?
触发器是针对数据表(库)的特殊的存储过程,当这个表发生了Insert、update或Delete操作时,数据库就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则
。
9.快速启动windows远程桌面的两种办法
推荐使用方法1:
1.按win键+R键 ,然后输入mstsc回车,就会打开远程连接程序。
或者win+R 输入cmd进入cmd界面输入mstsc回车即可,跟上面的意思是一样的,原理是通过系统变量默认配置的命令来启动mstsc对应的应用程序exe。
2.使用IIS7远程工具建立远程连接,只要下载打开IIS7远程桌面工具,新建一个TXT,把整理好的服务器信息输入,然后点击程序左上角,导入 选择刚才的TXT,点击要远程的电脑就可以开始了。
10.Linu操作系统下常用的六大命令(不必死记,灵活运用就行了)。
su命令常常被忽略
,其他命令用的很六,连最基本的切换用户都忘记了,谈何熟练?
语法:
su(选项)(参数)
变更帐号为root并在执行ls指令后退出变回原使用者:
su -c ls root
变更帐号为root并传入-f选项给新执行的shell:
su root -f
变更帐号为test并改变工作目录至test的家目录:
su -test
1. awk命令:一个强大的文本分析工具。
一个强大的文本分析工具,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。在命令行中使用,但更多是作为脚本来使用
使用示例
:
awk -F":" '{print $1}' /etc/passwd
awk -F":" '{print $1,$3}' /etc/passwd #多了一个逗号,$1与$3使用空格分隔
awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd #自定义输出
awk -F: '{print NF}' /etc/passwd #显示每行有多少字段
awk -F: '{print $NF}' /etc/passwd #将每行第NF个字段的值打印出来
awk -F: 'NF==4 {print}' /etc/passwd #显示只有4个字段的行
awk -F: 'NF>2{print $0}' /etc/passwd #显示每行字段数量大于2的行
awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd #依次打印行号,字段数,最后字段值,制表符,每行内容
2. top命令:显示系统中各个进程的资源占用状况。
top:显示系统中各个进程的资源占用状况,类似于Windows的任务管理器
-b 批处理
-c 显示整个命令行而不只是显示命令名
-I 忽略失效过程
-s 保密模式
-S 累积模式
-i<时间> 设置间隔时间
-u<用户名> 指定用户名
-p<进程号> 指定进程
-n<次数> 循环显示的次数
示例: top -d 1 #设置top的显示间隔(以秒计)
top -n 3 #设置top退出前迭代的次数
top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数
3. netstat:用于显示各种网络相关信息,端口占用情况、监听端口。
- 列出所有端口 (包括监听和未监听的) 列出所有端口 netstat -a 列出所有 tcp 端口 netstat -at
- 列出所有处于监听状态的 Sockets 只显示监听端口 netstat -l
4. grep 命令用于查找文件里符合条件的字符串。
场景: 系统报警显示了时间,但是日志文件太大无法直接 cat 查看。(查询含有特定文本的文件,并拿到这些文本所在的行)
解决:grep -n ‘2019-10-24 00:01:11’ *.log
Linux 里利用 grep 和 find 命令查找文件内容
从文件内容查找匹配指定字符串的行:
$ grep "被查找的字符串" 文件名
例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件
grep "thermcontact" /.in
从文件内容查找与正则表达式匹配的行:
$ grep –e "正则表达式" 文件名
查找时不区分大小写:
$ grep –i "被查找的字符串" 文件名
查找匹配的行数:
$ grep -c "被查找的字符串" 文件名
从文件内容查找不匹配指定字符串的行:
$ grep –v "被查找的字符串" 文件名
从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 "ERROR" 的行:
$ find / -type f -name "*.log" | xargs grep "ERROR"
例子:从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 "thermcontact" 的行:
find . -name "*.in" | xargs grep "thermcontact"
5. less 与 more 类似,但使用 less 可以随意浏览文件
less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less
在查看之前不会加载整个文件。
在 less 查看日志文件时,
1. 可以按大写 F,就会有类似 tail -f 的效果,读取写入文件的最新内容,
按 ctrl+C 停止。
3. 可以按 v 进入编辑模型, shift+ZZ 保存退出到 less 查看模式。
4. 可以按 :e 查看下一个文件, 用 :n 和 :p 来回切换。
6. tail 命令可用于查看文件的内容- 查日志tail -f notes.log
tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件 要跟踪名为 notes.log
的文件的增长情况,请输入以下命令:
tail -f notes.log
7. HashMap的底层原理简单了解。
HashMap的底层,hashmap的底层是由数组组成,数组默认长度是16,无序,非线程安全。
HashMap注意点:
HashMap是线程不安全的HashMap是允许你的键或者值为null的HashMap是不能保证随着时间的推移,你里面元素之间的顺序不变,原因就在于map中存放hash值的数组在扩容的时候会重新计算原先元素在新数组中位置的;HashMap是无序的在jdk1.7是基于数组加链表的形式实现的在1.8后是基于数组+链表+红黑树,他在进行存值的时候会将k值进行一个hash运算,然后找到一个存储位置,那么如果这个存储位置上有值的话,那么就将他们的k进行对比,如果k相同的会就进行一个值的覆盖,他会在后面的一个方法中进行返回,如果k不同的话会会以红黑树或者链表的形式进行存储,如果超过了他的容量的话,他就会以2次幂进行扩容,是因为容量是2的n次幂,可以使得添加的元素均匀分布在HashMap中的数组上,减少hash碰撞,避免形成链表的结构,使得查询效率降低。
在jdk1.7中,只是单纯的数组+链表的结构,但是如果散列表中的hash碰撞过多时,会造成效率的降低,所以在JKD1.8中对这种情况进行了控制,当一个hash值上的链表长度大于8时,该节点上的数据就不再以链表进行存储,而是转成了一个红黑树。