Java常见的一些经典面试题(附答案解析)( 二 )


九、get与post的区别GET在浏览器回退时是无害的 , 而POST会再次提交请求 。GET产生的URL地址可以被Bookmark , 而POST不可以 。GET请求会被浏览器主动cache , 而POST不会 , 除非手动设GET请求只能进行url编码 , 而POST支持多种编码方式 。GET请求参数会被完整保留在浏览器历史记录里 , 而POST中的参数不会被保留 。GET请求在URL中传送的参数是有长度限制的 , 而POST没有 。对参数的数据类型 , GET只接受ASCII字符 , 而POST没有限制 。GET比POST更不安全 , 因为参数直接暴露在URL上 , 所以不能用来传递敏感信息 。GET参数通过URL传递 , POST放在Request body中 。
十、JDK1.8新特性

  1. 提供lambda表达式极大地减少了代码的冗余;
  2. 在接口中可以使用default和static关键字来修饰接口中的普通方法;
  3. 提供新的API LocalDate | LocalTime | LocalDateTime(1)Java.util.Date和SimpleDateFormatter线程上都不安全 , 而LocalDate和LocalTime和 String一样都是不可改变类 , 线程上比较安全 , 还不能修改;(2)Java.util.Date月份从0开始 , 12月是11 , 而java.time.LocalDate月份和星期都改成了 enum ,就不可能出错了;
集合部分一、List、Map、Set三个接口 , 存取元素时 , 各有什么特点(1)Set集合的add有一个boolean类型的返回值 , 当集合中没有某个元素时 , 则可以成功加入该 元素 , 返回结果为true;当集合中存在与某个元素equals方法相等 的元素时 , 则无法加入该元素 ,取元素时只能用Iterator接口取得所有元素 , 再逐一遍历各个元素;(2)List表示有先后顺序的集合 , 调用add()方法 , 指定当前对象在集合中的存放位置;一个对象可 以被反复存进集合中;每调用一次add()方法 , 该对象就会被插入集合中一次 , 其实 , 并不是把对 象本身存进了集合中 , 而是在集合中使用一个索引变量指向了该对象 , 当一个对象被add多次时 ,即有多个索引指向了这个对象 。 List去元素时可以使用Iterator取出所有元素 , 在逐一遍历 , 还可 以使用get(int index)获取指定下表的元素;(3)Map是双列元素的集合 , 调用put(key,value) , 要存储一对key/value , 不能存储重复的key, 这个是根据eauals来判断;取元素时用get(key)来获取key所对 应的value,另外还可以获取 全部key , 全部value
二、ArrayList和LinkedList的底层实现原理?他们为什么线程不安全?在多线程并发操作下 , 我们应该用什么替代?1.ArrayList底层通过数组实现 , ArrayList允许按序号索引元素 , 而插入元素需要对数组进行移位等内存操作 , 所以索引快插入较慢;(扩容方式)一旦我们实例化了ArrayList 无参构造函数默认数组长度为10 。 add方法底层如 果增加的元素超过了10个 , 那么ArrayList底层会生成一个新的数组 , 长度为原来数组长度的1.5倍+1 , 然后将原数组内容复制到新数组中 , 并且后续加的内容都会放到新数组中 。 当新数组无法容纳增加元素时 , 重复该过程;
2.LinkedList底层通过双向链表实现 , 取元素时需要进行前项或后项的遍历 , 插入元素时只需要记录本项的前后 项即可 , 所以插入快查询慢;
3.ArrayList和LinkedList底层方法都没有加synchronized关键词 , 多线程访问时会出现多个线程先后更改数据造成得到的数据是脏数据;多线程并发操作下使用Vector来代替 , Vector底层也是数组 , 但底层方法都加synchronized关键字使线程安全 , 效率较ArrayList差;
三、HashMap和HashTable有什么区别?其底层实现是什么?CurrentHashMap的锁机制又是如何?如果想将一个Map变为有序的,该如何实现?
1.区别:(1)HashMap没有实现synchronized线程非安全 , HashTable实现了synchronized线程安全;(2)HashMap允许key和value为null , 而HashTable不允许
2.底层原理:数组+链表实现
3.ConcurrentHashMap锁分段技术:HashTable效率低下的原因 , 是因为所访问HashTable的线程都必须竞争同一把锁 , 那假如容器中有多把锁 , 每一把锁用于锁住容器中的一部分数据 , 那么当多线程访问容器中不同的数据时 , 线程间就不会存在锁竞争 , 从而提高并发访问率;ConcurrentHashMap使用的就是锁分段技术 , 首先将数据分成一段一段的存储 , 然后给每一段数据配一把锁 , 当一个线程占用锁访问其中一个数据时 , 其他段的数据也能被其他线程访问;
4.实现TreeMap
框架部分一、什么是SpringSpring是一个轻量级的开源框架 , 是为了解决企业应用开发的复杂性而创建的;提供IOC来帮助我们创建对象及管理对象之间的依赖关系 , 提供AOP来帮我们完成日志的打印、异常的处理、事物的管理等操作 , 提供JDBC、ORM来完成持久层的操作 , 内置SpringMvc控制层框架