Java

Java-1

2018-09-13  本文已影响0人  edwin1993
  1. 容器基本内容
  2. HashMap的底层
  3. 多线程同步方法
  4. 消息队列问题
  5. 设计模式中的生产者消费者模型
  6. 同步异步接口
  7. Mysql两种引擎的区别
  8. mybatis与hibernate的区别
  9. Struts2 拦截器与Spring AOP的区别
  10. HashMap容量为什么是2^n
  11. HashMap的负载因子

1. 容器基本内容

Java集合类里面最基本的接口如下:

Collection:一个独立元素的序列,这些元素都服从一条或者多条规则。 List必须按照插入的顺序保存元素,而set不能有重复的元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。

Map:一组成对的“键值对”对象,允许你使用键来查找值。

2. HashMap的底层

HashMap是基于哈希表的Map接口的非同步实现,Java最基本数据结构就是两种,一种是数组,一种是引用。所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。
HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。

3. 多线程同步方法

 public synchronized void save(){
}

注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类

synchronized(object){ 
}
//需要同步的变量加上volatile
private volatile int account = 100;
//需要声明这个锁
private Lock lock = new ReentrantLock();
lock.lock();
try{
      account += money;
}finally{
      lock.unlock();
 }
        public class Bank{
            //使用ThreadLocal类管理共享变量account
            private static ThreadLocal<Integer> account = new ThreadLocal<Integer>(){
                @Override
                protected Integer initialValue(){
                    return 100;
                }
            };
            public void save(int money){
                account.set(account.get()+money);
            }
            public int getAccount(){
                return account.get();
            }
        }

上面的五种偏底层

原子操作就是指将读取变量值、修改变量值、保存变量值看成一个整体来操作即-这几种行为要么同时完成,要么都不完成。
在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类

class Bank {
        private AtomicInteger account = new AtomicInteger(100);

        public AtomicInteger getAccount() {
            return account;
        }

        public void save(int money) {
            account.addAndGet(money);
        }
    }

4. 消息队列问题

消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景。

5. 设计模式中的生产者消费者模型:

生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

这个阻塞队列就是用来给生产者和消费者解耦的。

6. 同步异步接口:

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

7. Mysql两种引擎的区别:

主要区别:
MYIASM为默认引擎。
1、MyIASM是非事务安全的,而InnoDB是事务安全的
2、MyIASM锁的粒度是表级的,而InnoDB支持行级锁
3、MyIASM支持全文类型索引,而InnoDB不支持全文索引
4、MyIASM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyIASM
5、MyIASM表保存成文件形式,跨平台使用更加方便

8. mybatis与hibernate的区别

9. Struts2 拦截器与Spring AOP的区别

广义来说spring和struts2的拦截器的工作原理都一样。

10. HashMap的容量为什么是2^n?

static int indexFor(int h,int length) {
        return h & (length-1);
    }

key的hashCode经过hash后,为了让其在table(table为hashMap的entry[])的范围内,需要再hash一次。这里实际上是采用的“除余法”。

如果length是2的N次方,那么数h对length的模运算结果等价于a和(length-1)的按位与运算,也就是 h%length <=> h&(length-1)。
位运算当然比取余效率高,所以HashMap容量要求为2^n。

11. HashMap的负载因子

负载因子默认是0.75,会影响HashMap的性能。

threshold = (int)(capacity * loadFactor);
threshold为HashMap的size最大值

所以负载因子越大则散列表的装填程度越高,也就是能容纳更多的元素,元素多了,链表就长了,所以此时索引效率就会降低。

上一篇下一篇

猜你喜欢

热点阅读