首页 > 编程语言 >Java面试题(二)

Java面试题(二)

时间:2023-03-27 13:36:47浏览次数:32  
标签:面试题 java String equals println Java 抽象类 out

JDK和JRE有什么区别?

JDK:Java Development Kit 的简称,java开发工具包,提供了java的开发环境和运行环境。

JRE:Java Runtime Environment的简称,java运行环境,为java的运行提供了所需环境。具体来说JDK其实包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具。简单来说:如果你需要运行java程序,只需安装JRE就可以了,如果你需要编写java程序,需要安装JDK。

 

== 和  equals 的区别是什么?

== 解读

对于基本类型和引用类型 == 的作用效果是不同的,如下图所示:

基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;

代码示例:

String x = “string”;

String y = “string”;

String x = new String(“string”);

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

代码解读:因为x和y指向的是同一个引用,所以 == 也是 true,而new String()方法则是重写开辟了内存空间,所以 == 结果为 false ,而 equals 比较的一直是值,所以结果都为 true。

equals解读:equals 本质上就是 ==, 只不过String 和Integer 等重写了 equals 方法,

把它变成了值比较。看下面的代码就明白了。

首先来看默认情况下equals比较一个有相同值的对象,代码如下:

class Cat{

    public Cat(String name){

        this.name = name;

    }

    private String name;

    public String getName() {

        return name;

    }

    public String setName(String name) {

        this.name = name;

    }

}

Cat c1 = new Cat(“猫”);

Cat c2 = new Cat(“猫”);

System.out.println(c1.equals(c2));//false

看equals源码就知道了,源码如下:

public boolean equals(Object obj){

    return (this == obj);

}

原来 equals本质上是 == 。

 

两个相同值的String对象,为什么返回的是true?代码如下:

String s1 = new String("amo");

String s2 = new String("amo");

System.out.println(s1.equals(s2));//true

String 的 equals 源码如下:

public boolean equals(Object anObject){

    if (this == anObject){

        return true;

    }

    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;

}

 

String 重写了 Object 的 equals方法,把引用比较改成了值比较。

 

总结: == 对于基本类型来说是值比较。对于引用类型来说是比较的引用;

而equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如String、

Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

 

两个对象的 hashCode() 相同,则 equals() 也一定为 true ,对吗?

不对,两个对象的 hashCode() 相同,equals() 不一定 true。

代码示例:

String str1 = “通话”;

String str2 = “重地”;

System.out.println(String.format("str1: %d | str2: %d", str1.hashCode(),str2.hashCode()));

System.out.println(str1.equals(str2));

执行结果:

str1: 1179395 | str2: 1179395

false

代码解读:

显然 “通话” 和 “重地” 的hashCode() 相同,然而 equals() 则为false,因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等, 并不一定能得出键值对相等。

 

final 在 java 中有什么作用?

final修饰的类叫最终类,该类不能被继承。final 修饰的方法不能被重写。final修饰的变量叫常量,

常量必须初始化,初始化之后值就不能被修改。

 

java中的Math.round(-1.5)等于多少?

等于-1,因为在数轴上取值时,中间值(0.5) 向右取整, 所以正0.5是往上取整,负0.5是直接舍弃。

 

String 属于基础的数据类型吗?

Sting不属于基础类型,基础类型有8种:byte、boolean、char、short、int、float、long、double,而String属于对象。

 

java中操作字符串都有那些类?它们之间有什么区别?

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

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

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

 

String str = “i”  与 String str = new String(“i”) 一样吗?

不一样,因为内存的分配方式不一样。String str = "i" 的方式,java虚拟机 会将其分配到常量池中;而 String str = new String("i") 则会被分到堆内存中。

 

如何将字符串反转?

使用StringBuilder 或者 StringBuffer 的 reverse()方法

示例代码:

// StringBuffer reverse

StringBuffer stringBuffer = new StringBuffer();

stringBuffer.append("abcdefg");

System.out.println(stringBuffer.reverse());// gfedcba

// StringBulider reverse

StringBulider stringBulider = new StringBulider();

stringBulider.append("abcdefg");

System.out.println(stringBulider.reverse());// gfedcba

 

String类的常用方法都有那些?

indexOf() 返回指定字符的索引
charAt() 返回指定索引处的字符
replace() 字符串替换
trim() 去除字符串两端空白
split() 分割字符串,返回一个分割后的字符串数组
getBytes() 返回字符串的byte类型数组
length() 返回字符串长度
toLowerCase() 将字符串转成小写字符
toUpperCase() 将字符串转成大写字符
substring() 截取字符串
equals() 字符串比较

 

抽象类必须要有抽象方法吗?

示例代码:

abstract class Cat{

    public static void sayHi() {

        System.out.println("hi~");

    }

}

抽象类并没有抽象方法但完全可以正常运行。

 

普通类和抽象类有哪些区别?

普通类不能包含抽象方法,抽象类可以包含抽象方法。

普通类可以直接实例化,抽象类不能直接实例化。

 

抽象类能使用final修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,

所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息:

 

 

 

接口和抽象类有什么区别?

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。

构造函数:抽象类可以有构造函数;接口不能有 。

main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

 

java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

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

字节流和字符流的区别是:字节流按8位传输以字节为单位输入输出数据,字符流按16位传输以字符为单位输入输出数据。

 

BIO、NIO、AIO 有什么区别?

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

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

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

 

Files 的常用方法都有哪些?

Files.exists()

检测文件路径是否存在
Files.createFile() 创建文件
Files.createDirectory() 创建文件夹
Files.delete() 删除一个文件或者目录
Files.copy() 复制文件
Files.move() 移动文件
Files.size() 查看文件个数
Files.read() 读取文件
Files.write() 写入文件

 

 

有不对欢迎指出,侵删

标签:面试题,java,String,equals,println,Java,抽象类,out
From: https://www.cnblogs.com/yvette-hathaway/p/17252775.html

相关文章

  • Java数据结构 HashMap 哈希表定义使用
    1.HashMapHashMap是一个散列表,它存储的内容是键值(key-value)映射。其中key和value类型可以相同也就而已不同,根据定义。2.HashMap使用1)定义HashMap<Integer,String>hashmap1......
  • java 类的初始化顺序
    父类的静态字段-->父类静态代码块-->子类静态字段-->子类的静态代码块-->父类成员变量-->父类构造代码块-->父类构造方法-->子类成员变量-->子类构造代码块-->子类构造方法......
  • Java程序基础
    一。面向对象的概念1.面向对象是一种思想,是Java基础知识中最重要的部分,没有之一。 面向对象是相对面向过程而言的,面向对象和面向过程都是一种思想。(1)分析不同面向......
  • java代码备份mysql数据库
    生成环境的数据库我们需要不断的进行备份,不然服务器出现故障,会是灾难性的直接添加我的代码packagecom.hrp.task;importcom.alibaba.fastjson.JSON;importcom.bas......
  • 剑指offer04(Java)二维数组中的查找(中等)
    题目:在一个n*m的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一......
  • Java静态代理和动态代理的区别
    一、静态代理代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。优点:可以在......
  • 【JavaScript快速排序算法】不同版本原理分析
    说明快速排序(QuickSort),又称分区交换排序(partition-exchangesort),简称快排。快排是一种通过基准划分区块,再不断交换左右项的排序方式,其采用了分治法,减少了交换的次数。它的......
  • 某大厂面试题:说一说Java、Spring、Dubbo三者SPI机制的原理和区别
    大家好,我是三友~~今天来跟大家聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别。其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是......
  • TCP/IP面试题
    1.OSI七层模型与TCP/IP四层模型OSI七层模型描述TCP/IP四层模型协议应用层为应用程序提供服务的,使各个应用程序能够访问网络应用层HTTP、TFTP,FTP,NFS,WAI......
  • Java 在代码中区分json和array
    publicstaticvoidmain(String[]args){Stringn="{\n"+""data":[\n"+"{\n"+""category":"设计资质",\n"+""certNameL......