总结:面试中可能被问到的一些问题

【一】java默认的字符编码?int类型是多少位?
本地jvm的编码方式跟本机系统的字符编码方法有关,中国大部分是GBK,可以去cmd命令行输入“chcp”查看,936为GBK;
java程序的默认字符集是unicode,允许各种字符编码之间的相互转换,同时JVM的字符编码方式是可以被修改的。所以这里java读入文件时的字符编码是由系统的默认编码决定的。

int类型存储整数型,占4个字节,32位。

java有8大数据类型:

类型说明字节/位默认值
byte字节1个字节/8位0
short短整数型2个字节/16位0
int整数型4个字节/32位0
long长整数型8个字节/64位0L
float单精度浮点型4个字节/34位0.0f
double双精度浮点型8个字节/64位0.0d
boolean布尔类型根据具体java虚拟机实现的规范,可能是1位,也可能是一个字节,也可能是4个字节false
char字符类型2个字节/16位/u0000,表示为null,控制台输出为一个空格

扩展:

【首先,为什么要编码】:为什么要编码,不编码不行么?人类有很多种语言,而计算机的基本存储单位是“位元”也叫“二进制位”,二进制采用0和1来表示,可以通俗的说,尽管人类有很多种语言,但是计算器只认识0和1,所以要满足各种语言环境,必须要做各种拆分或者翻译工作,才能让计算机理解。
【常见的几种编码格式】:
①:ASCII码:总过128个,0-31是控制字符(回车等……)32-126是打印字符;
②:ISO-8859-1:在ASCII码的基础上又制定了一些标准用来扩展ASCII码,总过可以表示256个字符,(包含了大多数西欧语言字符),为单字节字符。
③:GB2312:GB 2312 或 GB 2312–80 是中华人民共和国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,通常简称GB,又称GB0,由中国国家标准总局发布,1981年5月1日实施。GB 2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。 为双字节编码,总的编码范围是 A1-F7,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。
④:GBK:和GB2312兼容,用来扩展GB2312,总共23940个码位,可以表示21003个汉字。
⑤:UTF-8:UTF-16 统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。而 UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6 个字节组成。

【二】String类的常用方法有那些?String可以被继承么?String、StringBuffer、StringBuilder的区别?

【第一点】:String中的常用方法:①:比较两个String对象是否想等equals(Object o);②:返回字符串长度,返回值为int类型,length()方法;③:replace():字符串替换;④:split():字符串分割;⑤:substring():字符串截取;⑥:trim()取出头部和尾部的空格;⑦:ValueOf():类型转换为string类型。大概说这些就差不多了……

【第二点】:String被final修饰,所以不能被继承。下图展示一下String源码部分。
在这里插入图片描述
【第三点】:String存储静态字符串常量,StringBuffer和StringBuilder存储动态字符串变量。StringBuilder是JDK5以后才引入,功能跟StringBuffer基本上一致,区别是StringBuffer为线程安全,StringBudiler为非线程安全。因为线程安全,方法都被synchronized修饰,所以效率上StringBuffer不及StringBudiler,所以推荐单线程环境使用StringBudiler,提高效率, 多线程使用StringBuffer。

【三】简述一下,项目中你用过的集合类?
说到集合,首先脑子里应该蹦出来两个接口“Collection”和“Map”,二者都来自于java.util包下。这就形成了两大体系。

首先说一下Collection体系:主要有三个主要的子接口,List(列表)、Set(集)、Queue(队列)。而List的两个最常见的实现类就是ArrayList和LinkedList:
ArrayList底层其实是一个有序的数组的实现,随着元素的增加而动态的增加,每个元素都有具体的index,插入的顺序等于输出的顺序,插入的元素可以为null;检索数据的效率较高。它线程非安全。
LinkedList底层其实是一个双向链表的实现,随着元素的增加不断的向链表的两端添加数据。而每个节点都记录了前后节点的地址引用,所以LinkedList中随机访问数据的(或者说检索数据)效率要慢一些(相对于ArrayList)。
还有一个已经被差不多遗忘的Vector,它也是List接口的一个实现,它跟ArrayList一致,只不过它是线程安全的,效率上不及ArrayList。
Set最大的特点,就是集合内元素的唯一性,但是Set集合不保证集合元素的顺序,按照一定顺序存入,不能保证按照一定顺序输出。允许存入Null,
Set最常见的实现有:HashSet、TreeSet,二者都是非线程安全;
HashSet底层其实是HashMap的实现,是一个散列表,元素没有顺序。
TreeSet底层基于红黑树实现,元素有序,插入元素前要重新排序。因为是有序的,它提供了一些类似first(),last()实现方法。
而Map体系。Map接口主要的实现类有:“HashMap、Hashtable”,二者都是Map接口哈希表的实现,以键值对的形式存储数据。不同的是Hashtable是线程安全的实现,HashMap线程非安全。
那么总结一下:ArrayList、LinkedList、Vector他们三者的区别?
①:ArrayList,Vector基本上一致,只不过Vector是线程安全的,ArrayList是线程非安全的。效率要高于Vector。LinkedList是非线程安全的。
②:ArrayList是底层基于数组实现,有序且允许为空;LinkedList底层基于链表实现,有序且允许为空。ArrayList基于数组实现,所以如果要修改元素中数据的话,它后面的所有的元素下标都要移动,而LinkedList基于链表实现,每个元素节点都存储了元素本身的数据同时也存储了相邻元素的地址引用所以ArrayList查询和修改效率快一些,LinkedList增删效率快一些。
以及HashMap和Hashtable的区别?
①:Hashtable是java发布的时候就存在,HashMap是jdk1.2之后引入。
②:Hashtable继承自Dictionary类,HashMap继承自AbstractMap类,因为继承不同所以Hashtable要比HashMap多两个实现方法,主要用来枚举Hashtable中的value和判断Hashtable是否包含。
③:Hashtable不允许空的key和value,HashMap允许空的key和value,但是也仅仅是允许存在一个空的key。因为允许为空,所以HashMap中不建议用get方法判断是否为空,建议使用containsKey()方法。
④:Hashtable是线程安全,HashMap是线程非安全,所以效率上HashMap要高于Hashtable。多线程环境下可以用线程安全的ConcurrentHashMap代替HashMap。它实现了分段锁。
⑤:Hashtable:默认容量为11,每次扩容为原来的2倍。HashMap默认容量为16,每次扩容为原来的2n+1倍。
⑥:为了得到元素的位置,首先要根据元素的key调用hash函数计算出一个hash值,然后再用这个hash值来计算得到最终的位置。Hashtable直接使用对象的HashCode,hashcode是jdk根据对象的地址或者字符串或者数字计算出来的int类型的数值。它计算的时候会有一部分除法运算(具体看源码)
HashMap为了提高效率,它采用位运算。位运算要远高于除法运算。
这里特别注意:(有些喜欢展示自己的面试官可能会问怎么解决哈希冲突)正是因为HashMap将哈希表的大小设定为2的幂,采用位运算,正是因为这样效率提高了,哈希冲突的概率也加大了,当然HashMap作者肯定也考虑到这个问题了,所以HashMap的解决办法是在根据HashCode计算得到哈希值后,又对hash值进行了一些运算来打散数据,这样的目的是使得取到的位置更加分散了,从而减少哈希冲突,当然仅仅只是减少了哈希冲突,哈希冲突是避免不了的。
常见的解决哈希冲突的方法
①:再散列法:当关键字key的哈希地址p=f(key)出现冲突的时候,以p为基础再计算产生另一个哈希地址p1,如果p1仍然冲突,那么再以p为基础产生另外一个哈希地址p2,直到找到一个不冲突的哈希地址px,将对应的值存入其中。
②:线性探索再散列:当冲突发生时,按顺序查看表中的下一单元,直到找到一个空单元或者查遍整个表。
③:二次探测再散列:当冲突发生时,在表的两侧进行随机性的探测,直到找到一个空单元。(比较灵活)

【四】请求转发和重定向的区别?在纸上分别画一下对应示意图?
①:地址栏中地址的变化情况:
forward:请求地址保持不变。
redirect:请求地址为最后一次请求的URL。
②:服务器中的request对象情况:
forward:从发起请求到请求响应,自始至终都是同一个request对象。
redirect:request对象为处理最后一次请求对应servlet对应的那个request对象。跟第一次请求的request对象不是同一个对象。
③:请求服务器次数情况:
forward:只向服务器发送一次请求。
redirect:根据业务逻辑至少发送2次不同的请求。
④:访问资源的权限情况:
forward:只能转发当前web应用的资源。
redirect:可以重定向到任何资源。
⑤:"/“符号意义
forward:中”/“符号表示:当前web应用的根目录。
redirect:中”/"符号表示:当前web站点的根目录。

在这里插入图片描述

在这里插入图片描述
【五】简述SpringMVC的请求处理过程?
【六】简述Spring的IOC和AOP核心?
【七】简述web.xml中的执行顺序?
【八】简述拦截器和过滤器的区别?
【九】简述Spring常用注解?
【十】简述SpringMVC中怎么配置事务?
【11】简述事务的传播特性?
【12】简述Activiti的工作原理?有哪些服务?有哪些主要的表?
【13】简述对java8 lambda表达式的理解?java8的一些新特性是否了解?

持续更新中,先记录一下问题,答案抽空完善………………如果回答有问题的地方,请大佬指正……

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值