java基础面试题1

&和&&的区别?数组

& 不管左边表达式执行结果如何,都会执行右边安全

&& 左边执行不符合条件时,右边不执行网络

 1     public static void main(String[] args) {  2         int i = 1;  3         int j = 2;  4         
 5         // &
 6         if(++i==10 & ++j==10) { //false
 7  System.out.println(i);  8  System.out.println(j);  9  } 10         System.out.println(i); //2
11         System.out.println(j); //3 12         
13         // &
14         if(++i==10 && ++j==10) {  //false
15  System.out.println(i); 16  System.out.println(j); 17  } 18         System.out.println(i); //3
19         System.out.println(j); //3
20     }

int 和 Integer 有什么区别?(基本数据类型有哪些?)(String不是基本数据类型)app

Java 为每一个基本类型都提供了包装类,int 的包装类就是 Integer,而且从 jdk1.5 引入了自动拆箱、装箱机制,使得两者能够相互转换。ide

原始类型:boolean,char,byte,short,int,long,float,double模块化

包装类型: Boolean,Character,Byte,Short,Integer,Long,Float,Double函数

String、StringBuffer、 StringBuilder 的区别?ui

String 用于字符串操做,不可改变类型,每次值发生改变,都会建立一个新的对象,底层使用 char 数组实现,由于 使用 final,因此 String 不能够被继承this

StringBuffer 用于字符串操做,可变类型,对方法增长了同步锁,线程安全spa

StringBuilder 和 StringBuffer 相似,都是字符串缓冲区,线程不安全

执行效率:StringBuilder(线程不安全)>StringBuffer(线程安全)>String

String 类的经常使用方法都有那些?

indexOf():返回指定字符得索引

charAt():返回指定索引处得字符

repalce():字符串替换

trim():去除字符串两端的空白

split():分割字符串 返回分割后的字符串数组

getBytes():返回字符串的 byte 类型数组

length():返回字符串的长度

toLowerCase():字符串转小写

toUpperCase():字符串转大写

substring():截取字符串

equals():字符串比较

final 修饰 StringBuffer 后还能够 append 吗?

能够,final 修饰的是一个引用变量,那么这个引用始终指向这个对象,但这个对象内部的属性是能够改变的。

1     public static void main(String[] args) { 2         final StringBuffer sb = new StringBuffer(); 3         sb.append("a"); 4         sb.append("b"); 5         sb.append("c"); 6         
7         System.out.println(sb); //abc
8         
9     }

String 字符串修改实现的原理?

当 String 修改字符串的时候会建立一个 StringBuilder 对象,接下来调用 append 方法,最后经过 toString 方法返回。

什么是值传递和引用传递?

值传递:基本类型的一个概念,传递的是该变量的一个副本,改变副本不影响原变量

引用传递:对象型变量而言,传递的是该对象地址的一个副本,因此对引用对象操做影响原变量

== 比较的是什么?

== 比较两个对象基本内存引用,若是两个对象的引用彻底相同,返回 true,不然返回 false,若是两个对象是基本数据类型,则比较值是否相等。

1     public static void main(String[] args) { 2         int i = 10; 3         int j = 10; 4         System.out.println(i==j); 5         
6         String a = new String("hello"); 7         String b = new String("hello"); 8         System.out.println(a==b); 9     }

 

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

若是两个对象相等,则 hashCode 必定也是相同的;反之不成立。

1     public static void main(String[] args) { 2         String str1 = "通话"; 3         String str2 = "重地"; 4  System.out.println(str1.hashCode());//1179395 5  System.out.println(str2.hashCode());//1179395 6         
7  System.out.println(str1.equals(str2));//false 8     }

 

Java 里面的 final 关键字是怎么用的?

final关键字修饰的变量,只能进行一次赋值操做,而且在生存期内不能够改变它的值。

final关键字修饰的参数,在此方法中,不可更改该参数的值。

final关键字修饰的方法,该方法不能被重写。

final关键字修饰的类,该类不能被继承。

解释下什么是面向对象?面向对象和面向过程的区别?

面向对象的程序是由对象组成的,每一个对象包含用户公开的特定功能部分和隐藏的实现部分。 结构清晰,程序便于模块化,结构化,抽象化,更加符合人类的思惟方式。

面向过程的程序经过设计一系列的过程来解决问题。 面向过程侧重整个问题的解决步骤,着眼局部或者具体。

面向对象的三大特性?分别解释下?

封装:一般认为封装是把数据和操做数据的方法封装起来,对数据的访问只能经过已定义的接口。

继承:继承是从已有类获得继承信息建立新类的过程。提供继承信息的类被称为父类(超类/基类),获得继承信息的被称为子类(派生类)。

多态:分为编译时多态(方法重载)和运行时多态(方法重写)。

要实现多态须要作两件事:一是子类继承父类并重写父类中的方法,二是用父类型引用子类型对象,这样一样的引用调用一样的方法就会根据子类对象的不一样而表现出不一样的行为。主要由如下三种方式实现:

经过子类对父类的覆盖实现

经过在一个类中对方法的重载来实现

经过将子类对象做为父类对象使用来实现

Java 类初始化采用什么顺序呢?

初始化父类中的静态成员变量和静态代码块

初始化子类中的静态成员变量和静态代码块

初始化父类中的普通成员变量和代码块,再执行父类的构造方法

初始化子类中的普通成员变量和代码块,再执行父子类的构造方法

Java 是否支持多继承?

Java不支持多继承,但Java能够实现多个接口,从而达到相似多继承的目的。

什么是构造函数?什么是构造函数重载?
新对象被建立的时候会调用构造函数,每一个类都有构造函数,若是没有显式的建立构造函数,Java 编译器会自动为该类建立一个默认的构造函数。

若该类已经建立非空参构造函数,默认的无参构造函数就会失效。

构造函数重载和方法重载相似,能够为一个类建立多个构造函数,可是要保证每一个构造函数都有惟一的参数列表。

重载和重写的区别?

重载,编译时多态,在一个类里面,方法名字相同,而参数不一样。返回类型能够相同也能够不一样。

重写,也叫覆盖,运行时多态,重写发生在子类与父类之间,重写要求子类与父类具备相同的参数列表和返回类型。重写的方法调用时会覆盖父类的方法。

请说明 Comparable 和 Comparator 接口的做用以及它们的区别?

Comparable:

它是一个排序接口,只包含一个函数 compareTo()

一个类实现了 Comparable 接口,就意味着该类自己支持排序,它能够直接经过 Arrays.sort() 或 Collections.sort() 进行排序

 1 public class Human implements Comparable<Human> {  2     public Integer id;  3     public Integer age;  4     
 5  @Override  6     public int compareTo(Human o) {  7         if(this.age > o.age) {  8             return 1;  9         }else if(this.age < o.age) { 10             return -1; 11         }else{ 12             return 0; 13  } 14  } 15     
16 }

 

Comparator:

它是一个比较器接口,包括两个函数:compare() 和 equals()

一个类实现了Comparator接口,那么它就是一个比较器,其它的类,能够根据该比较器去排序

综上所述:Comparable 是内部比较器,而 Comparator 是外部比较器。

public class Man implements Comparator<Man>{ public Integer id; public Integer age; @Override public int compare(Man o1, Man o2) { if(o1.age > o2.age) { return 1; }else if(o1.age < o2.age) { return -1; }else{ return 0; } } }

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

抽象类中能够定义构造函数,接口不能定义构造函数;

抽象类中能够有抽象方法和具体方法,而接口中只能有抽象方法(public abstract);

抽象类中的成员权限能够是 public、默认、protected(抽象类中抽象方法就是为了重写,因此不能被 private 修饰),而接口中的成员只能够是 public(方法默认:public abstrat、成员变量默认:public static final);

抽象类中能够包含静态方法,而接口中不能够包含静态方法。

static 关键字的做用?Java 中是否能够重写一个 private 或者是 static 的方法?

static 关键字代表一个成员变量或成员方法能够在没有所属类的状况下被访问。

重写是基于运行时动态绑定的,而 static 方法是编译时静态绑定的,static 方法与任何实例都不相关,因此不能重写一个 static 方法

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

生命周期不一样

成员变量:

类成员变量是从该类的准备阶段开始,直到系统彻底销毁这个类,类变量的做用域与这个类的生存范围相同

实例变量是从该类的实例被建立开始存在,直到系统彻底销毁这个实例,实例变量的做用域与对应实例的生存范围相同

局部变量根据定义形式的不一样,又能够分为以下三种:

形参,形参的做用域在整个方法中都有效

方法局部变量,做用域从定义这个变量的位置到方法结束时都有效

代码块局部变量,做用域从定义这个变量的位置到代码块结束时都有效

super 关键字的做用?

super 关键字能够在子类构造方法中显式调用父类构造,可是必要处于第一行。

super 关键字能够在子类中显式调用父类方法或变量。

 

有时候可使用这个关键字扩展从父类继承过来的方法。

请说明类和对象的区别?

类是对某一类事物的描述,是抽象的;而对象是表示的一个具体的个体,是类的一个实例。

对象是函数、变量的集合体,而类是一组函数、变量的集合体, 即类是一组具备相同属性的对象集合体。

(class修饰的是类,new出来的是对象)

finally 块中的代码何时被执行?

在 Java 语言的异常处理中,finally 块的做用就是为了保证不管出现什么状况,finally 块里的代码必定会被执行。因为程序执行 return 就意味着结束对当前函数的调用并跳出这个函数体,所以任何语句要执行都只能在 return 前执行(除非碰到 exit 函数),所以 finally 块里的代码也是在 return 以前执行的。

此外,若是 try-finally 或者 catch-finally 中都有 return,那么 finally 块中的 return 将会覆盖别处的 return 语句,最终返回到调用者那里的是 finally 中 return 的值。

finally 是否是必定会被执行到?

不必定,下面列举两种执行不到的状况:

当程序进入 try 块以前就出现异常时,会直接结束,不会执行 finally 块中的代码;

当程序在 try 块中强制退出时也不会去执行 finally 块中的代码,好比在 try 块中执行 exit 方法。

try-catch-finally 中,若是 catch 中 return 了,finally 还会执行吗?

会,程序在执行到 return 时会首先将返回值存储在一个指定的位置,其次去执行 finally 块,最后再返回。所以,对基本数据类型,在 finally 块中改变 return 的值没有任何影响,直接覆盖掉;而对引用类型是有影响的,返回的是在 finally 对 前面 return 语句返回对象的修改值。

throw 和 throws 的区别?

throw:在方法体内部,表示抛出异常,由方法体内部的语句处理;throw 是具体向外抛出异常的动做,因此它抛出的是一个异常实例;

throws:在方法声明后面,表示若是抛出异常,由该方法的调用者来进行异常的处理;表示出现异常的可能性,并不必定会发生这种异常。

常见的异常类有哪些?

ArithmeticExecption

NullPointerException

ClassCastException

ArrayIndexOutOfBoundsException

FileNotFoundException

NumberFormatException

SQLException

IOException

NoSuchMethodException

IndexOutOfBoundsExecption

IllegalArgumentException

Java 的泛型是如何工做的 ? 什么是类型擦除 ?

泛型使得数据的类型能够经过参数传递过来,它提供了一种扩展能力,更符合面向对象思想。

当具体的类型肯定以后,泛型还提供了类型检测机制,不符合的类型不容许赋值,不然编译不经过。

因此类型擦除就是在进入 JVM 以前,与泛型相关的信息会被擦除掉,这些信息被擦除后,相应的类型就会被替换成泛型类型参数的上限,若是没有指定,则替换成 Object。

什么是泛型中的限定通配符和非限定通配符 ?

限定通配符包括两种:

表示类型的上界,格式为:<? extends T>,即类型必须为 T 类型或者 T 子类

表示类型的下界,格式为:<? super T>,即类型必须为 T 类型或者 T 的父类

非限定通配符:类型为 ,能够用任意类型替代。

List<? extends T> 和 List <? super T> 之间有什么区别 ?

List<? extends T>,即类型必须为 T 类型或者 T 子类

List <? super T>,即类型必须为 T 类型或者 T 的父类

Java 中的 IO 流的分类?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流 和 字符流。

字节流和字符流有什么区别?

字节流按 8 位传输,以字节为单位输入输出数据,字符流按 16 位传输,以字符为单位输入输出数据。

可是无论文件读写仍是网络发送接收,信息的最小存储单元都是字节。

相关文章
相关标签/搜索