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


八、高并发如何处理?1.从最基础的地方做起 , 优化我们写的代码 , 减少必要的资源浪费 。 a.避免频繁的new对象 , 对于整个程序只需要一个实例的类 , 我们可以使用单例模式;对于String 链接操作 , 使用StringBuffer或StringBuilder , 对于工具类可以通过静态方法来访问;b.避免使用错误的方式 , 使用java中高效率的类 , 比如ArrayList比Vector性能好;2.html静态化把一些经常不改变的内容静态化 , 高并发时减少服务器的压力;3.图片服务器分离对于web服务器来说 , 图片是最消耗资源的 , 于是我们把图片放到独立的服务器 , 这样可以降低 页面请求服务器的系统压力;4.缓存避免每一次都去数据库中去查询 , 减少数据库的访问量;并且使用redis数据库来做缓存 , 它的 读写速度是非常快的;5.数据库优化(1)优化sql语句a.Select语句必须指定列名b.当查询结果为一条时 , 使用limit 1c.避免使用%前缀搜索 , 避免全表扫描
九、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 , 然后将原数组内容复制到新数组中 , 并且后续加的内容都会放到新数组中 。 当新数组无法容纳增加元素时 , 重复该过程;


推荐阅读