JAVA基础知识整理(二)

时间:2023-02-04 20:02:44

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.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存