java基础

1.JAVA 中的几种数据类型是什么,各自占用多少字节。

数据类型

2.String 类能被继承吗,为什么。
不能被继承,因为string类有final修饰,而final修饰的类是不能被继承的

3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

  • 不对,两个对象equals相等,则它们的hashcode必须相等,反之则不一定。两个对象==相等,则其hashcode一定相等,反之不一定成立
  • hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
  • equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”。同样的,equals()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有equals()函数。

4. String 属于基础的数据类型吗?
属于引用数据类型,但是在方法参数传递时,string和简单类型结果一样,不改变原值.其他的引用类型会改变.

5.Java 中操作字符串都有哪些类?它们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder。
可变性:string是由final修饰的,不可变.stringBuffer和stringBuilder是可变的;
安全性:string由final修饰可以认为是常量,是线程安全的.stringBuffer是线程安全的.stringBuilder是线程不安全的;
效率:stringBuilder>stringBuffer>string

6.Java 中 IO 流分为几种?
分为两种基本流和功能流,其中基本流包括字节流和字符流,功能流包括缓冲流,转换流,序列化流等等
基本流
功能流

7.BIO、NIO、AIO 有什么区别?

  • BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。

  • NIO (New I/O):同时支持阻塞与非阻塞模式,但这里我们以其同步非阻塞I/O模式来说明,那么什么叫做同步非阻塞?如果还拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。

  • AIO ( Asynchronous I/O):异步非阻塞I/O模型。异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。

8.用过哪些 Map 类,都有什么区别,HashMap 时线程安全的吗,并发下使用的 Map 是什么,他们的内部原理分别是什么,比如存储方法,hashcode,扩容,默认容量等。

用过HashMap、HashTable、LinkedHashMap和TreeMap。
并发下使用hashtable
①、HashMap 是线程不安全的,HashTable 是线程安全的;
②、由于线程安全,所以 HashTable 的效率比不上 HashMap;
③、HashMap最多只允许一条记录的键为null,允许多条记录的值为null,而 HashTable 不允许;
④、HashMap 默认初始化数组的大小为16,HashTable 为 11,前者扩容时,扩大两倍,后者扩大两倍+1;

  • Q:Java 中的另一个线程安全的与 HashMap 极其类似的类是什么?同样是线程安全,它与 HashTable 在线程同步上有什么不同?
    A:ConcurrentHashMap 类(是 Java并发包 java.util.concurrent 中提供的一个线程安全且高效的 HashMap 实现)。
    HashTable 是使用 synchronize 关键字加锁的原理(就是对对象加锁);
    而针对 ConcurrentHashMap,在 JDK 1.7 中采用分段锁的方式;JDK 1.8 中直接采用了CAS(无锁算法)+ synchronized,也采用分段锁的方式并大大缩小了锁的粒度。

9. 如何将字符串反转?
方法一:使用StringBuilder的reverse方法(最快)
方法二:转换成字符数组,再使用StringBuilder拼接
方法三:使用charAt(),并用StringBuilder拼接

10.抽象类必须要有抽象方法吗?
抽象类必须有关键字abstract来修饰。 抽象类可以不含有抽象方法 如果一个类包含抽象方法,则该类必须是抽象类

11.普通类和抽象类有哪些区别?

  1. 普通类可以实例化,接口都不能被实例化(它没有构造方法),抽象类如果要实例化,抽象类必须指向实现所有抽象方法的子类对象(抽象类可以直接实例化,直接重写自己的抽象方法),接口必须指向实现所有所有接口方法的类对象。

12.抽象类能使用 final 修饰吗?

13.ArrayList 和 LinkedList 有什么区别?

14.ConcurrentHashMap的数据结构(必考)

15.volatile作用(必考)

16.Atomic类如何保证原子性(CAS操作)(必考)

17.为什么要使用线程池(必考)