Java基础-基础知识体系小结 Q/A

文章目录

    • 知识体系
    • Q&A
      • Java 中应该使用什么数据类型来代表价格?
      • 怎么将 byte 转换为 String?
      • Java 中怎样将 bytes 转换为 long 类型?
      • 存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么? 如 C = (C) B;
      • Java 中 ++ 操作符是线程安全的吗?
      • a = a + b 与 a += b 的区别
      • 我能在不进行强制转换的情况下将一个 double 值赋值给 long
      • int 和 Integer 哪个会占用更多的内存?
      • 为什么 Java 中的 String 是不可变的(Immutable)?
      • 我们能在 Switch 中使用 String 吗?
      • Java 中的构造器链是什么?
      • 枚举类
      • 什么是不可变对象(immutable object)? Java 中怎么创建一个不可变对象?
      • 有没有可能两个不相等的对象有相同的 hashcode?
      • 两个相同的对象会有不同的 hash code 吗?
      • 为什么在重写 equals 方法的时候需要重写 hashCode 方法?
      • “a==b”和”a.equals(b)”有什么区别?
      • a.hashCode() 有什么用? 与 a.equals(b) 有什么关系?
      • final、finalize 和 finally 的不同之处?
      • Java 中,Serializable 与 Externalizable 的区别?
      • Java 中,Serializable 与 Externalizable 的区别?
      • 接口是什么? 为什么要使用接口而不是直接使用具体类?
      • Java 中,抽象类与接口之间有什么不同?
      • Object有哪些公用方法?
      • equals与==的区别
      • String、StringBuffer与StringBuilder的区别
      • 接口与抽象类
      • 异常
      • 关于finally
      • 受检查异常和运行时异常
      • super出现在父类的子类中。有三种存在方式
      • 构造内部类和静态内部类对象
      • 序列化
      • 局部变量为什么要初始化
      • Java语言的鲁棒性

主要对Java基础知识体系小结,同时结合一些Q&A进行理解

知识体系

img

Q&A

Java 中应该使用什么数据类型来代表价格?

如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的 double 类型。

怎么将 byte 转换为 String?

image-20241010103155046

可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。

Java 中怎样将 bytes 转换为 long 类型?

String接收bytes的构造器转成String,再Long.parseLong


public static void main(String[] args) {   // 十进制 byte byte[] bytes = {49, 50, 51};// 将字节数组转换为字符串String str = new String(bytes);// 将字符串转换为长整型long value = Long.parseLong(str);System.out.println(value);}
输出结果:123

存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么? 如 C = © B;

可以,向下转型。但是不建议使用,容易出现类型转型异常.

Java 中 ++ 操作符是线程安全的吗?

不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。还会存在竞态条件(读取-修改-写入)。

a = a + b 与 a += b 的区别

+= 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。

byte a = 127;
byte b = 127;
b = a + b; // error : cannot convert from int to byte
b += a; // ok

(因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)

我能在不进行强制转换的情况下将一个 double 值赋值给 long


不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。

int 和 Integer 哪个会占用更多的内存?

Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。

为什么 Java 中的 String 是不可变的(Immutable)?

Java 中的 String 不可变是因为 Java 的设计者认为字符串使用非常频繁,将字符串设置为不可变可以允许多个客户端之间共享相同的字符串。更详细的内容参见答案。

我们能在 Switch 中使用 String 吗?


从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法糖。内部实现在 switch 中使用字符串的 hash code。

Java 中的构造器链是什么?

当你从一个构造器中调用另一个构造器,就是Java 中的构造器链。这种情况只在重载了类的构造器的时候才会出现。

枚举类

JDK1.5出现 每个枚举值都需要调用一次构造函数

什么是不可变对象(immutable object)? Java 中怎么创建一个不可变对象?

不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。

如何在Java中写出Immutable的类?

要写出这样的类,需要遵循以下几个原则:

1)immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象。

2)Immutable类的所有的属性都应该是final的。

3)对象必须被正确的创建,比如: 对象引用在对象创建过程中不能泄露(leak)。

4)对象应该是final的,以此来限制子类继承父类,以避免子类改变了父类的immutable特性。

5)如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一个拷贝,而不是该对象本身(该条可以归为第一条中的一个特例)

有没有可能两个不相等的对象有相同的 hashcode?

有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的hashcode 值,但是没有关于不相等对象的任何规定。

两个相同的对象会有不同的 hash code 吗?

不能,根据 hash code 的规定,这是不可能的。

为什么在重写 equals 方法的时候需要重写 hashCode 方法?

因为有强制的规范指定需要同时重写 hashcode 与 equals 是方法,许多容器类,如 HashMap、HashSet 都依赖于 hashcode 与 equals 的规定。

“a==b”和”a.equals(b)”有什么区别?

如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。

a.hashCode() 有什么用? 与 a.equals(b) 有什么关系?

简介: hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equals() 方法来判断相等的对象,必须具有相同的 hash code。

1、hashcode的作用

List和Set,如何保证Set不重复呢? 通过迭代使用equals方法来判断,数据量小还可以接受,数据量大怎么解决? 引入hashcode,实际上hashcode扮演的角色就是寻址,大大减少查询匹配次数。

2、hashcode重要吗

对于数组、List集合就是一个累赘。而对于hashmap, hashset, hashtable就异常重要了。

3、equals方法遵循的原则

  • 对称性 若x.equals(y)true,则y.equals(x)true
  • 自反性 x.equals(x)必须true
  • 传递性 若x.equals(y)true,y.equals(z)true,则x.equals(z)必为true
  • 一致性 只要x,y内容不变,无论调用多少次结果不变
  • 其他 x.equals(null) 永远false,x.equals(和x数据类型不同)始终false

final、finalize 和 finally 的不同之处?

  • final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。
  • Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,但是什么时候调用 finalize 没有保证。
  • finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。

Java 中,Serializable 与 Externalizable 的区别?

Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱而且不安全。Externalizable 允许你控制整个序列化过程,指定特定的二进制格式,增加安全机制。

Java 中,Serializable 与 Externalizable 的区别?

Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱而且不安全。Externalizable 允许你控制整个序列化过程,指定特定的二进制格式,增加安全机制。

接口是什么? 为什么要使用接口而不是直接使用具体类?

接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许普通方法,以此来保证抽象,但是 Java 8 中你可以在接口声明静态方法和默认普通方法。

Java 中,抽象类与接口之间有什么不同?

Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个类只能继承一个类,但是可以实现多个接口。抽象类可以很好的定义一个家族类的默认行为,而接口能更好的定义类型,有助于后面实现多态机制 参见第六条。


Object有哪些公用方法?

  • clone

  • equals

  • hashcode

  • wait

  • notify

  • notifyall

  • finalize

  • toString

  • getClass

除了clone和finalize其他均为公共方法。


equals与==的区别

区别1. ==是一个运算符 equals是Object类的方法

区别2. 比较时的区别

  • 用于基本类型的变量比较时: ==用于比较值是否相等,equals不能直接用于基本数据类型的比较,需要转换为其对应的包装类型。
  • 用于引用类型的比较时。==和equals都是比较栈内存中的地址是否相等 。相等为true 否则为false。但是通常会重写equals方法去实现对象内容的比较。

String、StringBuffer与StringBuilder的区别

第一点: 可变和适用范围。String对象是不可变的,而StringBuffer和StringBuilder是可变字符序列。每次对String的操作相当于生成一个新的String对象,而对StringBuffer和StringBuilder的操作是对对象本身的操作,而不会生成新的对象,所以对于频繁改变内容的字符串避免使用String,因为频繁的生成对象将会对系统性能产生影响。

第二点: 线程安全。String由于有final修饰,是immutable的,安全性是简单而纯粹的。StringBuilder和StringBuffer的区别在于StringBuilder不保证同步,也就是说如果需要线程安全需要使用StringBuffer,不需要同步的StringBuilder效率更高。

接口与抽象类

  • 一个子类只能继承一个抽象类, 但能实现多个接口
  • 抽象类可以有构造方法, 接口没有构造方法
  • 抽象类可以有普通成员变量, 接口没有普通成员变量
  • 抽象类和接口都可有静态成员变量, 抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
  • 抽象类可以没有抽象方法, 抽象类可以有普通方法;接口在JDK8之前都是抽象方法,在JDK8可以有default方法,在JDK9中允许有私有普通方法
  • 抽象类可以有静态方法;接口在JDK8之前不能有静态方法,在JDK8中可以有静态方法,且只能被接口类直接调用(不能被实现类的对象调用)
  • 抽象类中的方法可以是public、protected; 接口方法在JDK8之前只有public abstract,在JDK8可以有default方法,在JDK9中允许有private方法

异常

相关的关键字 throw、throws、try…catch、finally

  • throws 用在方法签名上, 以便抛出的异常可以被调用者处理
  • throw 方法内部通过throw抛出异常
  • try 用于检测包住的语句块, 若有异常, catch子句捕获并执行catch块

关于finally

  • finally不管有没有异常都要处理
  • 当try和catch中有return时,finally仍然会执行,finally比return先执行
  • 不管有木有异常抛出, finally在return返回前执行
  • finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的

注意: finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值

finally不执行的几种情况: 程序提前终止如调用了System.exit, 病毒,断电

受检查异常和运行时异常

  • 受检查的异常(checked exceptions),其必须被try…catch语句块所捕获, 或者在方法签名里通过throws子句声明。受检查的异常必须在编译时被捕捉处理,命名为Checked Exception是因为Java编译器要进行检查, Java虚拟机也要进行检查, 以确保这个规则得到遵守。

常见的checked exception: ClassNotFoundException IOException FileNotFoundException EOFException

  • 运行时异常(runtime exceptions), 需要程序员自己分析代码决定是否捕获和处理,比如空指针,被0除…

常见的runtime exception: NullPointerException ArithmeticException ClassCastException IllegalArgumentException IllegalStateException IndexOutOfBoundsException NoSuchElementException

  • Error的,则属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,Error不需要捕获。

super出现在父类的子类中。有三种存在方式

  • super.xxx(xxx为变量名或对象名)意思是获取父类中xxx的变量或引用
  • super.xxx(); (xxx为方法名)意思是直接访问并调用父类中的方法
  • super() 调用父类构造

注: super只能指代其直接父类

构造内部类和静态内部类对象

public class Enclosingone {public class Insideone {}public static class Insideone{}
}public class Test {public static void main(String[] args) {// 构造内部类对象需要外部类的引用Enclosingone.Insideone obj1 = new Enclosingone().new Insideone();// 构造静态内部类的对象Enclosingone.Insideone obj2 = new Enclosingone.Insideone();}
}

静态内部类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。非静态内部类能够访问外部类的静态和非静态成员。静态内部类不能访问外部类的非静态成员,只能访问外部类的静态成员。


序列化

声明为static和transient类型的数据不能被序列化, 反序列化需要一个无参构造函数

局部变量为什么要初始化

局部变量是指类方法中的变量,必须初始化。局部变量运行时被分配在栈中,量大,生命周期短,如果虚拟机给每个局部变量都初始化一下,是一笔很大的开销,但变量不初始化为默认值就使用是不安全的。出于速度和安全性两个方面的综合考虑,解决方案就是虚拟机不初始化,但要求编写者一定要在使用前给变量赋值。

Java语言的鲁棒性

Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。通过集成的面向对象的例外处理机制,在编译时,Java揭示出可能出现但未被处理的异常,帮助程序员正确地进行选择以防止系统的崩溃。另外,Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。


image-20241010111459807

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java初阶~~四种内部类总结

文章目录 1.内部类的分类2.局部内部类2.1.基本语法2.2就近原则的理解 3.匿名内部类3.1基于接口的匿名内部类3.2基于普通类的匿名内部类3.3基于抽象类的匿名内部类3.4匿名内部类的细节3.5匿名内部类实践3.5.1作为实参进行传递3.5.2实践案例 4.成员内部类4.1基本介绍4.2外部类&am…

5本一投就中的极速期刊,性价比高,1周-1个月录用,见刊极快!

在当今快节奏的学术界,研究者们不仅追求高质量的研究成果,还希望能够迅速地将这些成果分享给全球的同行。为此,科检易学术精心挑选了10本以高效审稿流程著称的期刊,这些期刊不仅性价比高,而且从投稿到录用的时间极短&a…

ARM base instruction -- asr

算术右移,结果带符号。 Arithmetic Shift Right (immediate) shifts a register value right by an immediate number of bits, shifting in copies of the sign bit in the upper bits and zeros in the lower bits, and writes the result to the destination reg…

数据结构_绪论(选择题)

2-1 在数据结构中,从逻辑上可以把数据结构分成( )。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 2-2 与数据元素本身的形式、内容、相对位置、个数无关的是数据的( &am…

SD NAND Flash 小容量存储解决方案及其STM32测试例程讲解

文章目录 前言一、Flash闪存是什么?二、SD NAND Flash三、STM32测试例程四、总结 前言 随着移动存储技术的快速发展和便携式数字设备的广泛应用,Flash闪存作为非易失性存储解决方案,在各种电子设备中扮演着越来越重要的角色。本文提供关于Fl…

【含开题报告+文档+PPT+源码】基于SpringBoot乡村助农益农平台的设计与实现

开题报告 近年来,随着社会经济的快速发展和人民生活水平的提高,人们对优质农产品的需求越来越高。然而,传统的农产品销售管理模式存在一些问题。首先,农产品供应链信息不透明,导致生产者难以了解市场需求和价格变动趋…

iMazing只能苹果电脑吗 Win和Mac上的iMazing功能有区别吗

在当今数字时代,管理和备份手机数据变得越来越重要。无论是转移照片、备份短信,还是管理应用程序,一个强大的工具可以大大简化这些操作。iMazing作为一款备受好评的iOS设备管理软件,已经成为许多用户的选择。但是,许多…

《C++代码热更新:为高效开发注入新活力》

一、引言 在软件开发的过程中,我们常常面临着这样的挑战:当程序已经部署到生产环境后,发现了一些需要紧急修复的 bug 或者需要添加新的功能。传统的方法是停止程序运行,进行代码修改,然后重新编译、部署,这…

请用python写一个小程序,把浏览器中打开的页面设置为深色模式

要实现将浏览器中打开的页面设置为深色模式,可以使用Python的selenium库来控制浏览器。以下是一个示例程序: from selenium import webdriver from selenium.webdriver.chrome.options import Options# 创建Chrome浏览器选项对象 chrome_options = Options()# 设置深色模式 …

Anaconda创建环境

目录 前言 第一步:更改环境创建位置 第二步:安装环境 前言 在我们创建多个项目的时候,有时会安装的库版本冲突,所以最好是一个项目一个环境 第一步:更改环境创建位置 新安装Anaconda后,在创建环境时环…

Go版数据结构 -【8.3 插入排序】

8.3 插入排序 插入排序是一种简单且直观的排序算法,它的基本思想是将数组分为已排序和未排序两个部分。 通过逐步将未排序部分的元素插入到已排序部分的正确位置,逐步构建整个有序序列。 看起来与选择排序是差不多的,但是还是有一些差别的…

【React】setState (useState) 是怎么记住上一个状态值的?

在 React 中,setState 通过 React 内部的状态管理机制来记住上一个状态值。即使每次组件重新渲染时,函数组件会被重新执行,React 仍能通过其内部的状态管理系统保持和追踪组件的状态变化。下面详细解释其工作原理: 1. setState 的…

Web安全 - 路径穿越(Path Traversal)

文章目录 OWASP 2023 TOP 10导图定义路径穿越的原理常见攻击目标防御措施输入验证和清理避免直接拼接用户输入最小化权限日志监控 ExampleCode漏洞代码:路径穿越攻击案例漏洞说明修复后的安全代码代码分析 其他不同文件系统下的路径穿越特性Windows系统类Unix系统&a…

ctfshow-web 萌新题

给她 spring漏洞 pyload: 1.dirsearch扫描&#xff0c;发现git 2. GitHack工具得到.git文件 <?php $passsprintf("and pass%s",addslashes($_GET[pass])); $sqlsprintf("select * from user where name%s $pass",addslashes($_GET[name])); ?>…

python 实现graph list图列算法

graph list图列算法介绍 图列&#xff08;Graph List&#xff09;算法通常指的是在图的表示中&#xff0c;使用列表&#xff08;List&#xff09;或更具体地说&#xff0c;邻接表&#xff08;Adjacency List&#xff09;来表示图的一种算法。邻接表是图的一种常见表示方法&…

Python知识点:结合Python工具,如何使用GPT进行文本生成

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 如何使用Python工具进行GPT文本生成 概述 GPT&#xff08;Generative Pre-trai…

交换排序:冒泡排序、递归实现快速排序

目录 冒泡排序 1.冒泡排序的核心思想 2.冒泡排序的思路步骤 3.冒泡排序代码 4.代码分析 5.对冒泡排序的时间复杂度是O(N^2)进行解析 6.冒泡排序的特性总结 递归实现快速排序(二路划分版本) 1.快速排序基本思路 2.代码思路步骤 3.代码实现 4.代码分析 (1)递归终止条…

Apache NiFi最全面试题及参考答案

目录 解释什么是Apache NiFi以及它的主要用途。 NiFi 的数据处理流程是怎样的? NiFi 的架构包括哪些组件? 解释 NiFi 的 “FlowFile” 概念及其组成部分。 NiFi 的 “Processor” 是什么?有哪些类型? 如何在 NiFi 中创建一个新的数据流? NiFi 的 “Connection” 有…

leetcode经典算法题总结

针对leetcode算法题常见的五大经典复杂算法进行如下总结&#xff1a; &#xff08;1&#xff09;分治法 把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解…

SciPy的详细学习要点

SciPy是一个开源的Python科学计算库&#xff0c;它建立在NumPy数组对象之上&#xff0c;提供了许多科学和工程计算中常用的函数和工具。以下是学习SciPy时的一些详细要点&#xff1a; 1. 理解SciPy与NumPy的关系 - SciPy是基于NumPy构建的&#xff0c;因此熟练掌握NumPy是使用…