归纳知识总结与面试题
程序员文章站
2022-06-27 16:13:40
归纳知识总结与面试题型...
归纳知识总结与面试题型(2020-11-22起 持续更新)
一、Java 基础
1. jre与jdk的区别
- jre:Java Runtime Environment 的简称,是运行环境,安装jre会自带JVM虚拟机,java源码需要使用虚拟机才能运行在windows或者Linux系统上运行
- jdk:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境 下载jdk时也包含jre。
- 分析:具体来说需要运行java代码jre就行了,而需要开发编写java程序,只需jdk就够了
2.equals与==的区别
Student s=new Student("a", 18);
Student s1=new Student("a", 18);
System.out.println(System.identityHashCode(s)); //打印内存地址2018699554
System.out.println(System.identityHashCode(s1));//打印内存地址1311053135
System.out.println(s==s1);//false
---------------------------------------------------------------------
//每个类的内存地址都是随机变化的 但每个对象的内存地址不可能一样
//如果要判断对象是否一样就需要在Student类里重写equals方法了
//我们使用的是开发工具的快捷生成 方法体重还是使用==判断值的
public class Student {
private String name;
private int num;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (num != other.num)
return false;
return true;
}
}
- == 解读:基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;
- equals:是Object类下的方法,在object类里比较的是内存地址,是==,而String类里重写了equal方法,里面比较的是值的内容,如果需要比较对象里的值时,需要重写equals方法
- 总结== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
1 答案是不对,两个对象的 hashCode()相同,equals()不一定 true。
因为我们可以重写ehashCode的规则使其内存地址样,也可以重写equals,改变 比较的方法,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
4. final 在 java 中有什么作用?
- 被final修饰的类 不能被其他类继承
- 被final修饰的变量只能赋值初始值一次,如果没有赋值初识值,编译器则报错;
- 被final修饰的方法不能被子类重写
- 总结:final是常量的意思,被修饰是变量、方法、类是不能被修改的;
5. java 中的 Math.round(-1.5) 等于多少?
等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。
6. String 属于基础的数据类型吗?
String不是基本数据类型,基本数据类型有:byte int short lang double float boolean char 属于java中的基本数据类型,String是不可变的引用数据类型.
注意:String是java.lang包下的一个类,底层是Cahr[] value数组是被final修饰的
7. java 中操作字符串都有哪些类?它们之间有什么区别?
- java中操作字符串的类有String,StringBuffer,StringBuilder三大类
- String与StringBuffer,StringBuilder的区别:首先String是不可变字符串 底层是一个被File修饰的Object数组,所以是不可变的,每次创建一个String对象会在常量池创建出来,然后将指针重新指向他,如:“a”+“ab”=“aab”,字符串常量池会创建这三个不一样的对象.
- StringBuffer与StringBuilder是可变字符串,在抽象类 AbstractStringBuilder底层也是char[] value,但没有被final修饰
//通过反射拿到抽象类char数组的源码
StringBuffer buff=new StringBuffer("123");
Class c=buff.getClass();
Class superC= c.getSuperclass();
Field f= superC.getDeclaredField("value");
f.setAccessible(true);
char[] vlaue=(char[]) f.get(buff);
System.out.println(vlaue);//123[][][][][][][][][]... 这里是初识容量16;
- StringBuffer与StringBuilder的区别:1.他们都是可变字符串,StringBuffer底层的方法大部分是用synchronize关键字修饰的,是线程安全的,StringBuilder是非线程安全的 2.StringBuffer的toString是带缓冲的,而StringBuilder的toString是直接取对象.
- 总结:String:适用于少量的字符串操作的情况,StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况,StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
8. String str="i"与 String str=new String(“i”)一样吗?
内存地址的分配会不一样
如图:
9. 如何将字符串反转?
使用StringBuffer和StringBuilder的reverse()方法.注:String没有reverse()方法
StringBuffer t=new StringBuffer("123456789");
t=t. reverse() ;
System.out.println(t);//987654321
10.String 类的常用方法都有那些?
- equals()比较String的值
- indexOf()传入字符串,找到该字符串返回该字符所在位置,未找到返回-1
- charAt():返回指定索引处的字符。
- replace():字符串替换。
- trim():去除字符串两端空白。
- split():分割字符串,返回一个分割后的字符串数组。
- getBytes():返回字符串的 byte 类型数组。
- length():返回字符串长度。
- toLowerCase():将字符串转成小写字母。
- toUpperCase():将字符串转成大写字符。
- substring():截取字符串。
11. 抽象类必须要有抽象方法吗?
抽象类里不一定有抽象方法,但有抽象方法的类,一定是抽象类或接口
12.普通类和抽象类有哪些区别?
1.普通类里不能有抽象方法而抽象类可以有
2.抽象可不能实例化(不能直接实例化,直接实例化需要重写抽象方法),而实例类可以实例化
13.抽象类能使用 final 修饰吗?
抽象类是不能被final修饰的,抽象类的其实就是让其子类继承的,被final修饰后就抽象类就没有任何意义了!
14. 接口和抽象类有什么区别?
本文地址:https://blog.csdn.net/weixin_48269369/article/details/109913483