Java基础知识

Java优点

跨平台性:一次编译,随处运行,由于JVM,Java文件编译成class文件之后可以随处运行;

内存管理:JVM自动进行垃圾回收,无需手动释放内存

Java的类是单继承的,C++是多继承

Java不提供指针直接访问内存,程序内存更加安全

支持多线程

强大的生态环境:很多标准类库以及对应的框架

面向对象:面向对象的编程语言,程序设计更加结构化和模块化

JVM、JRE、JDK之间的关系

JVM:Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,保证Java语言可以实现跨平台性。编译成.class字节码文件之后,不需要面向特定的处理器,只要在虚拟机上运行即可。

.java文件---->编译器----->.class文件----->虚拟机,解释器----->二进制机器码------>程序运行

JRE:Java运行时环境,需要包括Java虚拟机以及核心类库,核心类库主要是Java.lang包,包括Java程序运行时不可缺少的系统类,比如基本数据类型、线程等。

JDK:给开发人员使用,包括了Java开发工具比如(javac:编译器,编译为字节码文件;jdb:Java调试器;jar:部署工具)和JRE,有了JDK之后,就不需要JRE了。

Oracle JDK在JVM上的性能更好,但不开源,Open JDK开源。

JDK>JRE>JVM.

基本数据类型和引用类型

byte、short、int、long、float、double、boolean、char
除了基本数据类型其他都是引用类型,包括数组,类,接口,string等

Java语言采用何种编码方案?有何特点?

采用Unicode编码,每个字符都有唯一的数值。

访问修饰符 private,default、protected,public的 区别

分别可以被当前类、同包、子类、其他包访问

this关键字、super关键字以及这两个关键字的区别是什么?

this是对当前对象的引用,能够调用当前类的构造函数、方法和属性

super是对当前对象父类的引用,用于调用父类的构造器、方法和属性

他们都是指代对象,不能使用在static修饰的内容里。

static

意义:为Java提供了在类级别上操作属性和方法的能力,不需要实例化对象,在类加载的过程中就能被创建。可以用于共享状态和常量存储。

作为关键字可以修饰变量、方法、代码块。被static修饰的内容,与类相关联而不是与实例对象关联,优于对象加载的,在类加载的时候就被初始化,没有实例化也可以访问。静态方法可以通过类名.静态方法名()调用,静态只能访问静态,非静态可以访问静态和非静态。

静态方法中不能有super和this()方法,因为这两者是针对对象而言的,而静态方法是在类加载时就被初始化,静态不能访问非静态。

面向对象的三大特性

封装:将对象的属性和方法捆绑在一起,并隐藏对象内部的具体实现细节,只通过提供的方法和属性供外部访问,这样能够避免外部干扰和不恰当使用。

继承:允许一个类继承另一个类的属性和方法。可以定义新的内容也可以使用父类的方法,但不能选择性继承父类。提高了代码的重用性、为实现多态提供了基础。

多态:父类或接口的引用对象可以指向子类或具体实现类的实例化对象。一个引用变量具体用的是什么方法,要在程序运行期间才能决定。

实现多态的方式

继承:子类继承父类,并且可以重写覆盖父类的一些方法。

方法重写:子类对父类的方法进行重写,调用子类的实现

接口:类通过实现接口确保遵循特定的约定或规范,不同的类可以以不同的方式实现接口,从而实现多态。

方法重载:同一个类中,存在参数列表不一样的多个同名方法,允许方法以多种形式存在。

抽象类和接口的区别
1、都不能实例化,但抽象类允许有构造函数,接口不能有构造函数。

2、抽象类是单继承的,一个类只能继承一个抽象类,但可以实现多个接口。

3、访问修饰符,抽象类中的方法可以是任意访问修饰符,但接口中的方法默认是public修饰符,不能是private或protected。

4、抽象类是对子类的抽象,包括行为和属性。为不同的子类提供一个公共的基类,而接口是对类的行为的抽象,是一种规范,定义外部可以调用的行为,不涉及如何实现。

5、抽象类可以有默认方法实现,Java8之后,接口也可以包含默认方法和静态方法。

创建一个对象用什么关键字?对象实例与对象引用有何不同?
答:用new关键字,new创建对象实例,对象引用指向对象实例,一个对象引用可以指向0/1个对象,一个对象可以被多个引用指向它。
构造方法的作用是实例化对象,如果没有写无参构造方法,系统也会自动分配一个。
构造方法名与类名相同,没有返回值,生成对象时自动调用。
静态变量与实例变量的区别?

静态变量被static修饰,存储在方法区,而实例变量存在堆内存中;

静态变量的生命周期跟类的生命周期一样,实例变量的生命周期跟对象一致,如果对象被回收,实例对象也会销毁;

静态变量在类加载的时候被初始化,只会初始化一次,可以在类级别上被操作,实例变量是创建实例对象的时候被初始化,可以被初始化多次,只能通过实例对象来操作。

静态方法和实例方法同理,且实例方法可以访问静态成员变量。

== equals 的区别是什么?
答:==的作用是判断两个地址是否相等,对于基本数据类型,就是判断字面量是否相等,而对于引用数据类型,判断的是引用地址是否相等。
equals如果没有被重写判断的也是引用地址是否相等,而如果重写了,可以通过重写的逻辑来实现,比如判断引用对象地址指向的内容是否相等。
hashCode equals
hashCode() 的作用是用于获取哈希码,也称为散列码,实际上是返回一个int型的整数,表示这个对象在哈希表中的索引位置。定义在JDK的object.java中,这就意味着任何类都包含hashcode函数。
以hashset如何检查重复举例,说明为什么要用到hashcode
答:把对象加入hashset时,会先计算对象的hashcode值来判断对象加入的位置,同时也会与已经加入对象的hashcode进行比较。如果没有相同的hashcode就会认为这个对象没重复出现,如果有重复的,会进行equals比较,如果相同就不加入,如果不同,就重新散列在其他位置。
为什么equals重写必须重写hashcode?
重写equals而不重写hashcode可能会违反equals和hashcode的基本约定,Java文档中明确指出,如果两个对象通过equals判断相等,那么他们的hashcode也要返回相同的值,这是确保哈希基础的集合如hashmap、hashset能正常工作。
如果两个被认为是相同的对象,返回了不同的哈希码,在哈希表中会被当成不同的实体,从而导致数据不一致。
所以equals方法被覆盖的化,hashcode也要重写。
对象的相等与指向他们的引用相等,两者有什么不同?
对象在堆内存中,是指内存中的数据相等,引用在栈中,是指引用对象的地址相等。
值传递和引用传递之间的区别?
答:值传递是指将实参的值复制一份传递给形参,形参的改变不会影响实参;引用传递是指将实参的地址传给形参,形参和实参指向同一个对象,形参的修改会影响实参。
Java中只有值传递,没有引用传递,而Java中基本数据类型的传递和引用类型的传递也有所不同,基本数据类型的值传递是指将变量中的值复制一份传递,引用数据类型的值传递是指将引用对象的地址拷贝一份传递给形参。
Java中IO流分为几种?
答:
BIO,NIO,AIO 有什么区别?

BIO:blocking IO,同步阻塞IO,一当线程发起IO请求操作时,它会被阻塞,不能执行其他任务,直至IO操作完成。

NIO:none-blocking IO,同步非阻塞IO,指一个线程可以管理多个IO请求,处理IO请求的时候,线程不会被一直阻塞,可以去执行别的操作,通过轮询的方式去查看IO操作是否完成。

AIO:异步IO,通过回调的方式实现高效IO,完全异步,线程发起IO之后无需等待可以立即返回,并执行其他任务,IO操作完成时,系统会自动通知线程进行处理。

反射机制是什么?优缺点?实现方式?应用场景?为什么框架需要反射?

Java反射机制在程序运行的过程中,可以动态地获取一个类的属性和方法信息,可以动态地调用对象地属性和方法,这种动态获取类的信息和调用对象属性方法的功能称为Java语言的反射机制。

优点:运行期间判断,可以动态加载,提高代码的灵活性;减少代码重复,不必为每个可能用到的对象类型写特定的代码。

缺点:性能开销:Java反射比直接Java方法调用要慢,通过反射可以访问和修改私有字段和方法,破坏了封装性,也增大了安全风险。

使用方式:Class<?>  clazz = str.getclass()   / Class.forName()  / 类名.class。

使用场景:JDBC连接数据库时使用class.forname()加载驱动程序;spring中通过xml配置装在bean对象,将配置文件加载到内存中,实现类的实例化、属性赋值;动态代理:“Proxy”类通过反射创建动态代理实例,在AOP面向切面编程中,通过反射创建动态代理对象执行增强逻辑,并且委托目标对象执行原始代码逻辑从而实现动态增强。

框架反射:框架主要是为了灵活性和动态性,反射机制允许框架灵活适应各种场景;框架配置和依赖注入,通过xml配置装配bean;代理和拦截,反射可以和代理结合,这样能够实现方法调用的拦截、事务管理、日志记录等。

什么是字符串常量池?String类型为什么是不可变的?

答:字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存使用率,避免开辟多余空间存储相同的字符串,创建字符串时,JVM会首先检查字符串常量池,如果已经存在会返回它的引用,如果不存在,实例化一个放入池中,返回其引用。

数组有没有 length()方法?String 有没有 length()方法?
答:数组是一种数据结构,长度是固定的,创建后不能修改,所以是用属性获取它的长度。string是对象,要获取字符串的长度需要调用length()方法。
StringStringBufferStringBuilder的区别是什么?String 为什么是不可变的?
1、string是不可变的,作出修改需要新建对象,builder和buffer是可变的,是对原对象进行操作;
2、string因为不可变所以线程安全,builder的大多数方法是同步的,所以线程安全;builder方法不同步,所以线程不安全。
3、string每次修改都要创建新的对象,性能差点;buffer要保证线程安全所以性能比builder差点。
操作少量数据---string  单线程操作大量数据---builder   多线程操作大量数据---buffer
答:因为string类型使用final修饰符修饰存储字符串的数组,被final修饰的变量是不可变的。如果对string类型的变量做拼接,实际上会创建一个新的string对象,而不会改变原始的string对象。且string类也被final修饰,所以不能被继承。为了保证字符串的不可变性和安全性。
基本数据类型和包装类型之间的转换

答:通过拆箱和装箱实现,Integer num = Integer.valueof(3)   int b =num.intValue();

基本数据字节包装类型常量池范围
char2Character\u0000\u007F(前128个)
byte1Byte-128 到 127
short2Short-128 到 127
int4Integer-128 到 127
long8Long-128 到 127
double8Double
float4Float
bool1Booleantrue + false

为了提升性能和减少不必要的对象大量创建,包装类型引入了缓存机制,缓存范围如上表所示。

new关键字产生的变量在堆内存中,每次new都会产生一个新的对象,即使内容一样也会重新分配新的内存空间。

常量池中获取的对象用==比较时,返回的是同一个引用地址,所以结果为true

包装类型的对象和基本数据类型比较时,会进行自动拆箱,如果在常量池中存在,会返回存在的那个引用地址。

hashmap中用string类型当作key有什么好处?

答:

如何理解Java的注解?解决了什么问题?
答:Java注解是JDK1.5开始引入的一种元数据机制,它允许我们在代码中额外添加信息,田间的信息不会改变代码的逻辑,但在编译时可以被访问和解析。它为Java代码提供了元编程能力,可以在不改变代码的前提下提供额外的行为和含义。
解决的问题:
1、简化配置:将配置直接嵌入到代码中,减少了额外的配置文件。
2、增强代码可读性,相关数据就注解在代码旁边。
3、框架集成:许多框架使用注解简化了API和库的使用。
Java注解和AOP之间有什么区别?

使用目的:Java提供的一种元数据机制,允许在代码中添加额外的信息。

使用场景:注解常用于数据配置、校验等功能,AOP则主要用于日志记录、事务管理、性能监控等。

工作机制:注解本身不会执行任何代码,要使注解生效,需要注解处理器来解析并执行一些动作;AOP通过代码或字节码操作会对原有的代码进行修改,添加一些新的功能。两者应该会结合使用。

Exception 和 Error 有什么区别?

答:都是Java中用于处理异常情况的,都是Throwable的子类,都可以用throw关键字抛出并通过try catch捕获。

目的和性质:Exception通常代表了程序可以并且应该处理的问题,往往是由程序的某种逻辑错误或非预期情况导致,如尝试打开一个不存在的文件;error代表了更严重的问题,通常是JVM内部错误或者资源耗损严重。

针对exception,程序应该尝试捕获并处理,做出操作,针对error,不应尝试捕获,而是应该停止运行或记录日志进行分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值