Java基础

1.说一下面向对象的四大特征:

继承、封装、多态、抽象。

2.java语言有哪些特点:

  • 简单易学(java语言的语法和C++语言很接近)
  • 面向对象(集成、封装、多态、抽象)
  • 平台无关性(java虚拟机实现平台无关性)
  • 支持网络编程并且很方便(java语言诞生本身就是为简化网络编程设计的)
  • 支持多线程(多线程机制使应用程序在同一时间并行执行多项任务)
  • 健壮性(java语言的强类型机制、异常处理、垃圾的自动收集等)
  • 安全性

3.什么是java程序的主类?应用程序和小程序的主类有何不同?

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

4.访问修饰符public、private、protected以及不写(默认)时的区别?

修饰符当前类同包子类其他包
public

protected

×

default

×

×

private

×

×

×

类的成员不写访问修饰时默认为default。
默认对于同一个包中的其他类相当于公开(public),
对于不是同一个包中的其他类相当于私有(private)。
受保护(protected)对子类相当于公开,
对不是同一包中的没有父子关系的类相当于私有。
Java中,外部类的修饰符只能是public或默认,
类的成员(包括内部类)的修饰符可以是以上四种。

 

 5.float f = 3.4;是否正确?

不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型,会造成精度损失,因此需要强制类型转换float f = (float)3.4;或者float f = 3.4F;

6.java有没有goto?

goto是java中的保留字,在目前版本的java中没有使用。(根据James Gosling(java之父)编写的《The Java Programming Language》一书的附录)中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)

7.&和&&的区别?

&运算符有两种用法:(1)按位与;(2)逻辑与。

&&运算符是短路与运算。

逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(""),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。

注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

8.Math.round(11.5)等于多少?Math.round(-11.5)等于多少?

Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值的-11。

9.用最有效的方法计算2乘以8?

2<<3

10.什么是java注释?

定义:用于解释说明程序的文字。

java注释的分类

-单行注释

  格式://注释文字

-多行注释

  格式:/*注释文字*/

-文档注释

  格式:/** 注释文字 */

java注释的作用

在程序中,尤其是复杂的程序中,适当的加入注释可以增加程序的可读性,有利于程序的修改、调试和交流。注释的内容在程序编译的时候会被忽视,不会产生目标代码,注释的部分不会对程序的执行结果产生任何影响。

11.java有哪些数据结构?

定义:java语言是强类型语言,对于每一种数据都定义了明确具体的数据类型,在内存中分配了不同大小的内存空间。

-基本数据类型

  -数值型

    -整数类型(byte,short,int,long)

    -浮点类型(float,double)

  -字符型(char)

  -布尔型(boolean)

-引用数据类型

  -类(class)

  -接口(interface)

  -数组([])

12.final 有什么用?

用于修饰类、属性和方法;

-被final修饰的类不可以被继承;

-被final修饰的方法不可以被重写;

-被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用执行的内容是可以改变的。

13.final、finally、finalize 的区别

-final可以修饰类、变量、方法,修饰类表示该类不能被继承;修饰方法表示该方法不能被重写;修饰变量表示该变量是一个常量不能被重新赋值。

-finally一般作用在try-catch代码块中,在处理异常的时候,通常我们把一定要执行的代码方法放在finally代码中,

表示不管是否出现异常,该代码快都会执行,一般用来存放一些关闭资源的代码。

-finalize是个方法,属于Object类的一个方法,而Object是所有类的一个父类,该方法一般由垃圾回收器来调用,

当我们调用System.gc()方法的时候,由垃圾回收器调用finalize,回收垃圾,一个对象是否可回收的最后判断。

14.String a = "i"和String a = new String("i")一样吗?

不一样,因为内存的分配方式不一样。String a = "i"的方式JVM会将其分配到常量池中;String a = new String("i")JVM会将其分配到堆内存中。

15.java中操作字符串都有哪些类?他们的区别是什么?

操作字符串的类有:String、StringBuilder、StringBuffer

String和StringBuilder、StringBuffer的区别在于String声明的是不可变对象,每次操作都会生成一个新String对象,再将指针指向新String对象,而StringBuilder、StringBuffer可以在原有对象基础上操作,所以在经常修改字符串的情况下最好不要使用String。

StringBuilder和StringBuffer的最大区别在于StringBuffer是线程安全的,StringBuilder是线程不安全的,但StringBuilder的性能高于StringBuffer,所以在单线程环境下建议使用StringBuilder,多线程环境下使用StringBuffer。

16.java中为什么要用clone?

在实际过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一部分有效值,此时可能需要一个和A完全相同的对象B,

并且此后的操作不会影响到对象A的值,也就是说,A与B是两个独立的对象,但B对象是有A对象创建的。在java语言中,

用简单的赋值语句是不能满足这种需求的。要满足这种需求可能会有多种途径,但clone()方法是最简单的,也是最高效的手段。

17.深克隆和浅克隆?

浅克隆:创建一个新对象,新对象和原来的对象完全一样,对于非基本类型属性,仍指向原有对象的内存地址。

深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不在指向原有对象地址。

18.new一个对象和clone一个对象的区别?

new操作符的本意是分配内存。程序执行到new操作符时,首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的应用地址发不到外部,在外部就可以使用这个引用操纵这个对象。clone在第一步和new相似,都是分配内存,调用clone方法时,分配的内存和原对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域,填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。

 19.java中实现多态的机制是什么?

java中的多态靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才被绑定,就是引用变量所指向的具体实例对象的方法,也就是内存中正在运行的那个对象的方法,而不是引用变量的类型中的方法。

20.谈谈你对多态的理解

多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源代码,就可以让引用变量绑定到各种不同的对象上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

21.构造器是否可被重写?

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

22.两个对象的值相同(x.equals(y) == true),但却可以有不同的hashcode,这句话对不对?

不对,如果两个对象x、y满足x.equals(y) == true ,他们的哈希码应当相同。

java对于equals和hashcode方法是这样规定的:

(1)如果两个对象相同(equals方法返回为true),那么他们的hashcode值一定相同;

(2)如果两个对象的hashcode相同,他们不一定相同。

当然,如果违背了上述原则就会发现在使用容器时,相同的对象可以出现在set集合中,同时增加新元素的效率会大大降低(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)

23.是否可以继承String类?

String类是final类,不可以被继承。

补充:继承String类本身就是一个错误的行为,对String类型最好的重用方式是关联关系(has-A)和依赖关系(Use-A),而不是继承关系(Is-A)关系

24.String类的常用方法有哪些?

•indexof();返回指定字符的的索引。

•charAt();返回指定索引处的字符。

•replace();字符串替换。

•trim();去除字符串两端空格。

•splt();字符串分割,返回分割后的字符串数组。

•getBytes();返回字符串byte类型数组。

•length();返回字符串长度。

•toLowerCase();将字符串转换为小写字母。

•toUpperCase();将字符串转换为大写字母。

•substring();字符串截取。

•equals();比较字符串是否相等。

25.char类型变量中是否可以存储一个中文汉字,为什么?

char可以存储一个中文汉字,因为java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占两个字节(16个比特),所以放一个中文是没有问题的。

26.this关键字的用法

this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。

this的用法在java中大体分为3中:

1.普通的直接引用

2.形参和成员名字重名,用this来区分

3.引用本类的构造函数

27.super关键字的用法

super可以理解为是指向自己超类对象的一个指针,而这个超类指的是离自己最近的一个父类

super也有3种用法:

1.普通的直接引用

2.子类中的成员变量或方法与父类中的成员变量或方法重名,用super来区分

3.引用父类构造方法

28.this与super的区别

-super:它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数),基类与派生类中有相同的成员定义时,如:super.变量名 this.成员函数据名(实参)

-this:它代表当前对象名(在程序中易产生二义性之外,应使用this来指名当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

-super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其他构造方法。

-super()和this()均需放在构造方法的第一行

-尽管可以用this调用一个构造器,但却不能调用两个

-this和super不能同时出现在一个构造函数里,因为this必然会调用其他的构造函数,其他构造函数必然也会有super语句存在,所以在同一个构造函数里边有相同的语句,就失去了语句的意义,编译器也不会通过。

this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块

-从本质上讲,this是一个指向本对象的指针,然而super是一个关键字

29.static存在的主要意义

static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用对象和方法。

static关键字还有一个比较关键的作用就是用来形成静态代码块已优化程序性能。static块可以至于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,还按照static块的顺序来执行每个static块,并且只会执行一次。

为什么说static块可以用来优化程序性能,是因为他的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。

30.static的独特之处

1、被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法 不属于任何一个实例对象,而是被类的实例对象所共享 。

2、在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。

3、static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!

4、被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。

31.static应用场景

因为static是被类的实例对象所共享,因此如果 某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量 。

因此比较常见的static应用场景有:

1、修饰成员变量 2、修饰成员方法 3、静态代码块 4、修饰类【只能修饰内部类也就是静态内部类】 5、静态导包

32.static注意事项

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

33.break、continue、return的区别

break 跳出总上一层循环,不再执行循环(结束当前的循环体)

continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)

return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)

34.在Java中定义一个不做事且没有参数的构造方法的作用

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

 35.构造方法有哪些特征?

名字与类名相同;

没有返回值,但不能用void声明构造函数;

生成类的对象时自动执行,无需调用。

36.静态变量和实例变量的区别:

静态变量:静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。

实例变量:每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对像,就有几份成员变量。

37.静态方法和实例方法有何不同?

静态方法和实例方法的区别主要体现在一下两个方面:

1.在外部调用静态方法时,可以使用“类名.方法名”的方式,也可以使用“对象名.方法名”的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需构造对象。

2.静态方法在访问本类的成员时,只允许访问静态成员(即静态成员和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制

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

方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果,(前提是该方法可能产生结果)。

返回值的作用:接受结果,使得它可以用于其他操作。

39.什么是内部类?

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

40.内部类的分类有哪些?

内部类可以分为4种:成员内部类、局部内部类、匿名内部类、静态内部类

41.java中异常分为哪些种类?

按照异常需要处理的时机分为编译异常(也叫受控异常)也叫CheckedException和运行时异常(非受控异常)也叫UnCheckedException。

java认为Checked异常都是可以被处理的异常,所以java必须显式处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。

这体现了java的哲学设计:没有完善的错误处理的代码根本没有机会被执行。

对Checked异常处理的方式有两种:

第一种:当前方法知道如何处理该异常,则用try....catch块来处理该异常。

第二种:当前方法不知道如何处理,则在定义该方法时声明抛出异常。

运行时异常只有当代码在运行时才发现的异常,编译的时候不需要try....catch....。Runtime如除数是0和数组下标越界等,

其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动监测并将他们交给缺省的异常处理程序。

42.hashcode与equals

hashCode如何检查重复

两个对象的hashCode()相同,则equals()也一定为true,对吗?

hashCode和equals方法的关系

面试官可能会问你,你重写过hashcode和equals吗,为什么重写equals时必须重写hashcode方法呢?

43.hashcode介绍

hashcode的作用是获取哈希码,也成为散列码,它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

hashcode定义在jdk的Object.java中,这就意味着java中的任何类都包含hashcode函数。

散列表存储的是键值对(key-value),他的特点是:能根据“键”快速索引出对应的值,这其中就用到了散列码。

44.为什么要有hashCode?

我们以HashSet如何检查重复为例来说明为什么要有hashCode:

当你把对象加入HashSet时,HashSet会先计算对象的HashCode值来判断对象加入的位置,同时也会与其他已经加入的对象hashCode值来比较,如果没有相符的hashCode,HashSet会假设对象没有重复出现。但是如果发现有相同的hashCode值的对象,这时会调用equals()方法来检查hashCode相等的对象是否真的相等。如果两者相同,HashSet就不会让其加入成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了equals()的次数,相应的就大大提高了执行速度。

hashCode()与equals()的相关规定

如果两个对象相等,则hashCode一定也是相同的

两个对象相等,对两个对象分别调用equals()方法返回的一定是true

两个对象有相同的hashCode值,他们也不一定是相同的

因此equals()方法被覆盖,则hashCode()方法也必须被覆盖

hashCode的默认行为是对堆上的对象产生独特值,如果没有重写hashCode()方法,则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

对象的相等与指向他们引用相等,两者有什么不同?

对象的相等比的是内存中存放的内容是否相等,而引用相等比较的是他们指向的内存地址是否相等

45.抽象类和接口的区别

1.抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

2.抽象类的成员变量可以是各种类型的,而接口中的成员变量只能是public abstract final类型的;

3.接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

4.一个类只能集成一个抽象类,而一个类可以实现多个接口。

46.java8的接口新增了哪些特性?

增加了default方法和static方法,这两种方法可以有方法体

47.重写和重构的区别

重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!

重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。

重写的方法不能抛出新的检查异常或者比被重写方法申明更加广泛的异常。

重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

48.ArrayList和LinkedList有什么区别?

1.ArrayList和LinkedList的主要区别来自于Array和LinkedList数据结构的不同。ArrayList是给予数组实现的,LinkedList是基于双链表实现的。另外,linkedList类不仅是List接口的实现类,可以根据索引来随机访问集合中的元素,除此之外,LinkedList还实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向队列,因此LinkedList可以作为双向队列,栈(可以参考Deque提供的接口方法)和List集合使用,功能强大。

2.因为Array是基于索引的数据结构,它使用索引在数组中的搜索和读取数据是很快的,可以直接返回数组中index位置的元素,因此在随机访问集合元素上有较好的性能。Array获取数据的时间复杂度是O(1),但是插入、删除数据确实开销很大的,因为这需要移动数组中插入位置之后的所有元素。

3.相对于ArrayList,LinkedList的随机访问集合元素的时效性较差,因为需要在双向链表中找到要index的位置,在返回;但在插入,删除操作很快。因为LinkedList不像ArrayList一样,不需要改变数组大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度为O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。

4.LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。

 49.HashMap是怎么实现的?

详见:https://blog.csdn.net/woshimaxiao1/article/details/83661464

50.HashMap在java7和java8重点实现有什么不同?

详见:https://blog.csdn.net/qq_36520235/article/details/82417949

51.HashMap有时候会死循环,你知道什么原因吗?

详见:https://www.cnblogs.com/williamjie/p/11089522.html

52.ConcurrentHashMap是怎么实现的?

详见:https://www.infoq.cn/article/ConcurrentHashMap/

53.静态代理和动态代理的区别?

静态代理中代理类在编译期就已经确定,而动态代理则是JVM运行时动态生成,静态代理的效率相对代理来说相对高一些,但静态代理代码冗余大,一旦需要修改接口,代理类和委托类都需要修改。

54.jdk动态代理和CGLIB动态代理的区别

jdk动态代理只能实现了接口的类生成代理,而不能针对类。

CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。因为是继承,所以该类或方法最好不要声明成final。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值