Java面试总结

线程池静态方法:

https://zhuanlan.zhihu.com/p/33725107

线程池的优点:

重用线程池中的线程,减少因对象创建,销毁所带来的性能开销;

能有效的控制线程的最大并发数,提高系统资源利用率,同时避免过多的资源竞争,避免堵塞;

能够多线程进行简单的管理,使线程的使用简单、高效。

1、Executors.newSingleThreadExecutor();

2、Executors.newCachedThreadPool();

3、Executors.newFixedThreadPool(1000);

4、newScheduledThreadPool

第一种方式是创建一个只有一个线程的线程池,它的corePoolSize和maximumPoolSize都设置为1,使用的是LinkedBlockingQueue;

第二种方式创建的线程池将corePoolSize设置为0,将maximumPoolSize设置为Interger.MAZ_VALUE,使用的是SynchronousQueue;

第三种方式创建的线程池他的corePoolSize与MaximumPoolSize是相等的并且统一由用户自己设置,使用的是LinkedBlockingQueue;

数据库建表须要考虑什么:

  第一,如果在设计的时候,已经明确地知道这个系统的数据量不会太大,比如一个中学的图书管理系统,最多有5万条书本的数据,过去一个月里借阅记录不会超过1千条。也就是说,表之间的关联代价不会太高,那么用“三范式”的原则是必需的。毕竟三范式能避免数据冗余带来的更新插入上的“需要同时多表里相同字段”的麻烦。

        第二,如果表的数据量很大,如前面举的在线购物网站的例子,我们可能就需要冗余数据。在订单流水表里,同时放入用户邮件地址和商品名的字段。

        在得到“免去连接操作”的好处同时,也得付出相应的代价,比如用户一旦更新了邮件地址,那么我们就需要同时在会员表和订单流水表里修改该字段,这就是冗余带来的后果。

https://blog.csdn.net/dqswuyundong/article/details/6700384

第三范式

索引好处坏处

好处 :

–帮助用户提高查询速度 

–利用索引的唯一性来控制记录的唯一性 

–可以加速表与表之间的连接 

–降低查询中分组和排序的时间 

坏处: 

–存储索引占用磁盘空间 

–执行数据修改操作(INSERT、UPDATE、DELETE)产生索引维护 

五大约束:主键,外键,默认,检查,唯一约束

数据库存储过程:

https://blog.csdn.net/moxigandashu/article/details/64616135

在普通模式下获取数据,用户需要输入SQL命令与数据库进行交互,而存储过程是编写好的SQL命令,存储在数据库中,用户操作的时候只需要调用存储过程,而不用重新输入冗余繁杂的SQL命令。

  • 存储过程有什么优点? 

1.存储过程可以重复使用,大大减小开发人员的负担; 

2.对于网络上的服务器如阿里云数据库,可以大大减小网络流量,因为只需要传递存储过程的名称即可; 

3,可以防止对表的直接访问,只需要赋予用户存储过程的访问权限。

MVC自己理解:理想情况下,所有的业务逻辑都应该抽象 Model 层。

  1. 理想情况下,控制层只是负责响应视图的事件和各个业务模型间的调度

模型(Model) 用来固化数据。封装与业务逻辑相关的数据and对数据的处理方法。模型它不关心业务是怎么实现的,它只关心数据是如何存储的。 DAO** DAO (Data Access Objects) 数据访问对象 是JAVA开发中的概念。说白了就是把那些SQL语句封装成一个类,把不同的SQL语句封装成一个个方法。然后需要用到SQL语言的时候就把DAO类实例化为对象,在通过调用对象中的方法来,完成对SQL语句的使用。

控制器(Controller)控制器起到不同层面间的组织作用,用于控制应用程序的流程。 控制器层里常常放一些业务逻辑方面的代码,一些业务方面的逻辑事件封装成一个个类中的方法,且方法中必调用第2层中的DAO对象,来完成业务逻辑方面的操作server** server层主要是对业务逻辑的梳理。具体的比如登陆、注册、添文章之类的基础功能事件都被分装成不同的类,不同类中的方法。创建一个叫做“用户”的类,类中写各种方法,什么注册呀,登录呀,账号密码匹配什么的统统写里面。

视图(View)

视图层用来显示数据,设计、输出网页。主要使用HTML、css、js语言,以及一点点服务器脚本语言controller** controller层虽然称作controller,不过这里面的代码和控制器真的没什么关系哒。里面是一些服务器与用户数据的交互,直接调用server层里的类,并且实例化它,输出需要的数据。其实就是服务端与用户端数据的交互啦view view层 里放的主要就是HTML、css、js这些代码

优点:代码简洁、整齐。要改个BUG什么的,找出问题后就去相应的层中直接秒改。这样就不用在一坨坨乱七八糟的代码中瞪大眼睛找具体的代码块在哪里啦。

  1. 协同开发时方便,DBer负责写model的代码,后台程序员负责写controller代码,前端工程师负责写view层。
  2. 代码维护方便,

springboot作用:

优点:

1.创建独立的Spring应用程序 

2.嵌入的Tomcat,无需部署WAR文件 

3.简化Maven配置 

4.自动配置Spring 

5.提供生产就绪型功能,如指标,健康检查和外部配置 

6.开箱即用,没有代码生成,也无需XML配置

缺点:是集成度较高,使用过程中不太容易了解底层。

ArrayList和Array区别

map键特点,怎么确定唯一性

Hashtable与 HashMap类似,它继承自Dictionary类。不同的是:它不允许记录的键或者值为空;它支持线程的同步(即任一时刻只有一个线程能写Hashtable),因此也导致了 Hashtable在写入时会比较慢。

HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null。HashMap不支持线程的同步(即任一时刻可以有多个线程同时写HashMap) 

关流,异常怎么处理:

class MyClose implements AutoCloseable{

@Override

public void close() throws IOException {

System.out.println("myClose类的close()");

}

}

public class Io1 {

public static void main(String[] args) throws IOException {

 

demo1();// 1.7版本

demo2();//1.7版本之前标准异常处理代码

}

 

private static void demo2() throws IOException {//1.7版本之前标准异常处理代码

FileOutputStream fos = null;

FileInputStream fis = null;

try {

fis = new FileInputStream("aaa.txt");// 可能文件不存在

fos = new FileOutputStream("b.txt");

int b;

while ((b = fis.read()) != -1) {// 可能文件不可读

fos.write(b);// 可能文件不可写

}

System.out.println("tryblock1");

}

finally{

try {

if (fis != null) {

fis.close();

}

System.out.println("tryblock2");

} finally {

if (fos != null) {// 可能fis没关上抛出异常,保证fos.close()执行

fos.close();

}

System.out.println("finallyblock1");

}

System.out.println("finallyblock2");

}

}

private static void demo1() throws IOException {// 1.7版本

try(

FileInputStream fis = new FileInputStream("aaa.txt");

FileOutputStream fos = new FileOutputStream("b.txt");

MyClose myClose = new MyClose();// 这里的try是()而不是{},()里面的对象必须实现AutoCloseable接口,执行完之后自动关流

){// 剩下的读写代码写在代码块{}中,执行完之后自动关流

int b;

while ((b=fis.read())!=-1){

fos.write(b);

 

}

}

}

}

 

多态:同一行为的多种表现形式,条件:1,继承父类,实现接口2、重写方法3、父类引用指向子类对象

string类可以继承吗:不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。public final class String

抽象类好处坏处:

继承好处坏处优点:a因为大部分是继承而来的,实现代码重用,减少代码书写量;

b很容易修改和扩展已有的实现

缺点:a打破了封装,因为基类向子类暴露了实现细节

b白盒重用,因为基类的内部细节通常对子类是可见的

c当父类的实现改变时可能要相应的对子类做出改变

d不能在运行时改变由父类继承来的实现

接口的好处?坏处?

优点:帮助Java语言实现一个类似于多继承的功能.但是实现的多继承功能不会使代码中的类之间出现网状关系,而是比较清楚的树状关系,类似于家谱的感觉。

缺点:如果向一个java接口加入一个新的方法时,所有实现这个接口的类都得编写具体的实现。

ArrayList数组之间转换:arrays.asList转集合,list.toArray(new String[list.size()])

两个对象之间比较:实现compareabled接口的comparTo方法

redis存储类型,怎么算长度:

hashcode和equals方法作用:

1、equals方法用于比较对象的内容是否相等(覆盖以后)

2、hashcode方法只有在集合中用到

3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。

4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。

 

5、HashSet中add方法源代码:

public boolean add(E e) {  

return map.put(e, PRESENT)==null;  

}  

map.put源代码:

 

  1. <pre name="code" class="java"> public V put(K key, V value) {  
  2.         if (key == null)  
  3.             return putForNullKey(value);  
  4.         int hash = hash(key.hashCode());  
  5.         int i = indexFor(hash, table.length);  
  6.         for (Entry<K,V> e = table[i]; e != null; e = e.next) {  
  7.             Object k;  
  8.             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {  
  9.                 V oldValue = e.value;  
  10.                 e.value = value;  
  11.                 e.recordAccess(this);  
  12.                 return oldValue;  
  13.             }  
  14.         }  
  15.   
  16.         modCount++;  
  17.         addEntry(hash, key, value, i);  
  18.         return null;  
  19.     }</pre>  
  20. <pre></pre>  
  21. <pre></pre>  

前端会吗

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值