2.java基础(二)

int和Integer有什么区别,二者在做==运算时会得到什么结果?

int是基本数据类型,而integer是他的包装类。两者在做==运算时Integer会自动拆箱为int类型,从而比较int值是否相等,不相等返回false,相等返回ture

说一说你对面向对象的理解,他和面向过程有何不同

面向对象是一种程序设计的方法论,他把程序中的一切元素(如数据、功能)抽象成对象,通过对象之间的交互实现系统的实现和设计的目的,这样做使代码具有良好的复用性、可维护性、可拓展性。
不同点在于
1.封装和抽象:面向对象强调把数据和方法封装在对象内部,提供对外部的隐藏,而面向过程没有这种封装性、数据和函数是分开的
2. 继承和多态:面向对象支持继承和多态的特性,使得代码的复用和扩展更加方便。面向过程则没有这种特性,导致代码的复用性较差。
3. 对象和消息:面向对象将程序看作是一系列对象之间的消息传递,通过对象之间的交互来完成任务。面向过程则强调函数的调用和参数传递。
4. 设计思维角度:面向对象更加注重问题的分析和设计,将问题抽象成对象、类和关系。面向过程更加注重解决问题的具体步骤和流程。

说一说hashCode()和equals()的关系

hashCode()用于获取哈希码(散列码),eauqls()用于比较两个对象是否相等,它们应遵守如下规定:
如果两个对象相等,则它们必须有相同的哈希码。
如果两个对象有相同的哈希码,则它们未必相等。

必须有相同的哈希码是为了确保相等的对象在哈希表、散列表等数据结构中能够被正确地查找到。

未必相等的原因是由于哈希码的计算方法可能会出现哈希冲突,即不同的对象计算得出相同的哈希码。这时候就需要使用equals()方法来进一步判断对象的相等性,以确定是否为相等的对象。

String可以被继承吗?

不可以String类由final修饰,所以不能被继承。

为什么String类要被设计为不可变类

1.线程安全
不可变类是线程安全的,多个线程同时访问修改同一个字符串对象,不会出现数据不一致的问题,因此在多线程下使用String类更加安全可靠
2.缓存利用
由于字符串是不可变的,那么相同的字符串具有相同的内容时会共享同一个字符数组,这样可以节省内存空间并提高性能
3.安全性
字符串经常被用作参数或者密钥进行传递,通过将字符串设计为不可变类,可以确保其内容不会被修改,提高了系统的安全性。
4.哈希相关操作
符串经常被用作哈希表的键或其他需要快速查找和匹配的数据结构。不可变性保证了字符串对象的哈希码在创建后不会发生改变,从而可以快速定位和比较字符串对象,提高了哈希相关操作的效率。
5.可靠性和可预测性
由于字符串是不可变的,它们的值在创建后不会发生改变。这意味着字符串对象在整个程序的生命周期内保持不变,可以减少程序中出现的意外副作用和错误,提高了代码的可靠性和可预测性。

说一说StringBuffer和StringBuilder有什么区别

StringBuffer加入了synchronized关键字来保证在多个线程访问和修改时的线程安全性,因此在多线程情况下需要频繁对字符串进行操作的话推荐使用StringBuffer
而StringBuilder则是没有加入synchronized关键字,因此在单线程情况下性能比StringBuffer高,由于不需要考虑线程同步的开销,StringBuilder的执行效率更高。因此,如果在单线程环境下进行字符串的频繁修改操作,推荐使用StringBuilder来获得更好的性能。

使用字符串时,new和""推荐使用哪种方式?

一般来说更加推荐使用“”的方式,先看看 “hello” 和 new String(“hello”) 的区别:

当Java程序直接使用 “hello” 的字符串直接量时,JVM将会使用常量池来管理这个字符串,如果多个字符串字面量的内容相同,它们将在内存中共享同一个String对象,从而节省了内存空间。;

当使用 new String(“hello”) 时,JVM会先使用常量池来管理 “hello” 直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。

显然,采用new的方式会多创建一个对象出来,会占用更多的内存,所以一般建议使用直接量的方式创建字符串。

说一说对字符串拼接的理解

字符串拼接有很多种方式,最常见的有四种
1.+ 运算符:如果拼接的都是字符串直接量,则适合使用 + 运算符实现拼接;

2.StringBuilder:如果拼接的字符串中包含变量,并不要求线程安全,则适合使用StringBuilder;

3.StringBuffer:如果拼接的字符串中包含变量,并且要求线程安全,则适合使用StringBuffer;

4.String类的concat方法:如果只是对两个字符串进行拼接,并且包含变量,则适合使用concat方法;

两个字符串相加的底层是如何实现的?

如果拼接的都是字符串直接量,则在编译时编译器会将其直接优化为一个完整的字符串,和你直接写一个完整的字符串是一样的。

如果拼接的字符串中包含变量,则在编译时编译器采用StringBuilder对其进行优化,即自动创建StringBuilder实例并调用其append()方法,将这些字符串拼接在一起。

String a = “abc”; ,说一下这个过程会创建什么,放在哪里?

VM会使用常量池来管理字符串直接量。在执行这句话时,JVM会先检查常量池中是否已经存有"abc",若没有则将"abc"存入常量池,否则就复用常量池中已有的"abc",将其引用赋值给变量a。

new String(“abc”) 是去了哪里,仅仅是在堆里面吗?

在执行这句话时,JVM会先使用常量池来管理字符串直接量,即将"abc"存入常量池。然后再创建一个新的String对象,这个对象会被保存在堆内存中。并且,堆中对象的数据会指向常量池中的直接量。

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

相同点
都不能被实例化 ,接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
不同点
1.抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;接口中的方法默认使用public修饰
2.接口成员变量默认为public static final,必须赋初值,不能被修改。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;
3.实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
4.接口强调特定功能的实现,而抽象类强调所属关系。
5.抽象类可以包含方法、构造方法,方法可以实现,但是构造方法不能用于实例化,主要用途是被子类调用。接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值