JAVA面试总结

JAVA基础知识

string的常用方法 

 https://blog.csdn.net/lz_1014/article/details/86241850

   1. length():获取字符串的长度,其实也就是字符个数

   2. equals(Object obj):比较字符串的内容是否相同

   3. split():去除字符串中指定的的字符,然后返回一个新的字符串

   4. substring(int start):从start开始截取字符串

   5. charAt(int index):获取指定索引处的字符

   6. indexOf(String str):获取str在字符串对象中第一次出现的索引

   7. replace(char oldChar, char newChar):将指定字符替换成另一个指定的字符

   8. contains(CharSequence s):查看字符串中是都含有指定字符

   9. concat(String str):在原有的字符串的基础上加上指定字符串

 

 10. trim():去除字符串两端空格

 11. subSequence(int beginIndex,int endIndex ):截取字符串中指定位置的字符组成一个新的字符串

 12. toCharArray():把字符串转换为字符数组

 13. toLowerCase():把字符串转换为小写字符串

 

 14. toUpperCase():把字符串转换为大写字符串

 

字符串转换成整数
   interget.parseInt()​
​   interget.valueOf()

   这两个方法都是java.lang.Integer类中的静态方法。当输入的字符串不是有效的整数,这两个方法都会抛出NumberFormatException异常。

   Integer.parseInt()和Integer.valueOf()最主要的不同的就是

     . Integer.parseInt()方法返回基础数据类型int

      .valueOf()返回的是java.lang.Integer对象。

 

String,Stringbuilder与Stringbuffer的区别    

String,StringBuffer,StringBuilder三者都是用来创建和操作字符串的,

而String创建的字符串的值是不可变的,每次对字符串操作都会产生一个新的Sting对象,这样不仅效率低而且浪费内存空间,

   StringBuffer和StringBuilder两者创建的字符串,值是可变的,并且多次操作并不会产生新的对象,

三者的区别:

1)字符修改上的区别(主要)

    String:不可变字符串;

    StringBuffer:可变字符串、效率低、线程安全;

    StringBuilder:可变字符序列、效率高、线程不安全;

2)初始化上的区别,String可以空赋值,后者不行,报错

小结:

    1)速度:StringBuilder ----->StringBuffer ----->String (快----->慢);
    2)如果操作的数据很少,则使用String;
    3)单线程操作字符缓冲区,数据量大,使用StringBuilder;
    4)多线程操作字符串缓冲区,操作数据量大,使用StringBuffer;

 

字符串返回指定字符的下标的方法
   indexof()​,返回字符的首次出现的下标
   lastindexof()​返回字符最后一次出现的下标

 

字符串拼接的方法,以及区别

   append()​,concat(),+ 

  a:   concat()方法:String类的concat()方法(只能用于拼接字符串,不能拼接其他类型的数据)将指定的字符串拼接到该字符串的末尾。 并且字符串本身和拼接的字符串都不能为null,否则运行程序后会报空指针异常NullPointerException(编译时没有报错)。

  b:    "+":可以对字符,数字,字符串等数据类型的拼接

  c:   append()方法:可以对字符,数字,字符串等数据类型的拼接,结果返回一个StringBuffer类型的对象

 

 两个日期类型比较大小

   1.java.util.Date类实现了Comparable接口,可以直接调用Date的compareTo()方法来比较大小

       compareTo()方法的返回值,date1小于date2返回-1,date1大于date2返回1,相等返回0

   2.通过Date自带的before()或者after()方法比较

       before()或者after()方法的返回值为boolean类型

   3.通过调用Date的getTime()方法获取到毫秒数来进行比较

https://blog.csdn.net/lz199719/article/details/81261336?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

 

ArrayListLinkedList的区别

1).数据结构

      ArrayList是实现了基于动态数组的数据结构实现的,LinkedList是基于双链表实现的。

2).随机访问集合元素

      Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的,可以直接返回数组中index位置的元素,因此在随机访问集合元素上有较好的性能。

     LinkedList的随机访问集合元素时性能较差,因为需要在双向列表中找到要index的位置,再返回;

3).新增和删除操作

     对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

    因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组

4).内存

    因为ArrayList的每个索引的位置是实际的数据,

   而LinkedList需要更多的内存,因为LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。

 

hashmap的遍历模式,怎么写的,怎么获取key的集合

第一种:遍历HashMap的entrySet键值对集合

            1.通过HashMap.entrySet()得到键值对集合;

            2.通过迭代器Iterator遍历键值对集合得到key值和value值;

第二种:遍历HashMap键的Set集合获取值;

            1.通过HashMap.keySet()获得键的Set集合;

            2.遍历键的Set集合获取值;

第三种:遍历HashMap“值”的集合;

            1.通过HashMap.values()得到“值”的集合

            2.遍历“值”的集合;

https://www.cnblogs.com/xyfer1018/p/10434827.html

 

 hashmap和hashtable的区别

  HashMap和Hashtable都实现了Map接口,线程安全性,主要的区别有:线程安全性,同步(synchronization),以及速度。

   1).HashMap支持空键值对,而HashTable不支持空键值对

   2).HashMap的方法不是Synchronize的,所以线程不安全,效率高

         HashTable的方法是Synchronize的,所以线程安全,效率低

   3).HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsValue 和 containsKey。

   4).HashTable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现 

hashmap

线程不安全

允许有null的键和值

效率高一点、

方法不是Synchronize的要提供外同步

有containsvalue和containsKey方法

HashMap 是Java1.2 引进的Map interface 的一个实现

HashMap是Hashtable的轻量级实现

hashtable

线程安全

不允许有null的键和值

效率稍低、

方法是是Synchronize的

有contains方法方法

、Hashtable 继承于Dictionary 类

Hashtable 比HashMap 要旧

 

 

 

 

数据库

oracle​分页 ,MySQL分页 

  MySQL: 支持 LIMIT 语句来选取指定的条数数据, Oracle 可以使用 ROWNUM 来选取。

   oracle​分页:通过ROWNUM以及子查询的帮助下来进行分页

    select *from(

       select rownum r,t.* from(
             select e.*

              from emp e , dept d

            where e.deptNo = d.deptNo

             order by e.empNo desc ) t
        where rownum < =n)
    where r >= m;

 MySQL分页: select * from 【表名】 limit m,n;

    1)limit  前面不需要加 and 或者 where ,一般直接跟在语句末尾即可。 
    2)m 表示起始数据位置,即从第m条数据开始查询 
    3)n 表示该页数显示n条数据
 
mysql动态标签有哪些
 动态SQL片段  <sql>,<include>
 动态SQL标签  <select>,   <insert>,   <update>,   <delete>
 动态 sql 拼接   <if>,<foreach>,<choose>
 格式化输出     <where>,<set>,<trim>
 
 

mysql动态sql标签

   4.1 if 标签

      if 标签通常用于 WHERE 语句、UPDATE 语句、INSERT 语句中,

      通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。

  4.2 foreach 标签

      foreach 标签主要用于构建 in 条件,可在 sql 中对集合进行迭代。也常用到批量删除、添加等操作中。

  4.3 choose 标签
      有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。

      MyBatis 提供了 choose 元素,按顺序判断 when 中的条件是否成立,如果有一个成立,则 choose 结束。

       当 choose 中所有 when的条件都不满则时,则执行 otherwise 中的 sql。类似于 Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

  if 是与(and)的关系,而 choose 是或(or)的关系。

 

3.mysql取当天的函数

  mysql要实现获取当前时间、前后一天等时间需要用到两个函数:date_sub()函数和now()函数

    1、DATE_SUB() 函数:从日期内减去指定的时间间隔
            语法:DATE_SUB(date,INTERVAL expr type)

             date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。

    2、时间函数NOW()、CURDATE()、CURTIME()
             NOW()函数:当前时间(年月日时分秒)
             CURDATE()函数:当前时间(只包含年月日)
             CURTIME()函数:当前时间(只包含时分秒)

详细参照:https://blog.csdn.net/xhf852963/article/details/102794167


4.​mysql什么情况下索引失效

框架

 

forward和redirect的区别

   这两者都是servlet种的两种主要的跳转方式。forward又叫转发,redirect叫做重定向。

 两者的区别总结:

1. 从地址栏显示来说:
    1)forward是服务器内部的重定向,服务器直接访问目标地址的 url网址,把里面的东西读取出来,但是客户端并不知道,因此用forward的话,客户端浏览器的网址是不会发生变化的。
    2)redirect是服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新的地址。

2. 从数据共享来说:
    1)由于在整个定向的过程中用的是同一个request,因此forward会将request的信息带到被重定向的jsp或者servlet中使用。即可以共享数据
    2)redirect不能共享

3. 从运用的地方来说
    1)forword 一般用于用户登录的时候,根据角色转发到相应的模块
    2) redirect一般用于用户注销登录时返回主页面或者跳转到其他网站

4. 从效率来说:

          forword只有一次请求;而redirect有两次请求,
    1)forword效率高,而redirect效率低

5. 从本质来说:

    1)forword转发是服务器上的行为,而redirect重定向是客户端的行为

   详细的讲解: https://blog.csdn.net/weixin_37766296/article/details/80375106

 

1.redis

2.springboot

3.MyBatis

 

   ${}和#{}的区别

      #{}是预编译处理,${}是字符串替换。

     1) . Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值;

          Mybatis 在处理${}时,就是把${}替换成变量的值。

     2) .#{} 的参数替换是发生在 DBMS 中,而 ${} 则发生在动态解析过程中,

    3) .#{}方式能够很大程度防止sql注入,提高系统安全性。而${}方式无法防止Sql注入。

   4) .一般能用#{}的就别用${}。${}方式一般用于传入数据库对象,例如传入表名.

       MyBatis排序时使用order by 动态参数时需要注意,用${}而不是#{}

 

 

tomat部署文件放到呢: https://blog.csdn.net/liangjiabao5555/article/details/103875387

 

左连接和右连接的区别

左连接: LEFT JOIN 

                只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来。

右连接: INNER JOIN

                 右连接是只要右边表中有记录,数据就能检索出来。

having的用法

动态标签where和写死的where的区别


几种设计模式


单例模式的懒汉模式以及饿汉模式的区别
线程池的主要参数
什么时候创建核心线程池,什么时候在队列里,什么时候在最大线程池
aop和ioc是什么
常用注解方式
多列索引,最左匹配
rides的常用数据类型

1.死锁的原理

2.乐观锁,悲观锁
3.java跨平台的原理

5.代码管理怎么管理的

为什么有线程池
线程的创建

线程池的核心线程数,最大线程池

数据库去重的关键字

 

posted @ 2021-04-01 11:59  ~Forever  阅读(77)  评论(0编辑  收藏  举报