Java 基础问题

本文深入解析Java中的关键概念,包括JDK与JRE的区别、==与equals的对比、字符串操作、抽象类与接口的特性、IO流的种类及Files类的使用等,是Java开发者不可错过的技术指南。

1.JDK和JRE有什么区别?
JDK(Java Development Kit) Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心,它包含了Java的运行环境(JVM+Java系统类库)和Java工具。
JRE(Java Runtime Environment) Java运行环境,运行Java程序所必须的环境的集合,包含JVM标准实现及Java核心类库。

2.==和 equals 的区别是什么?
“==” 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致。
如果两个对象的引用相同时(指向同一对象时),“==”操作符返回true,否则返回flase。
equals方法是由Object类提供的,可以由子类来进行重写。
默认的实现只有当对象和自身进行比较时才会返回true,这个时候和 “==”是等价的。Java中很多类(String类,Date类, File类)等都对equals方法进行了重写。

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
错误。
如果两个对象相等,那么它们的hashCode()值一定相同。
如果两个对象hashCode()相等,它们并不一定相等。

4.final 在 java 中有什么作用?
当用final去修饰一个类的时候,表示这个类不能被继承。
当用final去修饰一个方法的时候,表示这个方法不能被重写。
(1)一个类的private方法会隐式的被指定为final方法。
(2)如果父类中有final修饰的方法,那么子类不能去重写。
当用final去修饰一个成员变量的时候,表示这个成员变量必须要赋初始值,而且是只能初始化一次。
当用final去修饰一个方法参数的时候,表示这个方法参数不能被修改。

5.java 中的 Math.round(-1.5) 等于多少?
-1,Math.round()表示向上取整。

6.String 属于基础的数据类型吗?
不属于,Java的基础数据类型有八种。
四种整数类型(byte、short、int、long);
两种浮点数类型(float、double);
一种字符类型(char);
一种布尔类型(boolean)。

7.java 中操作字符串都有哪些类?它们之间有什么区别?
String,StringBuffer,StringBuilder.
(1)运行速度:StringBuilder > StringBuffer > String。
(2)线程安全上,StringBuilder是线程不安全的,而String,StringBuffer是线程安全的。
String:适用于少量的字符串操作的情况。
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况。
StringBuffer:适用于多线程下在字符缓冲区进行大量操作的情况。

8.String str="i" 与 String str=new String("i")一样吗?
不一样。
(1)String str="i";
在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。
(2)String str=new String("i");
在编译阶段JVM先去常量池中查找是否存在“abc”,如果过不存在,则在常量池中开辟一个空间存储“abc”。在运行时期,通过String类的构造器在堆内存中new一个空间,然后将String池中的“abc”复制一份存放到该堆空间中,在栈中开辟名字为str的空间,存放堆中new出来的这个String对象的地址值。
也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。

9.如何将字符串反转?
// 递归方法
public static String reverseStr(String str) {
    int length = str.length();
    if (length <= 1) {
        return str;
    }
    String left = str.substring(0, length / 2);
    String right = str.substring(length / 2, length);
    return reverseStr(right) + reverseStr(left);
}

10.String 类的常用方法都有哪些?
// 返回该字符串的长度
public int length();
// 返回字符串中指定位置的字符
public char charAt(int index); 
// 该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回
public String substring(int beginIndex, int endIndex);
// 该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前字符串与参数字符串的大小关系
public int compareTo(String anotherString);
// 与compareTo方法相似,但忽略大小写
public int compareToIgnore(String anotherString);
// 比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
public boolean equals(Object anotherObject);
// 将参数中的字符串str连接到当前字符串的后面,效果等价于"+"
public String concat(String str);
// 用于查找当前字符串中字符或子串,返回字符或子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1
public int indexOf(int ch/String str);
// 用字符newChar替换当前字符串中所有的oldChar字符,并返回一个新的字符串
public String replace(char oldChar, char newChar);
// 将str作为分隔符进行字符串分解,分解后的字字符串在字符串数组中返回
String[] split(String str);

11.抽象类必须要有抽象方法吗?
抽象类可以没有抽象方法,但是如果一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。
如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。

12.普通类和抽象类有哪些区别?
(1)抽象类不能被实例化。
(2)抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
(3)抽象方法只需声明,而无需实现,抽象类中可以允许普通方法有主体。
(4)含有抽象方法的类必须声明为抽象类。
(5)抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。

13.抽象类能使用 final 修饰吗?
抽象类需要被继承才能使用,而被final修饰的类无法被继承,所以abstract和final是不能共存的。

14.接口和抽象类有什么区别?
(1)抽象类可以有构造方法,接口中不能有构造方法。
(2)抽象类中可以有普通成员变量,接口中没有普通成员变量。
(3)抽象类中可以包含非抽象普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的方法。
(4)抽象类中的抽象方法的访问权限可以是 public、protected 和默认类型,接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
(5)抽象类中可以包含静态方法,在 JDK1.8 之前接口中不能不包含静态方法,JDK1.8 以后可以包含。
(6)抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问权限可以是任意的,但接口中定义的变量只能是 public static final 类型的,并且默认即为 public static final 类型。
(7)一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。
(8)抽象类主要是用来抽象类别,接口主要是用来抽象方法功能。当你关注事物的本质的时候,请用抽象类;当你关注一种操作的时候,请用接口。

15.java 中 IO 流分为几种?
(1)按流向分(站在程序角度考虑)
输入流(input)
输出流(output)
(2)按类型分:
字节流(InputStream/OutputStream),任何文件都可以通过字节流进行传输。
字符流(Reader/Writer),非纯文本文件,不能用字符流,会导致文件格式破坏,不能正常执行。

16.BIO、NIO、AIO 有什么区别?
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。
BIO是一个连接一个线程。
NIO是一个请求一个线程。
AIO是一个有效请求一个线程。

17.Files的常用方法都有哪些?
// 返回File对象对应的文件或者目录的最后修改时间
long lastModified();
// 返回File对象对应的文件或者目录的大小,以byte为单位
long length();
// 返回File对象的绝对路径
String getAbsolutePath();
// 判断File对象对应的文件或目录是否存在
boolean exists();
// 判断File对象对应的是文件还是目录
boolean isFile();
boolean isDirectory();
// 创建文件
boolean createNewFile();
// 创建多级目录
boolean mkdirs();
// 删除File对象指定的文件或者目录
boolean delete();
// 获得File对象对应的目录下的所有文件和目录
File[] listFiles();

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值