您的位置:首页 > 房产 > 建筑 > 房产信息网新楼盘_网站课程设计报告_免费刷推广链接的网站_如何推广网站运营

房产信息网新楼盘_网站课程设计报告_免费刷推广链接的网站_如何推广网站运营

2025/3/11 3:47:02 来源:https://blog.csdn.net/2301_79757798/article/details/146020583  浏览:    关键词:房产信息网新楼盘_网站课程设计报告_免费刷推广链接的网站_如何推广网站运营
房产信息网新楼盘_网站课程设计报告_免费刷推广链接的网站_如何推广网站运营

     本专栏总结了个人参考查阅出的相关高频面试题和Java常见基础知识总结,对个人来说是一种知识梳理,更希望的是能让在看的朋友在此专栏得到提升,感谢大家同行,一起进步,持续更新!

专栏地址:Java高频面试题总结

目录

1.Java中有哪8种基本数据类型?

2.这8种基本数据类型对应的包装类型是什么?

3.基本数据类型和包装类型有什么区别?

4.为什么说几乎所有对象实例都存在于堆中呢?

5.包装类型的常量池技术了解吗?

6.为什么要有包装类型?

7.什么是自动拆装箱?原理了解么?

8.为什么浮点数运算的时候会有精度丢失的风险?

9.如何解决浮点数运算的精度丢失问题?

10.成员变量与局部变量的区别?

11.静态变量有什么作用

12.什么是方法的返回值?方法有几种类型?

13.静态方法为什么不能调用非静态成员?

14.重写和重载的区别

15.什么是可变长参数?


开题 tags💡:

各位小伙伴在面试的时候,面试官往往看重的是对基础知识的掌握。只有将基础打扎实,就像盖房子的地基打好了,后面不管遇到多复杂的难题,才能灵活应对,对于零基础起步的小伙伴,此章节能够帮助您梳理知识体系,查漏补缺

1.Java中有哪8种基本数据类型?

🧒:Java中有8种基本数据类型,分别为:

byte 字节型 (用来存储小整数,如年龄,月份等)

short — 短整型(如人数,小的计数器等)

int 整数(如用户ID,价格等)

long 长整型(如时间戳,大金额等)

float 单精度浮点数(存储精度较低的小数,如科学计算)

double  双精度浮点数(存储精度更高的小数,如金融计算)

char 字符型(存储单个字符,如字母,数字或符号)

boolean  布尔型(存储逻辑值,只有true真和false假两种状态)

  8个基础类型所占空间大小

注:Java里使用的Long类型的数据一定要在数值后面加上L,否则会被当作整型解析

2.这8种基本数据类型对应的包装类型是什么?

🧒:Java中每种基本数据类型都有一个对应的包装类,这些包装类是基于基本数据类型创建的类,它们提供了方法调用和对象特性等功能

这八种基本类型对应的包装类分别为:Byte,Short,Integer,Long,Float,Double,Character,Boolean

3.基本数据类型和包装类型有什么区别?

🧒:分别从用途,存储方式,占用空间,默认值,比较方式五个方面来分析

用途:除了定义一些常量和局部变量之外,我们在其他地方比如方法参数,对象属性中很少会使用基本类型来定义常量,并且包装类型可用于泛型,而基本类型不可以

存储方式:基本数据类型的局部变量存放在Java虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被static修饰)存放在Java虚拟机的堆中。包装类型属于对象类型,我们知道几乎所有对象实例都存放在堆中

占用大小:相比于包装类型(对象类型),基本数据类型往往占用的空间非常小

默认值:成员变量包装类型不赋值就是null,而基本类型有默认值且不为null

比较方式:对于基本数据类型来说,==比较的是值,对于包装数据类型来说,==比较的是对象的内存地址,所有整型包装类对象之间值的比较,全部使用equals()方法

4.为什么说几乎所有对象实例都存在于堆中呢?

🧒:这是因为HotSpot虚拟机引用了JIT优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标星替换来实现栈上分配,而避免堆上分配内存。

5.包装类型的常量池技术了解吗?

🧒:包装类的常量池技术,是Java对某些包装类(Integer,Character)的优化手段,通过缓存常用范围内的对象,减少重复创建,提升性能。

缓存范围👇:

Integer:默认缓存-128到127之间的值(范围可通过JVM参数调整)

Long:缓存-128到127

Short:缓存-128到127

Byte:缓存全部值(-128到127)

Character:缓存0到127(ASCII字符)

Boolean:直接缓存TRUE和FALSE两个对象

Float和Double:没有实现常量池(因为浮点数的范围广,复用意义不大)

Integer a = 127;
Integer b = 127;
System.out.println(a == b);  // true(复用常量池中的对象)Integer c = 128;
Integer d = 128;
System.out.println(c == d);  // false(超出缓存范围,创建新对象)

如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。

两种浮点数类型的包装类Float,Double并没有实现常量池技术

1.缓存范围:

只有特定范围内的值会被缓存(如Integer的-128到127)

超出范围会创建新对象

2.设计目的

减少频繁使用的”小数值“对象的内存分配,提升性能

3.注意事项

不要用 == 比较包装类对象的值(因为超出缓存范围时 == 会失效)

使用equals()方法或自动拆箱(如a.intValue() == b.intValue() )

6.为什么要有包装类型?

🧒:Java的包装类型,说白了就是给基本数据类型(比如int,char)套了个”马甲“,让它们变成对象。因为Java本身是一门OOP(面向对象编程)语言,对象是Java的灵魂,它要求所有东西都要是对象,基本数据类型不能满足。

举个栗子🌰:

1.场景1:对象强迫症

比如你想把数字存进一个高级的”容器“(比如List)里,但List只收”对象“,不收int这样的小土鳖。这时候你就得用Integer(int的包装类),把数字包装成对象,才能塞进去

// 错误示范:List 不收 int,直接报错
List<int> list = new ArrayList<>(); // 正确操作:用 Integer 包装成对象
List<Integer> list = new ArrayList<>();
list.add(100); // Java 偷偷帮你包装成 Integer 对象(自动装箱)

2.场景2:给数字加技能

基本类型就是个数字,但包装类型可以给它加一堆”超能力“。比如把字符串转为数字,判断是不是质数,甚至还能表示”空值“(null)。

比如你填表单,工资没填的时候,用Integer可以表示”空“(null),而int只能默认是0,容易让人误会你月薪0元。

3.场景3:和高级功能搭伙

Java有些高级功能(比如泛型,反射)只认对象,不认基本类型。包装类就是用来和这些功能打配合的。

比如你想写个万能方法处理所有类型的数字,只能用Number(包装类的爹),int这种根本进不了门

总结:Java的包装类型,比如Integer,Character,主要是为了解决基本类型(如int,char)不能当作对象用的问题。如果我们想往List里存一组数字,但List只能存对象,这时候就需要用Integer包装一下。

另外,包装类还提供很多工具方法,比如把字符串转为数字的Integer.parseInt(),或者判断字符串是不是字母的Character.isLetter()。

还有,包装类型支持null值,在数据库查数据时,某个字段默认值可能是NULL,用Integer就能表示,而int只能默认是0,容易出错。

Java5之后还能自动装箱拆箱,写起来更方便,比如直接写Integer a = 100;不用手动new Integer(100);

7.什么是自动拆装箱?原理了解么?

🧒:基本类型和包装类之间的互转:

Integer i = 10;  //装箱  等价于Integer i = Integer.valueof(10)
int n = 1;  //拆箱  等价于 int n = i.intValue();

基本类型和包装类型之间的互转。装箱其实就是调用了包装类的Valueof ( ) 方法,拆箱其实就是调用了 xxxValue()方法。

8.为什么浮点数运算的时候会有精度丢失的风险?

🧒:这个问题和计算机保存浮点数的二进制机制有很大关系。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的。无限循环的小数存储在计算机时,只能被斩断,所以就会导致小数精度发生损失的情况。这也就解释了为什么浮点数不能用二进制精确表示。

如果要用float或double直接计算钱,可能会因为二进制浮点数的精度问题,出现”丢钱“的尴尬场面。比如0.1在二进制中无法精确表示,反复计算后误差积累,导致结果错误。

9.如何解决浮点数运算的精度丢失问题?

🧒:BigDecimal可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(如涉及到钱)都需要用BigDecimal来做。

BigDecimal基于十进制存储方式(如整数+小数点位数)避免了二进制精度丢失,更能精确运算,适合金额,金融等需要精确计算的场景。

例:一杯奶茶10.5 + 一杯可乐 5.1 ,用double计算10.5 + 5.1,结果可能是15.59999...;而BigDecimal能精确得到15.6

10.成员变量与局部变量的区别?

🧒:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数,成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制符及static修饰;但是,成员变量和局部变量都能被final所修饰;

从变量在内存的存储方式来看,如果成员变量是被static修饰,那么这个成员变量是属于类的;如果没有使用static修饰,这个成员变量是属于实例的,而对象存在于堆内存,局部变量则存在于栈内存

从变量在内存的生存时间上看,成员变量是对象的一部分,它会随着对象的创建而存在,局部变量是随着方法的调用而自动生成,随着方法的调用结束而消亡

11.静态变量有什么作用

🧒:静态变量也就是被static关键字修饰的变量,它可以被类的所有实例共享。无论一个类创建了多少个对象,它们都可以共享一个静态变量,静态变量只会被分配一次内存

静态变量是属于类本身,而不是某个对象,所以通常用类名来访问(比如ClassName.staticVar)但如果静态变量被private修饰,它就变成了类的”私有财产“,外面不能直接访问,只能通过类的”内部通道“(比如静态方法)来获取修改

示例:通过类名访问静态变量

public class Counter {// 静态变量:记录总数public static int totalCount = 0; public Counter() {totalCount++; // 每创建一个对象,总数 +1}
}// 测试:
Counter c1 = new Counter();
Counter c2 = new Counter();// 通过类名访问静态变量
System.out.println(Counter.totalCount); // 输出 2

示例:private静态变量+静态方法访问

public class Counter {// 私有静态变量:外部无法直接访问,这是一种封装体现private static int totalCount = 0; // 静态方法:提供一个公共方法,外部代码可以通过类名调用它public static int getTotalCount() {return totalCount;}public Counter() {totalCount++; // 每创建一个对象,总数 +1}
}// 测试:
Counter c1 = new Counter();
Counter c2 = new Counter();// 通过静态方法访问私有静态变量
System.out.println(Counter.getTotalCount()); // 输出 2

12.什么是方法的返回值?方法有几种类型?

🧒:方法的返回值是指我们获取到某个方法体中的代码执行后的结果,返回值的作用是接收结果,使它可以用于其他操作。

1.无参数无返回值的方法 

public class WelcomePrinter {// 无参数无返回值的方法public void printWelcomeMessage() {System.out.println("欢迎来到我的程序!");}}
/*它的作用是打印一条欢迎信息,这个方法不需要输入参数,也不需要返回任何值,
因为它只是简单地执行一个打印操作。*/

2.有参数无返回值的方法

public class UserInfoPrinter {// 有参数无返回值的方法public void printUserInfo(String name, int age) {System.out.println("用户信息:");System.out.println("姓名:" + name);System.out.println("年龄:" + age);}
}

3.有返回值无参数的方法

public class DateProvider {// 有返回值无参数的方法public String getCurrentDate() {// 获取当前日期LocalDate currentDate = LocalDate.now();// 将日期转换为字符串格式return currentDate.toString();}
}

4.有返回值有参数的方法

public int f4(int a,int b){return a*b;
}

13.静态方法为什么不能调用非静态成员?

🧒:静态方法是属于类的,类加载时分配内存,可以通过类名访问;而非静态成员属于对象,对象实例化之后才存在,必须通过对象去访问。

因为非静态化成员依赖对象存在,而静态成员调用时可能还没有对象,所以静态方法不能调用非静态成员,而非静态成员可以访问静态成员

public class Example {// 静态变量:公共设施public static String staticVar = "我是静态变量";// 静态方法:公共设施public static void staticMethod() {System.out.println("我是静态方法");}// 非静态变量:个人物品public String instanceVar = "我是非静态变量";// 非静态方法:个人物品public void instanceMethod() {System.out.println("我是非静态方法");}
}// 测试:
// 1. 静态成员:通过类名直接访问
System.out.println(Example.staticVar); // 输出 "我是静态变量"
Example.staticMethod();                // 输出 "我是静态方法"// 2. 非静态成员:必须通过对象访问
Example obj = new Example(); // 先创建对象
System.out.println(obj.instanceVar); // 输出 "我是非静态变量"
obj.instanceMethod();                // 输出 "我是非静态方法"

14.重写和重载的区别

🧒:重载就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理

重载发生在同一个类中(或者父类或子类),方法名必须相同,参数类型,个数,顺序可以不同,方法返回值和访问修饰符可以不同

重写就是当子类继承自父类的相同办法,输入数据一样,但要做出有别于父类的响应时,就要去覆盖父类方法

重写发生在运行期,是子类对父类允许访问的方法的实现过程进行重新编写

如果父类方法访问修饰符为 private / final / static 则子类就不能重写该方法,但是被static修饰的方法能够被再次声明

15.什么是可变长参数?

🧒:可变长参数允许接受任意数量的同类型参数,语法是在参数类型后加...,底层实际是一个数组。

可变长参数本质上就是一个数组,比如String...foods实际是String [ ] foods,调用时,Java会自动将参数打包成数组。

void methodName(Type...parameterName),可以传0个,1个或者多个参数,如methodName(1,2,3)或methodName()。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com