七牛云面试知识点

1.final,finally,finalize的区别?

final是一个修饰符,如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改,被声明为final的方法只能使用,不能重载。

finally是异常处理时提供finally块来执行任何清除操作。如果抛出异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块。

finalize是方法名,finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法在垃圾收集器在确定这个对象没有被引用的时候对这个对象调用。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法在垃圾收集器删除对象之前对这个对象调用的。

2.排序中快排是稳定的吗?说出几种稳定的排序,哪些排序的空间复杂度为O(n)?

快速排序是不稳定的排序,快排的过程是刚开始以第一位为基准,然后从最右边比较数据,如果比这位数据小,则交换位置,然后从这个数字k的左边比较,如果比k大,则将右边的k和这个元素交换位置,直到最终确定k的位置,然后依次在前半部分和后半部分进行比较排序,直到全部排序完成。快速排序时间复杂度最好情况下O(nlog 2 n)

稳定的排序有冒泡排序,直接插入排序,折半插入排序,归并排序和基数排序。

空间复杂度为O(n)的排序为归并排序和二叉树排序。归并排序是稳定的排序,该算法采用分治法。将已有序的子序列合并,得到完全有序的序列;即先把每个子序列有序,再使子序列时间有序。最后将两个有序表合并成一个有序表,称为二路归并。

3.线程和进程的区别与联系

线程是一种在同一个进程中可以共享资源的轻量级进

 (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; 

 (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源 

 (3)线程是处理器调度的基本单位,但进程不是. 

 (4)二者均可并发执行.

 进程是资源分配的基本单位,线程是调度的基本单位。进程包含线程,线程共用进程的资源。

4.3种熟悉的设计模式

单例模式,适配器模式,简单工厂模式,代理模式

单列模式:一个类始终只能创建一个实例,则这个类称为单例类,这个模式称为单例模式。

public class Singleton{

    private Singleton(){}

    private final static Singleton instance=new Singleton();

    public static Singleton getInatance(){

        return instance;

    }

}

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是不同工厂模式的一个特殊实现。

代理模式是当客户端代码需要调用某个对象时,客户端实际上不关心是否准确得到该对象,它只是一个能提供该gongn的对象即可,此时我们就可返回该对象的代理。

代理是一个java对象代表另一个java对象来采取行动

public class Imageproxy implements Image{

    //组合一个image实例,作为被代理的对象

    private Image img;

    public Imageproxy(Image img){ this.img=img;}

    public void show(){

        if(img==null){ img=new BigImage(); }

        img.show();

    }

}

5.怎么处理多线程死锁,避免死锁

  1.加锁顺序:当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生。

  2.加锁时限:在尝试获取锁的时候加一个超时时间,这就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。若一个线程没有在给定的时限内成功获得所有需要的锁,则会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试。这段随机的等待时间让其它线程有机会尝试获取相同的这些锁,并且让该应用在没有获得锁的时候可以继续运行。

  3.死锁检测:主要针对那些不可能实现按序加锁并且锁超时也不可行的场景。

每当一个线程获得了锁,会在线程和锁相关的数据结构中将其记下。除此之前,每当有线程请求锁,也需要记录在这个数据结构中。每当一个线程请求锁失败时,这个线程可以遍历锁的关系图看看是否有死锁产生。 当检测到死锁时,一个可行的方法是释放所有锁,回退,并且等待一段随机的时间后重试。另一个更好的方案是给这些线程设置优先级,让一个线程或几个线程回退,剩下的线程就像没有发生死锁一样继续保持着它们需要的锁。

6.同步机制怎么实现

  用synchronized关键字修饰同步方法

 同步有几种实现方法,都是什么?分别是synchronized,wait与notify

 wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
 notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
 notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

7.UDP和TCP的区别

1.基于连接与无连接;TCP是面向连接的协议,UDP无连接
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;

5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证

8.http的get post head

head只请求页面的首部,类GET方法,不响应页面Body部分,用于获取资源的基本信息,即检查链接的可访问性及资源是否修改。

http 4xx 客户端错误 400 错误请求 401 未认证  402 需要付费 403 禁止 404 未找到 405方法不允许 406 不接受 408 请求超时  414 请求URI太长

http 5xx 服务器错误  500 服务器内部错误  501 未实现  502 网关失败 504 网关超时 505 HTTP版本不支持

9.git怎么撤销本地文件的修改

1.未加入缓存区,撤销文件修改  git checkout -- file

2.已加入缓存区,撤销文件提交  git reset HEAD file 或 git rm --cached file

3.已提交到本地,回滚提交  git reset --HARD commit_id/HEAD^n

4.已push到远程 1>git revert的方式 git revert commit_id   //将要撤销的提交revert为一次新的提交,这样不仅提交被撤销了,而且本地分支也比远程分支多一次提交

                      2)git push origin master //推送到远程  这种方式是最方便的,但缺点是多了2次无用的commit,使整个分支的commit不再整洁。 

                         3)可删除远程分支,然后回滚本地分支,然后将本地分支push到origin

10.linux命令,查看占用端口,查看内存情况

  查看端口占用情况 lsof -i:端口号   查看某一端口占用的情况,如 lsof -i:8000

      netstat -tunlp |grep  端口号 查看指定的端口号的进程情况

      netstat -anp |grep 端口号 

  查看内存占用情况  输入 top    输入 ps aux --sort -rss 查看内存

     输入cat/proc/meminfo    输入   gnome-system-monitor

11.数据库如何建立索引

唯一索引 create unique index 索引名 on 表名  创建唯一性索引,可以保证数据库中每一行数据的唯一性。

可以大大加快数据的索引速度,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

可以显著减少查询中分组和排序的时间  通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统性能。




发布了36 篇原创文章 · 获赞 19 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_27182767/article/details/80296341