Java基础
JDK 和 JRE 有什么区别?
JDK是整个java的核心,是Java开发工具包,包括JRE,Java工具和一些基础类库。
JRE是运行Java程序所必须环境集合,包含了JVM和Java程序的核心类库。
JVM是整个Java实现跨平台的最核心部分,能够在不同系统中运行以Java编写的Java程序。
如何区分基本数据类型和引用数据类型?
基本数据类型:基本数据类型分为8种,除了8种基本类型,其他所有数据类型都是引用数据类型。
(1)整数类型:Long、int 、short、byte
(2)浮点类型:float、double
(3)字符类型:char
(4)布尔类型:boolean
引用数据类型:引用数据类型非常多,大致包括:
类、接口类型、数组类型、枚举类型、注解类型、字符串型(例:String类型就是引用类型)
基本数据类型和引用数据类型的区别:
基本数据类型
在方法中定义的基本数据类型具体内容是存储在栈当中中。
引用数据类型
引用类型的具体内容则存储在堆内存中,而栈中存储的是它存放的内存地址
== 和 equals 的区别是什么?

代码解读:
A和B都指向同一个引用地址,所以A==B的结果为true,而C则是通过关键字new出来的,就会在堆内存中开辟一块新的空间,所以A==C的结果为false。
equals方法它默认比较的是引用地址,只不过是String和Integer对equals方法进行了重写,改变为值的比较,所以输出结果均为true。
==在比较基本类型和引用类型中具有不同的效果:
基本类型:比较的是值
引用类型:比较的是内存地址值
equals
equals本质上就是==,只不过是String 和Integer对equals方法进行了重写,比较的是值,equals默认比较的是对象的内存地址值也就是引用地址。一般情况下equals方法比较的是值。
Java 中操作字符串都有哪些类?它们之间有什么区别?
String、StringBuffer、StringBuilder的区别:
(1)可变性
String类由final关键字字符数组保存字符串,所以说是String对象是不可变的。

StringBuffer和StringBuilder都是继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,但是没有使用final关键字修饰,所以这两种对象是可以在原有对象的基础上进行操作。
(2)线程安全
String中的对象是不可变,也就是常量,所以线程安全的。
StringBuffer对方法或者对调用的方法加了同步锁,所以是线程安全的。

StringBuilder并没有对方法加锁,所以是非线程安全的。

(3)性能
String类在进行改变时会重新创建一个新的String对象,并将指针指向新的String对象。
StringBuffer在进行对象改变时,并没有去创建新的对象而是在对象本身进行操作。
相同情况下:StringBuffer由于加了同步锁的原因,StringBuilder的效率比StringBuffer性能高10%-15%左右,但是要冒线程不安全的风险。
String 类的常用方法都有那些?
indexOf():返回指定字符的索引
trim():去除两端空白
charAt():返回指定索引位置字符
length():返回字符串长度
split():分割字符串,返回切割后的字符串数组
substring():截取字符串
equals():字符串比较
接口和抽象类有什么区别?
实现:接口基于implements实现接口,抽象类基于extends来继承。
构造方法:接口中不能有构造方法,抽象类可以有构造方法。
实现数量:一个类可以实现多个接口,但是只能继承一个抽象类。
修饰符:抽象类中的方法可以是任意修饰符,而接口中方法默认public来修饰。
List、Set、Map 之间的区别是什么?
List和Set都属于单列集合,而Map是通过以Key-Value的方式存储的双列集合。
List存储的数据是有序且可以重复的,Set所存储的数据是无序的,且不可以重复。
Map中存储的数据也是无序的,但是Key不可以重复,Value允许重复。
HashMap 和 Hashtable 有什么区别?
数据结构
HashMap在JDK 8版本之后,对底层数据结构进行了优化,引入红黑树,而HashTable则没有这样的机制,并且可以看到HashTable为保留类,不建议使用。
对null值和null键的支持
HashMap中是允许null值和null键的,而HashTable不允许有null值和null键,否则会报空指针异常。
初始容量及扩容机制
HashMap初始容量为16,每次扩容为原来的2倍

HashTable初始容量为11,每次扩容为原来的2n+1


说一下 HashMap 的实现原理?
HashMap继承自AbstractMap实现了Map接口,基于Hash算法实现,我们通过调用put(key,value)方法存储,通过get(key,value)方法取。
首先将键值对封装到一个Node对象中,先调用key.hashCode()方法得到hash值,然后通过hash算法转换成数的下标。
如果下标位置上没有任何元素,就将Node添加到该位置,如果下标位置上有元素,此时就将key拿着与其他元素的每个key进行equals比较,如果所有返回值为false,那么就将元素添加到末尾,如果其中一个返回值为true,那么就会覆盖这个元素。
ArrayList 和 LinkedList 的区别是什么?
区别 | ArrayList | LinkedList |
数据结构 | 数组 | 双向链表 |
随机访问时间 | 快,根据数组下标访问 | 慢,要沿着链表进行遍历 |
增删改查 | 默认添加到素组尾部,尾部删除性能可以,其他部分插入,删除都会移动数据,性能较低 | 头、尾部插入删除性能高,受位置影响,其他位置需要遍历整个链表 |
内存 | 需要连续的内存 | 基于双向链表实现,占用内存大 |
线程和进程的区别?
进程:是正在运行的软件。
具有以下特性:
(1)独立性:进程是一个可以独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
(2)动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。
(3)并发性:任何进程都可以同其他进程一起并发执行。
线程:是进程中的单个顺序控制流,是一条执行路径。
(例:我们打开某一个软件,其实就是开了一个进程,而软件的每个功能则可以称之为线程。)
创建线程有哪几种方式?
继承Thread类重写run方法
实现Callable接口
实现Runable接口
线程池创建
Runable和Callable的区别?
Runable无返回值,Callable有返回值
本文主要探讨Java面试中常见的问题,包括JDK与JRE的区别、基本数据类型与引用数据类型的辨析、==与equals的区别、String类常用方法、接口与抽象类的不同、List、Set、Map的区别以及HashMap的实现原理等核心概念。此外,还涉及线程、进程、ArrayList与LinkedList的差异以及线程创建方式等知识点。

4679





