知识点问答

1、delete 和 truncate删除数据的区别?

  delete删除的时候是一条一条的删除,配合事务可以将

删除的数据找回,且删除后uid不会重置。

  truncate删除将整个表摧毁,然后再创建一张一模一样的表,它删除的数据无法找回。

2、HashSet和TreeSet的区别?

  Hashset底层数据结构是:Hash数组;TreeSet的底层数据结构是:二叉树

  Hashset的应用场景:元素去重;TreeSet的应用场景:自然排序

  二者都是无序的:无序是指:存入元素的顺序与取出元素的顺序不一致,无序不代表随机

3、抽象类和接口的实际应用?

  抽象类:

  接口:模板、匿名内部类、接口回调、面向接口编程。

4、Compareter接口中compare()方法的返回值是什么?是否有具体的类实现该接口?可以用类实现该接口吗?

  返回值是int类型;

5、什么是存储过程?用什么来调用?

  存储过程是一个预编译的SQL语句,优点是允许模板化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单存SQL语句执行要快。

  调用: 

  (1)可以用一个命令对象来调用存储过程。

  (2)可以供外部程序调用,比如:java程序。

6、Java中 a+=b和a=a+b有什么区别?

  两个变量的数据类型一致时,没有区别。

  两个变量的数据类型不同时,考虑数据类型自动转换,数据的强转型。

7、线程资源共享的问题?

  作用:不同的线程操作同一个资源:卖票的案例、生产者消费者案例。

  注意:加锁(两种) ----   synchronized、lock    -----  sleep、wait

8、网络编程注意事项?

  网络编程3要素:

  几大协议:          get、post

9、群聊的步骤?

  发送之前多个客户端连接服务端,存到容器里面ConcurrentHashMap

10、runable和callable的区别?

  Callable规定的方法是call(),Runnable规定的方法是run()。其中Runnable可以提交给Thread来包装下,直接启动一个线程来执行,而Callable则一般都是提交给ExecuteService来执行。 

  Callable的任务执行后可返回值,而Runnable的任务是不能返回值得 

  call方法可以抛出异常,run方法不可以

  运行Callable任务可以拿到一个Future对象,c表示异步计算的结果。

11、多态的好处和弊端?

  缺点:因为是子类对象指向父类引用,所以子类特有的方法不能被调用。(对象的上转型)有多个子类方法的时候,不清楚是谁的方法。

  优点:满足了OCP原则,创建类是欢迎的出bug几率小,但是不能更改代码,出bug几率高。在需求改变时会节省代码量。

12、什么是序列化和反序列化?

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

  反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

13、什么是存储过程?为什么要用存储过程?

  提前将sql语句翻译好放在数据库中,执行时就不用在翻译而是直接调用。减少了执行的时间,提高了执行的效率。

  如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。

  翻译:把sql语句翻译成数据库能执行的语句,然后在执行该语句。

 14、什么是ACID?什么是事务?事务的应用场景?

  通常的观念认为,事务仅与数据库相关。

  事务必须服从ISO/IEC所制定的ACID原则。(原子性--atomicity、一致性--consistency、隔离性--isolation、持久性--durability)的缩写。

    事务的原子性表示,事务执行过程中的任何失败都将导致事务所做的任何修改失效。

    一致性表示,一个事务中,事务前后数据的完整性必须保持一致。

    隔离性表示,多个用户并发访问数据库时,一个用户的 事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。

    持久性表示,一个事务一旦被提交,它对数据库中数据的改变            就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

  用于一些对操作过程的完整性比较高的程序中。eg:银行系统。

 15、同步代码块和同步函数的区别?

   同步代码块可以绑定任意对象,而同步函数只能绑定该对象this,static同步函数只能绑定字节码类名.class  

  如果多个线程使用同一个锁的话,那么两者均可以使用,如果存在多个锁的话,只能使用同步代码块,一般使用同步代码块

16、error和exception的区别?

  Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。

  Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

  CheckedException:(编译时异常) 需要用try——catch显示的捕获,对于可恢复的异常使用CheckedException。

  UnCheckedException(RuntimeException):(运行时异常)不需要捕获,对于程序错误(不可恢复)的异常使用RuntimeException。

17、ArrayList的内部的工作原理和应用场景?LinkedList?

  ArrayList是基于数组实现的,其构造函数为

    private transient Object[] elementData;    private int size;

  ArryList初始化时,elementData数组大小默认为10;

  每次add()时,先调用ensureCapacity()保证数组不会溢出,如果此时已满,会扩展为数组length的1.5倍+1,然后用array.copy的方法,将原数组拷贝到新的数组中;

  ArrayList线程不安全,Vector方法是同步的,线程安全;

 

  LinkedList是基于双链表实现的。

    Object element; 

    Entry next,  previous;

  初始化时,有个header Entry,值为null。

  使用header的优点是:在任何一个条目(包括第一个和最后一个)都有一个前置条目和后置条目,因此在LinkedList对象的开始或者末尾进行插入操作没有特殊的地方。

  使用场景

    (1)如果应用程序对各个索引位置的元素进行大量的存取或删除操作,ArrayList对象要远优于LinkedList对象;

    (2)如果应用程序主要是对列表进行循环,并且循环时候进行插入或者删除操作,LinkedList对象要远优于ArrayList对象;

ArrayList内部存入的是一个Object的数组,所以可以存储不同类型的数组。(第一次数组的长度为10的话,扩容后就为15);应用场景:查询和

18、TreeSet的排序原理

     实现comparable接口,重写compareTo()方法,因为treeSet底层数据结构是二叉树,当返回值时负数的时候添加到左分支,返回值是正数的时候添加到右分支。

19、Jsp的九大内置对象是什么?

     request、response、session、application、page、pageContext、exception、out、config

20、IO流解决了什么问题?

    从内存到硬盘、从硬盘到内存、从输入设备到内存的数据传输问题

21、sql语句的执行步骤?

    1、客户端把sql语句发送到服务器,

    2、服务器进程对该语句进行解析(翻译),发送到mysql数据库,

    3、语句解析只是对SQL 语句的语法进行解析,以确保服务器能够知道这条语句到底表达什么意思。语句解析完成之后, 数据库服务器进程才会真正的执行这条SQL 语句。这个语句执行也分两种情况。 一是若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递给客户端,而不是从数据库文件中去查询数据。 二是若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中(buffer cache)。

    4、当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的一段代码。它的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动作。

    数据库缓存只有在数据库服务器端才存在,在客户端是不存在的

22、元数据的类型和作用?

    元数据分类:数据库元数据、请求参数元数据、结果集元数据

    数据库元数据:能够获取当前数据库的一些信息(数据库的名字、连接的url、连接的用户名、数据库的版本信息)

    请求参数元数据:能够清楚的知道当前sql语句中有多少个占位符

    结果集元数据:能清楚的知道当前访问的这个数据库的列名是什么

 23、Collection和Map集合的区别?(集合框架弄懂)

 

24、TreeSet排序原理

 

 

25、线程之间的通信是怎么实现的?

 

 

26、Session的解决办法?

问题得由来:访问一哥网站时,有两类请求。一种请求叫做无状态的请求,有一种请求叫做有状态。

无状态,例如:登录页面,类似这种页面,哪个tomcat给我们响应都是一样的,不需要区分。这是我们最喜欢的。集群的动态伸缩性(增加节点,移除节点)。

有状态,例如:系统登录后,假如用户的请求被转发到tomcat1上,这时系统会写一个当前用户的信息放入session中。这种情况就称为有状态的,问题就来了。nginx负载均衡后,下一次用户的请求就被转发tomcat2上。tomcat2上没有session。系统就会要求用户去登录,这显然是不合理的。把这个问题称作session共享问题。
解决办法:

1.      session同步

tomcat支持动态将某个tomcat下的session复制到其他的tomcat中。但是这个方式是早期的企业级应用习惯的方式。现在很少使用。(这种方式在集群数量很少时,结果还是可以的。但如果集群数量庞大。都需要复制session,这时会因为网络延迟,或者session的内容非常大。都会造成隐患,这时可能读到脏数据。)

2.    Session黏着-放在服务器

对ip地址或者域名地址进行hash;或者uri进行hash。(

缺点:用户浏览器的IP地址hash以后满足单调性。会可能造成资源的分配不均衡,负载均衡就达不到到目的。有的服务器负载过重,有的服务器负载过轻,显然没有充分利用资源。
因为uri比ip地址相应数量多,变化就多,因此uri-hash比ip-hash分布更均衡些。uri-hash需要第三方软件支持pcre-8.02.tar.gz、Nginx_upstream_hash-0.3.1.tar.gz)

3.    将信息放到cookie-放在客户端

session存在服务器端,会对服务器产生压力。如果将信息保存到cookie中,减轻了服务器的压力,同时每个客户端的压力也很小。因为只保存自己的信息。这种方式在实际的开发中广泛的采用。(缺点:cookie可以被禁用,cookie要随着浏览器传递,增大了传输的内容,cookie大小有限制。

4.    终极的解决方案-新SSO单点登录

session从系统中独立出来。Apacheshiro顶级安全框架,它的session管理就是独立出来的。目前主流做法是利用redis作为session管理的实现,因为redis访问极其快速。

27、Session的解决办法?

 

 

 

 
posted @ 2018-11-29 09:39  cmlx  阅读(128)  评论(0)    收藏  举报