Java经典面试题一:Java基础

(本文章只是为了巩固自己,侵删)
问题一:JDK和JRE有什么区别?
答:JDK是Java Development Kit的简称,Java开发工具包,提供了Java开发所需要的基本环境,这个环境包括两个,一个是开发环境,一个是运行环境,下面一个就是运行环境:
JRE是Java Runtime Environment的简称,Java运行环境,仅仅提供Java可以运行的环境(Java虚拟机,基础的类库),但是并不能编写程序,也就是JDK少了一个开发环境就是JRE。

JDK=JRE+Java工具
JRE=JVM+java系统类库

开发环境总的来说包含javac(编译Java)、程序调试和分析的工具(监控jconsole,jvisualvm)等其他的。
问题二:= =和equals有什么区别?
答:二者都是用来比较的;
= =的比较分为两类:
一类是比较基本类型;
一类是比较引用类型。
对于基本类型比较的是值,而对于引用类型比较的引用地址;
示例如下:

String x="string";
String y="string";
String z=new String("string");
System.out.println(x==y);
System.out.println(x==z);
System.out.println(y==z);
System.out.println(x.equals(y));
System.out.println(x.equals(z));
System.out.println(y.equals(z));

输出结果如下:

true
false
false
true
true
true

分析可知:“string”是在常量池中,x和y同时都指向它,所以二者相等。而new String()方法则是重新开辟了一个内存空间,所以引用地址也就不同。而equals()方法比较的一直都是值,三者值一样,所以就都返回true.

来看一个例子:这只是简单的创建一个类,并new两个名称一样的对象,进行比较

public class Cat {
	private String name;

	public Cat(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public static void main(String[] args) {
		Cat cat1 = new Cat("张三");
		Cat cat2 = new Cat("张三");
		System.out.println(cat1.equals(cat2));
	}
}

结果:

false

有疑问?equals不是一直比较值嘛,为什么会false呢?
关于equals,先看下源码:

public boolean equals(Object obj){
	return (this==obj);
}

可以看到,equals本质就是==,所以它也是比较两个对象的地址,而new方法则新建了一个内存空间,故结果false;
那为什么第一个例子,new的String结果为true?
让我们再看一下String中equals的源码:

public boolean equals(Object anObject) {
       //如果二者值相同,直接返回true
        if (this == anObject) {
            return true;
        }
        //如果anObject是String的一个实例,执行下面代码
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            //判断字符串长度是否相同
            if (n == anotherString.value.length) {
                //拆分成字符数组
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                //循环判断字符数组每一位是否相同
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

可以看到Object类的equals方法本质也是= =,只不过String和Integer等重写了equals方法,变成了值比较。
所以: ==对于基本类型是值比较,引用类型是引用比较;而equals通常是比较值的,虽然本质也是= =,但是很多类都重写了Object的equals方法,把引用比较改成值比较。
问题三:两个对象hashCode相同,则equals()也一定为true吗?
答:相同的对象必须有相等的哈希码,但哈希码相等不一定是相同的对象。
哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
问题四:final在java中有什么作用?
答:final是Javad中的修饰符,可以修饰类、方法、变量;
修饰类,叫最终类,不能被继承
修饰方法,不能被重写
修饰变量,叫常量,必须初始化,且不能被修改。
特点就是修饰了之后就不能改变了。
问题五:Java中Math.round(-1.5)等于多少?
答:等于-1,中间值(0.5)向右取整,正0.5向上取整,负0.5直接舍弃。
正数情况下:小数部分大于0.5,舍入到更大的整数。如果小数部分小于0.5,舍入到更小的整数。如果等于0.5,则舍入到正无穷方向的整数;
负数情况下:在负数的小数部分等于小于0.5的情况下,直接舍弃。
正数>=0.5向上取整;负数>0.5向下取整。
问题六:String属于基础数据类型吗?
答:不属于,属于对象,基础数据类型:
byte、boolean、char、short、int、long、float、double。
问题七:Java中操作字符串有哪些类?有什么区别?
答:String、StringBuffer、StringBuilder。
String声明的是不可变对象,每一次操作都会生成新的String的对象,而StringBuffer和StringBuilder是在原有对象的基础上进行操作。
StringBuffer和StringBuilder区别在于线程,StringBuffer是线程安全而StringBuilder是非线程安全,但性能更高。
单线程推荐使用StringBuilder,多线程推荐使用StringBuffer。
问题八:String str=“i”与String str=new String(“i”)一样吗?
答:不一样;内存分配方式不同,前一个Java虚拟机会分配到常量池中,后一个会分配到堆内存中。
问题九:如何将字符串反转?
答:使用StringBuilder或StringBuffer的reverse()方法。
问题十:String类的常用方法有哪些?
答:

  • indexOf:指定字符第一次出现的索引
  • charAt:指定索引处的字符
  • replace:字符串替换
  • trim:去除字符串两端的空白
  • split:分割字符串,返回分割的字符串数组
  • getBytes:将字符串编码为byte数组
  • length:字符串的长度
  • toUpperCase/toLowercase:变为大写/小写字母
  • substring:截取字符串,含同不含尾
  • equals:比较字符串

问题十一:抽象类必须有抽象方法吗?
答:不需要。抽象类不是非要有抽象方法,没有抽象方法一样可以运行。
问题十二:抽象类和普通类的区别?
答:

  • 普通类不能包含抽象方法,抽象类可以;
  • 抽象类不能实例化,普通类可以。

问题十三:抽象类能用final修饰吗?
答:不能;final修饰的类不能被继承,抽象类就是用来继承的,二者相矛盾。编译器也会报错。
问题十四:接口和抽象类的区别?
答:

  • 抽象类用extends继承,接口用implements来实现。
  • 抽象类可以有构造函数,接口不能有。
  • 抽象类可以有main方法,并能运行,接口不能有。
  • 一个类可以实现多个接口,但只能继承一个抽象类。
  • 接口中的方法默认用public修饰,抽象类可以用任意访问修饰符。

问题十五:java中io流分几种?
答:功能:输入流和输出流。
类型:字节流(8位传输,字节为单位)和字符流(16位传输,字符为单位)。
问题十六:BIO、NIO、AIO有什么区别?
答:

  • Block IO 同步阻塞式IO,传统的IO,模式简单并发处理低,一请求一应答。
  • New IO 同步非阻塞IO,传统IO的升级,三个核心API:Channel、Buffer、Selector,通过Channel通道,实现多路复用。
  • Asynchronous IO是NIO的升级,异步非阻塞式IO,基于事件和回调机制。
    问题十七:Files的常用方法?
    java.nio.file.Files
  • Files.exists():检测文件路径是否存在。
  • Files.createFile():创建文件。
  • Files.createDirectory():创建文件夹。
  • Files.delete():删除一个文件或目录。
  • Files.copy():复制文件。
  • Files.move():移动文件。
  • Files.size():查看文件个数。
  • Files.read():读取文件。
  • Files.write():写入文件。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值