JAVA面试基础 001

JAVA是什么

Java是一门面向对象的编程语言,它吸收了C++ 的各种优点,同时摒弃了C++中难以理解的多继承、指针等概念。因此Java具有简单易用和功能强大的特性。Java作为静态面向对象编程语言的代表,极好的实现了面向对象理论。

JVM、JRE和JDK的关系

JVM是指Java虚拟机,Java程序需要运行在虚拟机上不同的平台有自己的虚拟机,这使得Java具有跨平台的能力

JRE是一个包括了Java虚拟机和Java程序所需要的核心类库等。核心类库包含了运行Java程序必不可少的系统类。因此运行一个已经开发好的Java程序只需要安装JRE即可。

JDK是提供给Java开发人员使用的开发工具包,其中包含了Java的开发工具、JRE、JVM。所以安装JDK后无需额外安装JRE了。

JAVA为什么能实现跨平台

JVM,JVM使Java程序能够一次编译,到处运行。

JAVA的特点

简单易学
面向对象
平台无关性
支持网络编程并在此方面有极大的成就
支持多线程
安全性
健壮性

字节码是什么?使用字节码的好处

字节码:Java源代码经过虚拟机编译器编译后产生的文件(即.class文件),它只面向虚拟机而不面向处理器

采用字节码的好处:Java通过采用字节码的方式,在一定方面解决了传统解释性语言执行效率底的问题,同时又保留了解释性语言的可移植的特点。所以Java程序运行时比较高效,而且由于字节码并不争对某种特地的机器,因此,Java程序无需重新编译便可在多种不同的计算机上运行。

JAVA的主类是什么?应用程序和小程序的主类有什么区别

一个程序中可以有多个类,但只能有一个主类。在Java程序中,主类是指包含main()方法的类。而在Java小程序中,这个主类是一个继承自系统类JApplet或Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。

Java应用程序和小程序之间的区别

应用程序是从主线程启动(main()方法)。applet小程序没有main方法,主要是嵌入在浏览器页面上运行(调用init()线程或run()来启动),与flash的小游戏类似。

JAVA和C++的区别

  • Java和C++都是面向对象语言,都支持封装,继承和多态。

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

  • Java的类是单继承,C++支持多继承;Java的类不支持多继承,但接口可以多继承。

  • Java有自动内存管理机制,不需要程序员手动释放无用内存。

  • C++支持运算符重载、预处理、默认函数参数、goto语句、自动强转。Java均不支持,但Java有import机制与C++的预处理功能类似

Oracle JDK 和 Open JDK的区别

1.Open JDK是一个完全开源的参考模型,而Oracle JDK是Open JDK的一个实现,但并不是完全开源;
2.Oracle JDK比Open JDK更稳定,虽然两者代码几乎相同,但Oracle JDK有更多的类和一些错误修复。而且在性能方面Oracle JDK也比Open JDK更好。
3.Oracle JDK是由Oracle公司进行开发和维护的JDK,提供商业支持。Open是有Java社区开发和维护的JDK,不支持商业功能,但它是Java的标准实现。

数据类型

switch是否能作用在byte上,是否能作用在long上,是否能作用在String上

在Java 5以前,switch(expr)中,expr只能是byte、short、char、int。从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型,从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

Math.round(11.5)等于多少,Math.round(-11.5)等与多少。

Math.round(11.5)返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后向下取整。

float f=3.4是否正确

否,3.4是双精度,将双精度(double)赋值给(float)属于下转型,(down-casting,也称为窄化)会造成精度损失,因此需要强制转换float f =(float)3.4 或 float f = 3.4F;

short s1 = 1; s1 = s1+1;有错吗? short s1 = 1; s1 +=1;有错吗

有,1是int类型,s1 = 1;s1 =s1 + 1;的运算结果都是int类型,需要强制转换才能赋值给short类型。

而short s1 = 1;s1 += 1;可以正确编译,因为s1+=1;相当于s1 =(short(s1+1));其中含有隐藏的强制类型转换。

编码

JAVA语言采用何种编码方案?有什么特点?

Java采用Unicode编码标准,Unicode(标准码),它为每个字符制定了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的使用。

注释

JAVA注释有哪些

定义:用于解释和说明程序和文字
分类
 - 单行注释
格式://单行注释
 - 多行注释
格式:/多行注释/
 - 文档注释
格式:/*文档注释/

作用
提高程序的可读性,注释不会对程序的执行结果造成影响。

访问修饰符

访问修饰符 public,private,protected,以及默认的区别

定义 Java中,可以使用访问修饰符来保护对类,变量,方法。注意:不能修饰类(外部类)
private:在同一类内可见。使用对象:变量、方法。 不能修饰类(外部类)
default:(默认):在同一包内可见,不能使用任何修饰符。使用对象:类、接口、变量、方法。
protected:对同一包内的类和子类可见。使用对象:变量、方法。 不能修饰类(外部类)
public:对所有类可见。使用对象:类、接口、变量、方法

运算符

&和&&的区别

&运算符有两种用法:(1)按位与、(2)逻辑与。
&&运算符是短路与运算:左边为false则右边直接被短路掉
逻辑或运算符(|)和短路或运算符(||)的差别也是这样

关键字

JAVA中有没有goto

goto是Java中的保留字,在目前版本的Java中没有被使用。

final有什么用

用于修饰类、属性、方法

  • 被final修饰的类不可以被继承
  • 方法不可被重写
  • 变量不可被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的

final finally finalize的区别

  • final可以修饰类、方法、变量、修饰类表示不能被基础、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值
  • finally一般作用在try-catch代码块中,在处理异常的时候,通常我面将一定要执行的代码放在finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
  • finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.g();方法时,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最好判断。

this 关键字的用法

this是自身的一个对象,表示对象本身,可以理解为:指向对象本身的一个指针。
this的用法在Java中大体可分为3种
1、普通的直接引用,this相当于是指向当前对象本身。
2、形参与成员名字重名,用this来区分
3、引用本类的构造函数

super关键字的用法

super可以理解为是指向自己超(父类)类对象的一个指针,而这个超类指的是离自己最近的一个父类
super也有三种用法:
1、普通的直接引用,
    与this类似,super相当于是指向当前对象的分类的引用,这样就可以用super.xxx来引用父类的成员。
2、子类中的成员变量或方法与分类中的成员变量或方法同名是,用super进行区分
3、引用父类构造函数
super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数的第一条语句)。

this与super的区别

  • super:引用当前对象的直接父类中的成员
  • this:表示当前对象名
  • super()与this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类调用本类的其他构造方法。
  • super()和this()都需要放在构造方法的第一行
  • 尽管可以用this调用一个构造器,但却不能调用两个
  • this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
  • this()和super()都指的是对象,所以都不可以在static环境中使用,包括:static变量,static方法,static语句块。
  • 从本质上讲,this是一个指向本对象的指针,而super是一个Java关键字

static存在的主要意义

static的主要意义是在于创建独立与jurisdiction对象的域变量或方法,以至于即使没有创建对象,也可以使用属性和调用方法!
static关键字还有一个比较关键的作用就是用来形成静态代码块来优化程序性能。static块可以放在类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会安装static块的顺序来执行每个static快,并且只会执行一次。
static之所以能用来优化程序性能,就是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。

static的独特之处

1、被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,二十被雷的实例对象所共享
2、在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载进行初始化,注意这是第一次使用就要初始化,后面根据需要是可以再次赋值的。
3、stati变量值在类加载的时候分配空间,以后创建类对象的时候就不会在重新分配。赋值的话,是可以任意赋值的!
4、被static修饰的变量或者方法是优先与对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。

static应用场景

因为static是被类的实例对象所共享,因此如果某个成员变量是被所有的对象共享的,那么这个成员变量就应该定义为静态变量
比较常见的应用场景有:
1、修饰成员变量
2、修饰成员方法
3、静态代码块
4、修饰类【只能修饰内部类也就是静态内部类】
5、静态导包

static注意事项

1、静态只能访问静态
2、非静态即可访问非静态的,也可访问静态的。

流程控制语句

break,continue,return的区别及作用

break 结束当前的循环体
continue 结束正在执行的循环,进入下一个循环条件
return 程序返回,不再执行下面的方法

在JAVA中,如何跳出当前的多重嵌套循环

在Java中,想要跳出多重循环。可以在外面的循环语句前定义一个标号,然后再里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。

面向对象

面向对象概述

面向对象和面向过程的区别

面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销是比较大,比较消耗资源;比如单片机、嵌入式开发、Liunx/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护,易复用,易扩展
面向对象
优点:易维护,易复用,易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活,更易于维护。
缺点:性能比面向过程低
面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现
面向对象是模型化的,你只需要抽象出一个类,这是一个封闭的盒子,再这里你拥有的数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的吗,关我们什么事?会用就行
面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们使用的就是面向对象了。

面向对象的三大特征

面向对象的特征有哪些方面

面向对象的特征主要有以下几个方面
抽象
抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关心这些行为的细节是什么。
封装:
封装是把一个对象的属性私有化,同时提供一些可以被外界访问的属性和方法,如果属性不想被外界访问,可以不提供外接访问的方法。但当一个类没有给外界提供任何访问方法,那么这个类就没有意义了。
继承:
继承是使用已存在的类进行定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承外卖能够非常方便的复用以前的代码。
关于继承
1、子类拥有父类非private的属性和方法
2、子类可以拥有自己的属性和方法,即子类可以对父类进行扩展
3、子类可以用自己的方式实现父类的方法
多态
多态指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
三大特性为:封装 继承 多态

什么是多态机制?JAVA中任何实现多态的?

多态是指重新中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用的到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行期间才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不用的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选址多个运行状态,这就是多态性。
多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来曲风不同的函数,通过编译之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,他说通过动态绑定来实现的,也就是我们所是的多态性。
多态的实现
Java实现多态有三个必要条件:继承、重写、向上转型
继承:在多态中必须存在继续关系的子类和父类
重写:子类对父类中某些方法进行重新定义,在调用这些方法时,就会调用子类的方法
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能具备调用父类的方法和子类的方法。
只有满足了上述三个条件我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。
对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是是被子类方法覆盖的方法。

类与接口

抽象类和接口的对比

抽象类是用来捕捉子类的通用特性的,接口是抽象方法的集合。
从设计层面来说,抽象类是对类的抽象,是一种,模板设计,接口是行为的抽象,是一种行为的规范。
相同点

  • 接口和抽象类都不能实例化
  • 都位于继承的顶端,用于被其他类实现或继承
  • 都包含抽象方法,其子类都必须覆写这些抽象方法

不同点

参数抽象类接口
声明抽象类使用abstract关键字声明接口使用interface关键字声明
实现子类使用extends关键字来进行继承抽象类,如果子类不是抽象类的话,它需要提供抽象类中的所有声明的方法的实现子类使implements关键字来实现接口。它需要提供接口中所有声明的方法的实现
构造器抽象类可以有构造器接口不能有构造器
访问修饰符抽象类中的方法可以是任意的修饰符接口方法默认修饰符是public。并且不允许定义为private或protected
多继承一个类最多只能继承一个抽象类一个类可以实现多个接口
字段声明抽象类的字段声明可以是任意的接口的字段默认都是static和final的

:Java8中接口引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。
接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守以下原则:

  • 行为模型应该总是通过接口而不是抽象类定义,使用通常是优先选用接口,尽量少用抽象类。
  • 选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。

普通类和抽象类有哪些区别?

  • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  • 抽象类不能直接实例化,普通类是可以直接实例化。

抽象类能使用final进行修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为final那么该类就不能被继承,这样就会彼此产生矛盾,所以final不能修饰抽象类

创建一个对象用声明关键字?对象实例与对象引用有何不同?

new关键字,new创建对象实例(对象实例在堆内存中),对象引用指向实例(对象引用存放在栈内存中)。一个对象引用可以指向0个或1个对象;一个对象可以用n个引用指向它。

变量和方法

成员变量与局部变量的区别

变量:在程序执行过程中,在某个范围内其值可以发送改变的量。从本质上讲,变量其实是内存中的一小块区域
成员变量:方法外部,类内部定义的变量。
局部变量:类的方法中的变量

成员变量和局部变量的区别

成员变量局部变量
作用域针对整个类有效。只在某个范围内有效(一般指方法,语句体内)。
存储位置随对象的创建而存在,随对象的消失而消失,存储在堆内存中。在方法被调用,或语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结束后,就自动释放。
生命周期随着对象的创建而存在,随着对象的消失而消失。当方法调用完,或者语句结束后,就自动释放。
初始值有默认初始值。没有默认初始值,使用前必须赋值。

使用原则
在使用变量是需要遵循的原则为:就近原则
首先在局部范围找,有就使用;接着在成员位置找。

在JAVA中定义一个空参的构造方法的作用

在Java程序执行子类的构造方法前,如果没有super()来调用父类特定的构造方法。则会调用父类中”没有参数的构造方法“ 。因此,如果父类中没有定义空参方法,而子类中的构造方法又没有使用super()来调用父类中特定的构造方法,则编译时将会发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决方法便是在父类中加一个空参的构造方法

在调用子类的构造方法前会先调用父类中没有参数的构造方法,目的是?

帮助子类做初始化工作。

一个类的构造方法的作用是什么?若一个类没有声明构造方法,该程序能支持执行吗?为什么?

主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使明天声明构造方法也会有默认的不带参数的构造方法。

构造方法有哪些特性?

名字与类名相同;
没有返回值,但不能用void声明构造函数;
生成类的对象时自动执行,无需调用。

静态变量和实例变量的区别

|静态变量|实例变量|
|-|-|-|
|静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVN只为静态变量分配一次内存空间。|每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。|

静态变量与普通变量区别

static变量也被称为静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它仅在类初次价值是会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
静态成员变量的初始化顺序按照定义的顺序进行初始化。

在一个静态方法内调用一个非静态成员为什么是非法的?

由于静态方法可以不通过对象进行调用,因此在静态方法中,不能调用其他非静态变量,也不可以访问非静态变量成员。

什么是方法的返回值?返回值的作用是什么?

方法的返回值是我们获取到的某个方法中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接受出结果,使得它可以用于其他得操作!

内部类

什么是内部类?

在Java中,可以将一个类得定义放在另一个类得定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。

内部类得分类有哪些?

内部类可分为四种:成员内部类,局部内部类,匿名内部类和静态内部类

静态内部类
定义在类内部得静态类,就是静态内部类。
静态内部类可以访问外部类所有的静态方法,而不可访问外部类得非静态变量;静态内部类得创建方式:new 外部类.静态内部类()。
成员内部类
定义在类内部,成员位置上得非静态类,就是成员内部类。
成员内部类可以访问外部类所有的变量和方法,包括静态和非静态,私有和公有。成员内部类依赖于外部类得实例,它的创建方式 外部类实例.new 内部类()
局部内部类
定义在方法中的内部类,就是局部内部类。
定义在实例方法中的局部类可以访问外部类的所有变量和方法,定义在静态方法中的局部类只能访问外部类的静态变量和方法。局部内部类的创建方式,在对应方法内,new 内部类()。
匿名内部类
匿名内部类就是没有名字的内部类,日常开发中使用较多。
特点:

  • 匿名内部类必须继承一个抽象类或者实现一个接口。
  • 你们内部类不能定义任何静态成员和静态方法
  • 当所在的方法的形参需要被匿名内部类使用时,必须声明为final。
  • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口所有抽象方法。

内部类的优点

  • 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据!
  • 内部类不为同一包的其他类所见,具有很好的封装性;
  • 内部类有效实现了“多重继承”,优化了Java单继承的缺陷。
  • 匿名内部类可以很方便的定义回调。

内部类的应用场景

  1. 一些多算法的场合
  2. 解决一些非面向对象的语句块。
  3. 适当使用内部类,使得代码更加灵活和富有扩展性。
  4. 当某个类除了它的外部类,不再被其他的类使用时。

局部内部类和匿名内部类访问局部变量时,为什么变量必须要加上final?

因为生命周期不一样,局部变量直接存储在栈中,当方法执行结束后,非final的局部变量就会被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。加了final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题。

重新与重载

构造器(constructor)是否可被重写(override)

构造器不能被继承,因此不能被重写,但可以被重载

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。

对象相等判断

==和 equals 的区别

==:他的作用是判断两个对象的地址是否相等。即判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
equals():他的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况一:类没有覆盖equals()方法,则通过equals()比较该类的两个对象是,等价于通过“==”比较这两个对象。
情况二:类覆盖了equals()方法。一般,我们都覆盖equals()方法来两个对象的内容相等;若他们的内容相等,则返回true(即,认为这两个对象相等)。

hashCode与equals (重)

HashSet如何查重复
HashSet通过哈希表来存储元素,通过哈希表可以快速确定一个元素是否已经存在于集合中。

两个对象的hashCode()相同,则equals()也一定为true,对吗?
不一定,hashCode()方法是用于获取对象的散列码,他的作用是将对象映射到一个整数值上。而equals()方法是用于判断两个对象是否相等,它的作用是比较两个对象的内容是否相同。在一般情况下,如果两个对象的hashCode()相同,他们可能相等,但并不一定。因为hashCode()方法可能会将不同的对象映射到同一个整数值上,这种情况被称为哈希冲突。因此,如果两个对象的hashCode()相同,还需要调用equals()方法来进行进一步的比较,才能确定它们是否相等。

hashCode和equals方法的关系

  1. equals方法比较两个对象是否相等,如果相等就返回true
  2. hashCode方法返回一个整数,用于确定对象在哈希表中的索引位置。
  3. 如果两个对象相等,则他们的hashCode值必须相等。
  4. 如果两个对象的hashCode值相等,他们不一定相等,因为在哈希表中,可能发生哈希冲突,即两个不同的对象具有相同的hashCode值
  5. 如果我们重写equals方法,则通常也需要重写hashCode方法,以确保两个相等的对象具有相同的hashCode值,这样才能保住它们在哈希表中的索引位置相同。

hashCode()介绍

hashCode()的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位子。hashCode()定义在JDK的Object.java中,这就意味着Java中的任何类都包含hashCode()函数。散列表存储的是键值对(key-value),它的特点是:能根据”键“快速检索出对应的”值“。这其中就利用到了散列码!

值传递

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递

是值传递。在Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的

为什么JAVA中只有值传递

在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。**按值调用(call by value)表示方法接受的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递调用引用所对应的变量值,而不能修改传递值调用所对应的变量值。**它用来描述各种程序设计语言(不只是Java)中方法参数传递方式。
Java程序设计语言总是采用按值调用。也就是说,方法得到的是使用参数的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。

  • 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)
  • 一个方法可以改变一个对象参数的状态
  • 一个方法不能让对象参数引用一个新的对象

值传递和引用传递有什么区别

值传递引用传递
传递的参数是按值得拷贝传递,传递得是值得拷贝,也就是说传递后就互不相关了。传递得参数是按引用进行传递,其实传递的是引用得地址,也就是变量所对应的内存空间地址。传递得是值得引用,也就是是传递前和传递后都指向同一个引用(也就是同一个内存空间)。

JAVA包

JDK中常用的包有哪些

  • java.lang:系统基础类
  • java.io:输入输出相关类,如文件操作等;
  • java.nio:为完善io包中得功能,提高io包中得性能而写得一个新包;
  • java.net:与网络相关得类;
  • java.util:系统辅助类,特别是集合类;
  • java.sql:数据库操作得类。

import java 和javax有什么区别

刚开始得时候JavaAPI所必需得包是java开通得包,javax当时只是扩展API包来使用。然而随着时间得推移,javax逐渐得扩展为JavaAPI得组成部分。但是,将扩展从javax包移动到java包中太麻烦了,最终会破坏现有得代码。因此最终决定javax包成为标准API得一部分。
所以实际上java和javax没有什么区别。

IO流

Java中IO流分为几种?

  • 按照流的流向分,可分为输入流和输出流;

  • 按照操作单元分,可划分为字节流和字符流;

  • 按照流流的角色划分为节点流和处理流
    Java io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系,Java IO流的40多个类都是从如下4个抽象类基类中派生出来的。

  • InputStream:输入流的基类,字节输入流

  • Reader:输入流的基类,字符输入流

  • OutputStrean:输出流的基类,字节输出流

  • Writer:输出流的基类,字符输出流

BIO,NIO,AIO有什么区别

名称区别
BIOBlock IO 同步阻塞IO,传统IO,模式简单使用方便,并发处理能力低。
NIONon IO 同步非阻塞IO,传统IO的升级,客户端和服务端通过Channel(通道)通讯,实现了多路复用。
AIOAsynchronous IO 是NIO的升级,也叫NIO2,实现了异步非阻塞IO,异步IO的操作基于事件和回调机制。

Files的常用方法有哪些?

  • Files.exists():检测文件路径是否存在。
  • Files.createFile():创建文件。
  • Files.createDirectory():创建文件夹。
  • Files.delete():删除一个文件或目录。
  • Files.copy():复制文件。
  • Files.move():移动文件。
  • Files.size():查看文件个数。
  • Files.read():读取文件。
  • Files.write():写入文件。

反射

什么是反射机制?

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象吗,都能调用它的任意一个方法和属性;这种动态获取的信息一级动态调用对象的方法的功能称为Java的反射机制
静态编译和动态编译

  • 静态编译:在编译时确定的类型,绑定对象
  • 动态编译:运行时确定的类型,绑定对象

反射机制的优缺点

  • 优点:运行期类型的判断,动态加载类,提高代码灵活度。
  • 缺点:性能瓶颈:反射相当于一系列的解释操作,通知JVM要做很多事,性能比直接的Java代码要慢很多。

反射机制的应用场景有哪些

反射是框架设计的灵魂。
在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没用,实际上有很多设计、开发都与反射机制有关,例如模块化开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的spring框架也大量使用到了反射机制。

Java获取反射的三种方法

  1. 通过new对象实现反射机制
  2. 通过路径实现反射机制
  3. 通过类名实现反射机制

常用API

String 相关

字符型常量和字符串常量的区别

  1. 形式上:字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
  2. 含义上:字符常量相当于一个整型值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放的位置)
  3. 占内存大小 字符常量只占一个字节,字符串常量占若干个字节(至少一个字符结束标志)

什么是字符串常量池?

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

String是最基本的数据类型吗?

不是,Java的基本数据类型中只有八个:byte、short、char、int、long、float、double、boolean;除了基本类型,剩下的都是引用类型,Java5以后引入了枚举类型也算是一种比较特殊的引用类型。

String 有哪些特性

  • 不变性:String是只读字符串,是一个典型的immutalbe对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性
  • 常量池优化:String对象创建之后,会再字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。
  • final:使用final来定义String类,表示String类不能被继承,提高了系统的安全性。

String是不可变的吗

是否可以继承String类

不可以,String类是final类

String str = "i"与String str = new String(“i”)一样吗?

不一样,内存分配方式不一样。直接创建会被Java虚拟机分配到常量池中,而new出来的会被分配到堆内存中。

String s = new Strinf(“xyz”);创建了几个字符串对象

两个,一个是静态区得xyz,一个是new创建再堆上得对象。

任何将字符串反转

使用StringBuilder或者stringBuffer得reverse()方法

数组有没有length()方法?String有没有length()方法

数组没有length()方法,有length属性、String有length()方法。

String类得常用方法都有哪些?

  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符。
  • replace():字符串替换。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • getBytes():返回字符串的byte类型数组。
  • length():返回字符串长度。
  • toLowerCase():将脂肪层转换成小写字母。
  • toUpperCase():将字符串转换成大写字符。
  • substring():截取字符串。
  • equals():字符串比较

在使用HashMap的时候,用String做Key的好处

HashMap内部实现是通过key的hashcode来确定value的存储位置,因为字符串是不可变的,所以当创建字符串时,它的hashcode被缓存下来,不需要再次计算,所以相比于其他对象更快。

String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的

StringStringBufferStringBuilder
可变性String类中使用字符数组保持字符串,private final cahr value[],所以String对象是不可变的。StringBuffer继承自AbstractStringBulider类,可变StringBuilder也是继承自AbstractStringBulider类,可变
线程安全性String中的对象是不可变的,线程安全StringBuffer对它的父类公共方法加了同步锁或者对调用的方法加了同步锁,所以线程安全StringBuilder并没有对方法进行加同步锁,所以非线程安全的。
性能每次对String类型进行改变时,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。StringBuilder在相同情况下比StringBuffer性能提升10%-15%左右,但有多线程不安全的风险。
使用操作少量的数据多线程操作字符串缓冲区 操作大量数据单线程操作字符串缓冲区 操作大量数据

Date相关

包装类相关

自动装箱与拆箱

装箱:将基本类型用他们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;

int和Integer的区别

Java为了编程方便引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每个基本数据类型引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java5 开始引入了自动装箱/自动拆箱机制,使得二者可以互相转换。
Java为每个原始类型提供了包装类型:

原始类型包装类型
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble

Integer a =127与Integer b = 127相等吗?

对于对象引用类型: == 是比较对象的内存地址、
对于基本数据类型:== 是比较值
如果整型字面量的值在-1287到127之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的Integer对象,超过范围 a1==b1得到的结果为false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雨境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值