hashMap原理

  1. hashMap是数组+链表的数据结构
  2. 每一个数组元素中都是一个链表
  3. 通过记录的关键字key.hashCode()%数组的长度 来决定记录在数组中的存储位置
  4. 对于数组的同一个存储位置,后来的元素永远放在链表的表头

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来  储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 Ha  shMap在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap

饿汉式单例

  1. public class Singleton {
  2. private static Singleton instance = new Singleton();
  3. private Singleton() {}
  4. public static Singleton getInstance() {
  5. return instance;
  6. }

懒汉式单例

  1. public class Singleton {
  2. private static Singleton instance = null;
  3. private Singleton() {}
  4. public static synchronized Singleton getInstance() {
  5. if (instance == null) {
  6. instance = new Singleton();
  7. }
  8. return instance;
  9. }

内部类

  1. public class Singleton {
  2. private Singleton() {}
  3. public static Singleton getInstance() {
  4.  
  5. return SingletonHold.INSTANCE;
  6. }
  7. private static class SingletonHold {
  8. private static final Singleton INSTANCE = new Singleton();
  9. }
  10.  
  11. }

Java中HashMap遍历的四种方式

  1. 第一种:
  2.   Map map = new HashMap();
  3.   Iterator iter = map.entrySet().iterator();
  4.   while (iter.hasNext()) {
  5.   Map.Entry entry = (Map.Entry) iter.next();
  6.   Object key = entry.getKey();
  7.   Object val = entry.getValue();
  8.   }
  9.   效率高,以后一定要使用此种方式!
  10.  
  11. 第二种:
  12.   Map map = new HashMap();
  13.   Iterator iter = map.keySet().iterator();
  14.   while (iter.hasNext()) {
  15.   Object key = iter.next();
  16.   Object val = map.get(key);
  17.   }
  18.   效率低,以后尽量少使用!
  1. 1. Map的四种遍历方式
    下面只是简单介绍各种遍历示例(以HashMap为例),各自优劣会在本文后面进行分析给出结论。
    (1) for each map.entrySet()
  2. Map<String, String> map = new HashMap<String, String>();
  3. for (Entry<String, String> entry : map.entrySet()) {
  4. entry.getKey();
  5. entry.getValue();
  6. }
  7. (2) 显示调用map.entrySet()的集合迭代器
  8. Iterator<Map.Entry<String,String>>iterator=map.entrySet().iterator();
  9. while(iterator.hasNext()){
  10. Map.Entry<String,String>entry=iterator.next();
  11. entry.getKey();
  12. entry.getValue();
  13. }
  14. (3) for each map.keySet(),再调用get获取
  15. Map<String, String> map = new HashMap<String, String>();
  16. for (String key : map.keySet()) {
  17. map.get(key);
  18. }
  19. (4) for each map.entrySet(),用临时变量保存map.entrySet()
  20. Set<Entry<String,String>>entrySet=map.entrySet();
  21. for(Entry<String,String>entry:entrySet){
  22. entry.getKey();
  23. entry.getValue();
  24. }
  1.  对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,他把keyvalue都放到了entry中,所以就快了。

jdk1.8新特性

  1. 速度更快 红黑树
  2. 代码更少 Lambda
  3. 强大的Stream API Stream
  4. 便于并行 Parallel
  5. 最大化减少空指针异常 Optional

spring IOC和AOP的原理?

  1. IOC:控制反转也叫依赖注入。利用了工厂模式
  2. 将对象交给容器管理,你只需要在spring配置文件中配置对应的bean以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,
    spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),
    分配的方法就是调用Asetter方法来注入,而不需要你在A里面new这些bean了。
    AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,
    用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。
    也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。
    日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
    实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
    二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码

MySQL数据库的四种索引类型

  1. 索引类型主要包括:普通索引,唯一索引,主键索引和组合索引。
  2. 1)普通索引,就是直接创建简单的索引。CREATE INDEX indexName ON mytable(username(length));
  3. 2)唯一索引,与普通索引类似,不同的是,Mysql的索引列值必须唯一,但允许有空值。如果是组合索引,
    则列值的组合必须唯一。有以下几种创建方式:CTEATE UNIQUE INDEX indexName ON mytable(username(length))修改表结构;
  4. ALTER mytable ADD UNIQUE [indexName] ON (username(length))创建表的时候直接指定。
  5. 3)主键索引,它是一种特殊的唯一索引,不允许有空值,一般是在建表的时候同时创建主键索引。
  6. CREATE TABLE mytableID INT NOT NULL,username VARCHAR(16) NOT NULL,PRIMARY KEY(ID));
  7. 当然也可以用ALTER命令,记住:一个表只能有一个主键。
  8. 4)组合索引,
  9. CTEATE TABLE mytable(ID INT NOT NULL,username VARCHAR(16) NOT NULL,city VARCHAR(50) NOT NULL,age INT NOT NULL);

乐观锁和悲观锁是两种思想

  1. 乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:
    如果别人修改了数据则放弃操作,否则执行操作。
  2. 悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。

线程池的几种方式

  1. newFixedThreadPool(int nThreads)
  2. 创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化,当线程发生未预期的错误而结束时,线程池会补充一个新的线程
  3. newCachedThreadPool()
  4. 创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制
  5. newSingleThreadExecutor()
  6. 这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行
  7. newScheduledThreadPool(int corePoolSize)
  8. 创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer

Spring MVC的优点

  1. 它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成. 
  2. 不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的) 
  3. 可以任意使用各种视图技术,而不仅仅局限于JSP 
  4. 支持各种请求资源的映射策略 
  5. 它应是易于扩展的

springMVC的原理

客户端发送请求到DispatcherServlet

DispatcherServlet查询handlerMapping找到处理请求的Controller

Controller调用业务逻辑后,返回ModelAndView

DispatcherServlet查询ModelAndView,找到指定视图

视图将结果返回到客户端

java面试题基础的更多相关文章

  1. Java面试题-基础知识

    参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...

  2. 2019年Java面试题基础系列228道,题目汇总,可以先看会多少

    Java面试题(一) 1.面向对象的特征有哪些方面? 2.访问修饰符 public,private,protected,以及不写(默认)时的区别? 3.String 是最基本的数据类型吗? 4.flo ...

  3. 2019年Java面试题基础系列228道(3)

    51.类 ExampleA 继承 Exception,类 ExampleB 继承ExampleA. 有如下代码片断: try { throw new ExampleB("b")}c ...

  4. 2019年Java面试题基础系列228道(2)

    21.描述一下 JVM 加载 class 文件的原理机制? JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是一个重要的 Java 运行时系统组件,它 ...

  5. JAVA面试题基础部分(三)

    20.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?抽象类中是否可以有静态的main方法? 接口可以继承接口.抽象类可以实现 ...

  6. [ Java面试题 ]基础篇之一

    1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...

  7. Java 面试题基础概念收集

    问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示”main方法不是public的”. 问题:Java里的传引用和传值的区别是什么? 答案:传引用是指传递的是地 ...

  8. Java面试题-基础篇三(干货)

    这些JAVA基础题确定都会了吗? 31.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可 ...

  9. Java面试题---基础篇

    经常阅读一些牛人的基础博以及相关个人经历,你才发现自己真的不够努力,人生路漫漫,希望本人以及看客能走出一条自己不后悔的人生路,骚年  加油!!! 回归正题 一  java基础知识点 1)java面向对 ...

  10. 2019年Java面试题基础系列228道(1)

    1.面向对象的特征有哪些方面? 面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些行为 ...

随机推荐

  1. msp430入门学习40

    msp430的其他八 msp430入门学习

  2. Poi写文件时报java.io.IOException: Read error

    使用POI报表时不停的报java.io.IOException: Read error,看网上是说关闭了InputStream所导致的,由于我的InputStream是读取和写入都是用的同一个,所以就 ...

  3. yii 之数据库关联查询

    <?php namespace app\controllers; use yii\web\Controller; use app\models\Customer; class CustomerC ...

  4. hdu4862 2014多校B题/ 费用流(最优情况下用不大于K条路径覆盖)(不同的解法)

    题意: 一个数字矩阵,可以出发K次,每次可以从右边或者下面走,要求(在收益最大情况下)覆盖全图,不能则输出-1.(规则:每次跳一步的时候若格子数字相等则获得该数字的能量,每跳一步消耗距离的能量).每个 ...

  5. SGU112

    题意:求a^b-b^a次,100以内.大数的-和*的模拟,用的模板,注意该模板中间和结果都不能出现负数. #include<iostream> #include<string> ...

  6. 2017 ACM/ICPC Asia Regional Xian Online 记录

    题目链接  Xian

  7. BZOJ 1878 [SDOI2009]HH的项链 (主席树 或 莫队算法)

    题目链接  HH的项链 这道题可以直接上主席树的模板 #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) ...

  8. (5)ASP.NET Core 中的静态文件

    1.前言 当我们创建Core项目的时候,Web根目录下会有个wwwroot文件目录,wwwroot文件目录里面默认有HTML.CSS.IMG.JavaScript等文件,而这些文件都是Core提供给客 ...

  9. C/C++二进制读写png文件

    以下代码只有最简单的读写.地址定位啥的,个别注释中有.如果要改动png的格式甚么的就要再了解一下png的数据结构如果要十进制的话就跟着注释改一下: /*! * \file CC++二进制读写png文件 ...

  10. SolidEdge 工程图中如何给零件着色 给装配体着色

    点击着色按钮,然后点击更新视图即可.