Java开发常见基础题大全
1.&和&&的区别?
&:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true。
&&:短路与,如果第一个表达式为false时,第二个表达式就不会计算了。
2.”==”和equals方法究竟有什么区别?
==:表示两个变量的值是否相等,用于比较两个基本数据类型的数据或者引用变量。
equals:用于比较两个独立对象的内容是否相同。字符串的比较也用equals。
== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
3.比较字符串相等时用equals和==的区别
String 是对象,如果用==号就是比较两个String对象内存地址是否一样,equals()比较的是String内容时候一样,不过不同的编程语言两者不太一样
4.Int和integer的区别?
Int是Java的8中基本数据类型之一,integer是int的封装类。Int类型的默认值为0,integer默认值为null,所以区别在于,integer能区分出null值和0的区别。
5.重载和重写的区别?
重载(Overload):函数名相同,参数不同。可以改变返回值类型,参数的个数和类型。
重写(Override):和父类的的方法名称、参数完全相同。
6.面向对象的特征?
封装:将对象属性和方法的代码封装到一个模块中,也就是一个类中,保证软件内部具有优良的模块性的基础,实现“高内聚,低耦合”。
抽象:找出一些事物的相似和共性之处,然后归为一个类,该类只考虑事物的相似和共性之处。抽象包括行为抽象和状态抽象。
继承:在已经存在的类的基础上进行,将其定义的内容作为自己的内容,并可以加入新的内容或者修改原来的方法适合特殊的需要。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,就是多态,简单点说:就是用父类的引用指向子类的对象。目的:提高代码复用性,解决项目中紧耦合问题,提高可扩展性。
多态的机制:靠的是父类的或者接口的引用变量可以指向子类或者具体实现类的实例对象。
7.JDK 和 JRE 有什么区别?
JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。
8.final 在 Java 中有什么作用?
final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
9.String s =new String (“syx”);创建了几个String Object?
如果String常理池(常量缓冲区)中,已经创建"syx",则不会继续创建,此时只创建了一个对象new String(“syx”);
如果String常理池中,没有创建"syx",则会创建两个对象,一个对象的值是"syx",一个对象new String(“syx”)。
10.JDBC操作数据库的七大步骤?
1.加载JDBC驱动程序:
2.提供JDBC连接的URL;
3.创建数据库的连接;
4.创建一个Statement(创建sql的执行操作);
5.执行SQL语句;
6.处理执行结果;
7.关闭JDBC对象,释放内存。
11.String 类的常用方法都有那些?
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
12.普通类和抽象类有哪些区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
13.接口和抽象类有什么区别?
抽象类:用abstract修饰,抽象类不能创建实例对象。抽象方法必须在子类中实现,不能有抽象构造方法或者抽象静态方法。
接口:抽象类的一种特例,接口中的方法必须是抽象的。
两者的区别:
1.抽象类可以有构造方法,接口没有构造方法
2.抽象类可以有普通成员变量,接口没有普通成员变量。
3.抽象类可以有非抽象的普通方法,接口中的方法必须是抽象的。
4.抽象类中的抽象方法访问类型可以是public,protected,接口中抽闲方法必须是public类型的。
5.抽象类可以包含静态方法,接口中不能包含静态方法。
6.一个类可以实现多个接口,但是只能继承一个抽象类。
7.接口中基本数据类型的数据成员,都默认为static和final,抽象类则不是。
8.抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
14.BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
15.Files的常用方法都有哪些?
Files. exists():检测文件路径是否存在。
Files. createFile():创建文件。
Files. createDirectory():创建文件夹。
Files. delete():删除一个文件或目录。
Files. copy():复制文件。
Files. move():移动文件。
Files. size():查看文件个数。
Files. read():读取文件。
Files. write():写入文件。
16.请对比synchronized与java.util.concurrent.locks.Lock的异同?
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
17.List、Set和Map的区别?
List:是存储单列数据的集合,存储有顺序,允许重复。继承Collection接口。
Set: 是存储单列数据的集合。继承Collection接口。不允许重复。
Map:存储键和值这样的双列数据的集合,存储数据无顺序,键(key)不能重复,值(value)。可以重复。
18.java创建对象的方式有哪些?
1.使用new关键字
2.使用反射机制创建对象:
(1)使用Class类的newInstance方法
(2)java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。
3.使用clone方法:先实现Cloneable接口并实现其定义的clone方法
4.使用反序列化。
- Java 中 IO 流分为几种?
按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流和字符流。
字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。
20.运行时异常与一般异常有何异同?
Java提供了两类主要的异常:运行时异常runtime exception和一般异常checked exception。对于后者这种一般异常,JAVA要求程序员对其进行catch处理。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。
运行时异常我们可以不处理。这样的异常由虚拟机接管。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
JAVA容器知识点
- Java 容器都有哪些?
Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:
Collection
List
ArrayList
LinkedList
Vector
Stack
Set
HashSet
LinkedHashSet
TreeSet
Map
HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
Hashtable
2.List、Set和Map的区别?
List:是存储单列数据的集合,存储有顺序,允许重复。继承Collection接口。
Set::是存储单列数据的集合。继承Collection接口。不允许重复。
Map:存储键和值这样的双列数据的集合,存储数据无顺序,键(key)不能重复,值(value)。可以重复。
3.HashMap 和 Hashtable 有什么区别?
存储:HashMap 运行 key 和 value 为 null,而 Hashtable 不允许。
线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。
- 如何决定使用 HashMap 还是 TreeMap?
对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。
- 说一下 HashMap 的实现原理?
HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。
- 说一下 HashSet 的实现原理?
HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。
- ArrayList 和 LinkedList 的区别是什么?
数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据,而查询和修改ArrayList占优势。
综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。
Java进阶知识
1.三个与取整有关的方法:
Math.ceil():表示向上取整;Math.ceil(11.3)=12;Math.ceil(-11.3)=-12。
Math.floor():表示向下取整;Math.floor(11.6)=12;Math.floor(-11.6)=-12。
Math.round():表示四舍五入;Math.round(11.5)=12;Math.round(-11.5)=-11;
Marh.round(11.3)=11;Math.round(-11.3)=–11;
2.String和StringBuffuer、StringBuilder
String:字符串数值不可变;
StringBuffer:字符串可修改,可以动态构造字符数据。StringBuffer类是可以通过Append()来修改值。线程安全。
StringBuilder:线程不安全。
共同点:它们都可以储存和操作字符串,同时三者都使用final修饰,都属于终结类不能派生子类,操作的相关方法也类似例如获取字符串长度等。
不同:
1.其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的,每次对String的操作都会生成新的String对象,造成内存浪费。而StringBuffer和StringBuilder类表示的字符串对象可以直接进行修改,在修改的同时地址值不会发生改变。
2.StringBuilder是JDK 1.5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的(不能同步访问),因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer略高。
三者在执行速度方面的比较:StringBuilder > StringBuffer > String
对于三者使用的总结:
1.如果要操作少量的数据用String
2.单线程操作字符串缓冲区下操作大量数据用StringBuilder
3.多线程操作字符串缓冲区下操作大量数据用StringBuffer
3.对比几种不同的简单singleton单例模式
饱汉模式:类加载时完初始化,不管用不用,先创建。
//饱汉模式:类加载时完成初始化,创建出实例对象(不管用不用,先创建)。
public class SingleTon {
//实例化对象放到静态代码块中,可提高执行效率,但是可能更占用空间
function(){ //亨达返佣www.kaifx.cn/broker/hantecglobal.html
private final static SingleTon instence=new SingleTon();
private SingleTon(){};//私有的构造函数
//获取方法
public static SingleTon getinstance(){
return instence;
};
饿汉模式:第一次使用时创建对象,存在线程安全问题。
//饥汉模式:延迟加载,在第一次用的时候才创建出对象,存在线程安全问题。
public class SingleTon {
private static SingleTon instence=null;
private SingleTon(){};//私有的构造函数
//获取方法
public static synchronized SingleTon getinstance(){
if(instence==null){
//第一次使用的时候创建对象
instence=new SingleTon();
}
return instence;
};
}
4.hashCode与equals的区别与联系?
一、equals方法的作用
1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。
2 、要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。
二、Hashcode()方法:
1、我们并没有覆盖equals方法只覆盖了hashCode方法,两个对象虽然hashCode一样,但在将stu1和stu2放入set集合时由于equals方法比较的两个对象是false,所以就没有在比较两个对象的hashcode值。
2、覆盖一下equals方法和hashCode方法,stu1和stu2通过equals方法比较相等,而且返回的hashCode值一样,所以放入set集合中时只放入了一个对象。
3、我们让两个对象equals方法比较相等,但hashCode值不相等试试,虽然stu1和stu2通过equals方法比较相等,但两个对象的hashcode的值并不相等,所以在将stu1和stu2放入set集合中时认为是两个不同的对象。
总结:
1、equals方法用于比较对象的内容是否相等(覆盖以后)
2、hashcode方法只有在集合中用到
3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。
4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。
原文链接:blog.csdn.net/qq_35980218/article/details/102481247