work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Java基础一

Posted on 2020-04-09 10:26  work hard work smart  阅读(214)  评论(0编辑  收藏  举报

1、JDK和JRE的区别

JDK:Java Development Kit,Java开发工具包,提供了Java开发环境和运行环境

JRE:Java Runtime Environment,Java运行坏境,为Java提供运行所需要的环境。

具体来说JDK其实包含了JRE,同事还包含了编译Java源码的编译器Javac,还包含了很多Java程序调试和分析的工具。

简单来说:如果你需要运行Java程序,只需要安装JRE就可以了。如果你需要编写Java程序,需要安装JDK

 

2、==和equals的区别

==的作用

   基本类型: 比较的是值是否相同。

   引用类型: 比较的是引用是否相同。地址是否相同

equals的作用

   比较的是值是否相同

        String x = "zhangsan";
        String y = "zhangsan";
        String z = new String("zhangsan");
        System.out.println(x==y);//true
        System.out.println(x==z);//false
        System.out.println(x.equals(y));//true
        System.out.println(x.equals(z));//true

  

3、两个对象的hasCode()相同,则equals()也一定为true?

错误。

 

4、final作用

final修饰的类叫最终类,该类不能被继承

final修饰的方法不能被重写

fianl修饰的变量叫常量,必须初始化,初始化后不能被修改。

 

5、Math.round(-1.5)等于?

等于-1 Math.round四舍五入大于0.5向上取整。

 

6、String是基础数据类型吗?

不是。继承类型有btye,boolean, char, short , int , float, long, double。

String属于对象

 

7、Java中操作字符串都有哪些类?它们之间的区别?

操作字符串的类有:String, StringBuffer, StringBuilder

String和StringBuffer,StringBuilder的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要用String

StringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,StringBuilder是非线程安全的,StringBuilder的性能高于StringBuffer,所以在单线程下推荐使用StringBuilder,多线程下推荐使用StringBuffer

 

8、String str = “a”与String str = new String("a")一样吗?

不一样,因为内存的分配方式不一样。

String str = “a”的方式: Java虚拟机会将其分配到常量池中

String str = new String("a"): 则会被分配的堆内存中。

 

9、如何将字符串反转?

StringBuilder或者StringBuffer的reverse()方法。

 

15、Java中的IO流分为几种?

按功能分: 输入流和输出流

按类型分:字节流和字符流

字节流: 按8位传输以字节为单位输入输出数据

字符流:按16位传输以字符为单位输入输出数据

 

补充:Java中字节和字符的区别

1) 字节

bit=1 比特,二进制的0或1

byte=8bit  1个字节等于8位,存储空间的基本单位

2) 字符

Java采用unicode来表示字符,java中的一个字符(char)是2个字节,一个中文或英文字符的unicode编码都占用2个字节。

根据编码方式,一个字符占用的字节数各不相同。

编码方式 一个英文字符占用的字节数 一个汉字占用的字节数

GB 2312/ GBK

1个字节 2个字节
UTF-8 1个字节 3~4个字节
UTF-16 2个字节 3~4个字节
UTF-32 任何字节存储都需要4个字节 任何字节存储都需要4个字节

 

 

 

 

 

 

 

 

16、BIO,NIO,AIO区别

BIO: BLOCK IO 同步阻塞IO,就是我们平常使用的传统IO,它的特点是模式简单,使用方便,并发处理能力低

NIO:New IO  同步非阻塞IO,是传统IO的升级,客户端和服务端通过Channel(通道)通讯,实现了多路复用

AIO:Asynchronous IO是NIO的升级,也叫NIO2,实现了异步非阻塞IO,异步IO的操作基于事件和回调机制。

 

18、Java的容器有哪些

Java容器分为Collection和Map两大类,其下又有很多子类

Collection接口,

     List接口,继承Collection接口

        ArrayList类,实现了List接口

        LinkedList类,实现了List接口

        Vector类,实现了List接口

       Stack,继承Vector

    Set接口,继承Collection接口

        HashSet,实现了Set接口

 

 

Map接口

    HashMap类实现了Map接口

 LinkedHashMap类继承自HashMap,实现了Map接口

  TreeMap实现了Map接口

    ConcurrentHasMap 实现了Map

    Hashtable实现了Map接口

 

19、Collection和Collections有什么区别?

Collection是一个集合接口,它提供了对集合对象进行基本操作的通用方法,所有的集合都是它的子类,如List,Set等

Collections是一个包装类,包含了很多静态方法,只有私有的构造函数,不能被实例化,就像一个工具类。比如提供的排序方法 Collections.sort(list)

 

20、List、Set、Map之间的区别?

区别有按元素排序和是否允许元素重复考虑

 

21、HashMap和HashTable有什么区别?

1) HashMap可以存储null,HashTabe则不行

2) HashMap 非线程安全,HashTable是线程安全的

3) 推荐使用 在HashTable的类注释里了解到,HashTable不建议使用,推荐在单线程环境下使用HashMap,多线程环境下使用ConcurrentHashMap。

补充HashTable的类注释:

If a thread-safe implementation is not needed, it is recommended to use HashMap in place of Hashtable. If a thread-safe highly-concurrent implementation is desired, then it is recommended to use java.util.concurrent.ConcurrentHashMap in place of Hashtable.

如果你不需要线程安全,那么使用HashMap,如果需要线程安全,那么使用ConcurrentHashMap。HashTable已经被淘汰了,不要在新的代码中再使用它。

 

 22、如何选择HashMap和TreeMap?

如果删除、增加、获取元素操作比较多,建议使用HashMap,HashMap插入的效率比较高

如果对Map的key进行有序的遍历,建议使用TreeMap

 

23、HasMap实现原理

HasMap基于Hash算法实现的,通过put(key,value)存值,get(key)取值。当传入key时,根据key.hasCode()减少hash值,根据hash值将value保存在bucket里。

当计算的hash值相同时,称之为hash冲突。HasMap的做法是链表法和红黑树存储相同hash值的value。当hash冲突比较少时,使用链表法,否则使用红黑树法。

 

24、HashSet的原理?

HashSet基于HashMap,底层使用HashMap来存值,相关的操作都是基于HashMap。HashSet不允许值重复。

 

25. ArrayList 和 LinkedList的区别

数据结构实现: ArrayList是动态数组的数据结构实现,二LinkedList是双向链表的数据结构实现

随机访问效率: ArrayList比LinkedList在随机访问的时候效率要高,因为LinkedList是线性的数据存储方式,所有需要移动指针从前往后依次查找。

增加和删除效率: 在非首尾的增加和删除操作,LinkedList要比ArrayList效率高,因为ArrayList增删操作要影像数组内的其它数据的下标。

综合起来,在需要频繁读取数据中的元素时,更推荐使用ArrayList, 而插入和删除操作较多时,更推荐使用LinkedList

 

27、ArrayList和Vector区别?

两者都实现了List接口

线程安全: ArrayList是非线程安全, Vector是线程安全的(方法里有同步锁 synchronized)

性能: ArrayList性能比Vector高

扩容:ArrayList扩容0.5倍, Vector扩容1倍

 

28、Array(数组)和ArrayList区别?

 ArrayList里封装了Array数组

Array可以存储基本数据类型和对象类型,ArrayList不能存储基本数据类型

Array的大小固定,ArrayList的大小时动态的

ArrayList可以算是Array的加强版本,提供了addAll(), removeAll(),迭代器等方法

 

 29、Queue中的poll()和remove()区别

形同点: 都是返回第一个元素,并且在队列中删除返回的对象

不同点:如果没有元素,poll()返回null, remove返回异常(NOSuchElementException异常)

 

30、哪些集合类时线程安全的

线程安全: Vector, Stack,HashTable,ConCurrentHashMap

非线程安全: HashMap

 

 

 

1、B树,B+树,红黑树的区别,优缺点? 适合场景

B树

(1)多路,非二叉树

(2)每个节点既保存索引,又保存数据

(3)搜索时相当于二分查找

B+树

(1)多路非二叉

(2)只有叶子节点保存数据

(3)搜索时相当于二分查找

(4)增加了相邻接点的指向指针。

B树和B+树的区别:

(1)B+树查询时间复杂度固定是logn,B-树查询复杂度最好是 O(1)。

(2)B+树相邻接点的指针可以大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。

(3)B+树更适合外部存储,也就是磁盘存储。由于内节点无 data 域,每个节点能索引的范围更大更精确

(4)注意这个区别相当重要,是基于(1)(2)(3)的,B-树每个节点即保存数据又保存索引,所以磁盘IO的次数很少,B+树只有叶子节点保存,磁盘IO多,但是区间访问比较好。

参考: https://baijiahao.baidu.com/s?id=1655665549235267594&wfr=spider&for=pc

红黑树:

(1) 每个节点或者是黑色,或者是红色。
(2) 根节点是黑色。
(3) 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]
(4) 如果一个节点是红色的,则它的子节点必须是黑色的。
(5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

使用场景:

B树, mongodb

B+树: mysql

红黑树:jdk8的HashMap