面试中碰到的难点问题(个人--持续更新中。。。。)

1、Union和Union all的区别

        Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

        Union all:对两个结果集进行并集操作,包括重复行,不进行排序。

2、数据库的优化

        1)选取最合适字段属性

                关系型数据库可以支持大数据量的存取,但是一般来说表越小,它执行的速度也就会越快。因此,在新建表的时候,在满足我们业务需求的基础上,尽可能的将字段的宽度设置的小一点。

        2)数据库索引

                索引是提高数据库性能最常用的方法,它可以大大提高数据库查询的效率,尤其是在查询语句当中包含有MAX(),MIN()和ORDER BY这些函数和语句的时候,性能提高更为明显。

                通常情况,索引应建立在那些将用于JOIN连接,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。如用户表中的性别字段就不适合创建索引(因为性别只有男或女两个值),在这样的字段上创建索引不仅不会提高数据库查询的效率,反而有可能降低数据库的性能。

                索引并不是越多越好,索引固然可以提高相应的SELECT的效率,但同时也降低了INSERT及UPDATE 的效率,因为INSERT或UPDATE 时有会更新索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

3、Sql优化

        1)尽量避免使用子查询,可以使用JOIN链接查询替代

                常用的关系型数据库都支持子查询,子查询使用SELECT语句创建一个查询结果,然后把这个结果作为一张临时表用在另一个查询中。使用子查询可以一次完成多步SQL操作,也可以避免事务或者表锁死,且写起来比较容易。但是使用子查询MYSQL会在内存中创建一张临时表供外层查询使用,所以会降低查询的效率。这时候我们可以使用JOIN链接操作来替代子查询。

        2)UNION All能满足业务需求不要使用UNION

                如果我们需要将两个或者多个SELECT语句的结果作为合并为一个整体显示出来,我们可以用UNION或者UNION ALL关键字。UNION(联合)和UNION ALL的作用是将多个结果合并在一起显示出来。

        两者的区别是:

                UNION会自动压缩多个结果集合中的重复结果,而UNION ALL 则将所有的结果全部显示出来,不管是不是重复。所以当UNION ALL能满足业务需求的时候,尽量使用UNION ALL而不用UNION。

        3) WHERE子句尽量避免使用!=或<>操作符

                在WHERE子句中使用!=或<>操作符,查询条件不会使用索引,会进行全表查询。即影响查询效率。

        4) WHERE子句使用OR的优化

                通常情况我们可以使用UNION ALL或UNION的方式替换OR会得到更好的效果。因为WHERE子句中使用了OR,将不会使用索引。

        5)WHERE子句使用IN或NOT IN优化

                IN和NOT IN也要慎用,否则可能会导致全表扫描。

        6) WHERE子句中使用IS NULL或IS NOT NULL优化

                在WHERE子句中使用IS NULL或IS NOT NULL判断,索引将被放弃使用,会进行全表查询。

        7) LIKE语句优化

                一般情况下不建议使用LIKE操作,特别是数据量较大的表。

        8) WHERE子句中避免对字段进行表达式操作

                尽量不要在WHERE子句中的=左边进行函数、算数运算或其他表达式运算,否则系统将无法正确使用索引。

        9)一定不要用SELECT * FROM TABLENAME

                在定义SQL语句字段列表替换"*",尽量避免返回无用的时候,要用具体的的字段。

        10) LIMIT分页优化

                MYSQL数据库实现分页一般都会使用LIMIT,但是当偏移量比较大时,LIMIT的效率会非常低,导致查询超时。

4、Linux查看进程

        1)ps命令------显示所有运行中的进程

        2)top命令------top命令提供了运行中系统的动态实时视图

        3)显示进程的树状图------pstree以树状显示正在运行的进程

        4)使用pgrep命令------pgrep能查找当前正在运行的进程并列出符合条件的进程ID

        5)htop是一个类似top的交互式进程查看工具,但是可以垂直和水平滚动来查看所有进程和他们的命令行------进程的相关操作(killing,renicing)不需要输入PID。要安装htop输入命令

        6)atop工具------atop是一个用来查看Linux系统负载的交互式监控工具。它能展现系统层级的关键硬件资源(从性能角度)的使用情况,如CPU、内存、硬盘和网络。

5、cookie和session的区别

        (1)cookie数据存放在客户的浏览器上,session数据放在服务器上

        (2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session

        (3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE

        (4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。

        (5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中

6、Java序列化

        序列化:把对象转为字节序列的过程称为对象的序列化;

什么时候需要序列化

        把内存中的对象状态保存到一个文件或数据库中的时候;用套接字在网络上传送对象的时候。

如何实现序列化

        我们自己实现一个Person类,在类当中定义成员变量name,age,sex,stuId,count,如果要将Person进行序列化只需要实现Serializable接口即可

7、怎么解决线程安全问题

第一种方法:同步代码块

        格式:

        synchronized(锁对象) {

               可能会出现线程安全问题的代码(访问共享数据的代码)

        }

        注意:

                1、通过代码块的锁对象,可以是任意的对象

                2、必须保证多个线程使用的锁对象是同一个

                3、锁对象的作用是把同步代码快锁住,只允许一个线程在同步代码块执行

        同步代码块的原理:

                使用了一个锁对象,叫同步锁,对象锁,也叫同步监视器,当开启多个线程的时候,多个线程就开始抢夺CPU的执行权,比如现在t0线程首先的到执行,就会开始执行run方法,遇到同步代码快,首先检查是否有锁对象,发现有,则获取该锁对象,执行同步代码块中的代码。之后当CUP切换线程时,比如t1得到执行,也开始执行run方法,但是遇到同步代码块检查是否有锁对象时发现没有锁对象,t1便被阻塞,等待t0执行完毕同步代码块,释放锁对象,t1才可以获取从而进入同步代码块执行。

                同步中的线程,没有执行完毕是不会释放锁的,这样便实现了线程对临界区的互斥访问,保证了共享数据安全。

                缺点:频繁的获取释放锁对象,降低程序效率

第二种方法:同步方法

        使用步骤:

        1、把访问了共享数据的代码抽取出来,放到一个方法中

        2、在该方法上添加 synchronized 修饰符

        格式:

        修饰符 synchronized 返回值类型 方法名称(参数列表) {

                 method body

        }

        同步方法的也是一样锁住同步的代码,但是锁对象的是Runable实现类对象,也就是this,谁调用方法,就是谁,在这里就是创建的run对象

        静态的同步方法,添加一个静态static修饰符,此时锁对象就不是this了,静态同步方法的锁对象是本类的class属性,class文件对象(反射)

第三种方法:Lock接口

        java.util.concurrent.locks.Lock

        Lock接口中的方法:

        void lock():获取锁

        void unlock():释放锁

        Lock接口的一个实现类

        java.util.concurrent.locks.ReentrantLock implements Lock接口

        使用方法:

                1、在Runable实现类的成员变量创建一个ReentrantLock对象

                2、在可能产生线程安全问题的代码前该对象调用lock方法获取锁

                3、在可能产生线程安全问题的代码后该对象调用unlock方法获取锁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值