您的位置:首页 > 编程语言 > Java开发

JAVA基础知识整理(二)

2017-04-02 21:58 281 查看
6.聊聊集合

list(ArrayList,linkedlist,vector),set(hashset,linkedset,treeset),map(hashmap)

1.Set接口

Set是一个不包含重复元素的集合,是数学中“集合”的抽象。Set接口扩展了Collection,并且禁止重复的元素。,equals和hashcode操作有了更强的约定,使得不同实现的Set对象之间可以进行有意义的比较。如果两个Set对象包含了同样的元素,二者便是相等的。实现集合(Set)接口的两个主要类是HashSet和TreeSet。Set接口在声明时可以带有一个参数,即Set< E>。

2.List接口

实现List接口的类中元素是有顺序的、可以包含重复的元素,且每个元素都有一个index值(从0开始)标明元素在列表中的位置。因此,可以将不同的类型的对象加入到列表中,并按一定顺序排列。List接口主要有四个实现类,向量(Vector、Arraylist)、链表(Linkedlist)以及栈(Stack)。List接口在声明时可以带有一个参数,即List< E>。

3.Map接口

Map是一个从关键字到值的映射对象,Map中不能有重复的关键字,每个关键字最多能映射一个值。Map接口在声明时可以带有两个参数Map< K,V>,其中K表示关键字的类型,V表示值的类型。

8.有哪些线程安全的map

如果需要使 Map 线程安全,大致有这么四种方法:

1、使用 synchronized 关键字,代码如下

synchronized(anObject) {

  value = map.get(key);

}

2、使用锁(java.util.concurrent.locks.Lock)。代码如下

lock.lock();

value = map.get(key);

lock.unlock();

3、使用读写锁(java.util.concurrent.locks.ReadWriteLock)。代码如下

rwlock.readLock().lock();

value = map.get(key);

rwlock.readLock().unlock();

这样两个读操作可以同时进行,理论上效率会比方法 2 高。

4、使用提供的 java.util.concurrent.ConcurrentHashMap 类。该类将 Map 的存储空间分为若干块,每块拥有自己的锁,大大减少了多个线程争夺同一个锁的情况。代码如下

value = map.get(key); //同步机制内置在 get 方法中

9.stringBuffer和Stringbuilder的区别

如果要操作少量的数据用 = String

单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

12.try,catch,finally。try里面有return,finally还会执行吗(笔试常考)

执行完try的return之后还会执行finally。

13.子类继承父类,新建子类对象,静态代码块,构造方法块执行顺序(笔试常考)

1、执行顺序:父类的静态代码块—>子类的静态代码块—>父类的构造代码块—>父类的构造方法—>子类的构造代码块—>子类的构造方法。

2、静态代码块随类的加载而执行,只执行一次,优先于main方法,用于初始化整个类。

3、构造代码块是给一个类的所有的对象进行初始化,可执行多次。只要对象一建立,就会调用构造代码块。构造代码块可以重复,可以有多份。

4、构造方法是给与之对应的对象进行初始化,有针对性。构造方法要么带参数,要么不带参数。当类中没有显式的构造方法时,jvm会默认执行一个不带参数的构造方法。同一个类中不能出现两个或两个以上相同的构造方法(方法名和参数列表都相同)。

5、在子类的所有构造方法中如果没有显式的super语句,则默认第一条语句为隐式的super语句:super();会访问父类的不带参数的构造方法。当父类中只有带参数的构造方法时,子类必须用显式的带参数的super语句访问父类的构造方法。若显示的super语句不带参数,则编译失败。当父类中只有显式的不带参数的构造方法时,子类必须用显示的不带参数的super语句访问父类的构造方法。否则,编译失败。

6、在创建子类的实例对象时未传入参数,若子类只有带参数的构造方法则编译失败。若子类有不带参数的构造方法,则执行子类的不带参数的构造方法。若子类没有构造方法,则执行隐式的不带参数的构造方法。

7、在创建子类的实例对象时传入参数:若子类有带参数的构造方法,则执行子类的带参数的构造方法;若子类没有带参数的构造方法或者没有构造方法,则编译失败。

14.Concurrent包下面有哪些类

java.util.concurrent

线程池(Executors/ThreadPoolExecutor)

线程安全集合(HashSet/HashMap)

信号量

任务同步工具

原子变量

锁(lOCK)

15.Volatile的作用,实现原理,什么情况用

Volatile使用场景:“如果向一个变量写入值,而这个变量接下来可能会被另一个线程读取,或者,从一个变量读值,而这个变量可能是被之前写入的,此时就必须使用同步”。

Volatile关键字为实例域的同步访问提供了一种免锁机制。如果声明一个域为Volatile,那么编译器和虚拟机就知道该域是可能被另一个线程并发更新的。

16.Arraylist 扩容原理

ArrayList和Vector都是继承了相同的父类和实现了相同的接口。

两者之间我认为主要有两个却别。

1、Vector中的public方法都添加了synchronized关键字,以确保方法同步。

2、内部属性不同,这也是导致扩容方式不同的原因所在。

我现在来说第二条,

ArrayList有两个属性,存储数据的数组elementData,和存储记录数目的size。

Vector有三个属性,存储数据的数组elementData,存储记录数目的elementCount,还有扩展数组大小的扩展因子capacityIncrement。

17.多线程的实现方式

(1)继承Thread类,重写run函数

(2)实现Runnable接口,重写run函数

18.线程池的优势

1.减少在创建和销毁线程上所花的时间以及系统资源的开销

2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息