java面试题

数据类型

byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
那句会编译失败呢?为什么呢?
b=3+4,3和4都是常量,所以在Java编译时期会检查该常量的和是否超出了Byte类型的范围。如果没有可以赋值。
b=b1+b2不可以,是因为b1和b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。(先开空间)

运算符

        int a=4;
        int b=(a++)+(++a)+(a*10);
        System.out.println(a);
        System.out.println(b);

输出 a=6,b=70

short c=1;
c+=1;
short c=1;
c=c+1;

上面的两个代码有没有问题,如果有,那些有问题?
c=c+1编译会有问题,c+=1等价于c=(c的数据类型)(c+1);

字符串

(1) 直接输出一个对象名称,其实默认调用了对象的toString()方法。

(2) ==和equals()的区别?

  1. == 基本类型:比较的是值是否相同
    引用类型:比较的是地址值是否相同
  2. equals()
    只能比较引用类型。默认情况下,比较的是地址值是否相同。
    但是,我们可以根据自己的需要重写该方法,string类重写了这个方法,比较的是字符串的内容。
  3. 字符串的拼接
    字符串如果是变量相加,先开空间,在拼接
    字符串如果是常量相加,是先加,然后在常量池里面找。
public class test{
    public static void main(String[] args) {
        String s="hello";
        s+="world";
       // s=(new StringBuilder()).append(s).append("world").toString();
        System.out.println("s:"+s);
       //System.out.println(new StringBuilder().append("s:").append(s).toString());
    }
}

上面的代码反编译后的结果

import java.io.PrintStream;
public class test
{
	public test()
	{
	}
	public static void main(String args[])
	{
		String s = "hello";
		s = (new StringBuilder()).append(s).append("world").toString();
		System.out.println((new StringBuilder()).append("s:").append(s).toString());
	}
}

说明:字符串被赋值后就不能改变,为了节省空间可以使用stringBuffer替换string

在这里插入图片描述

重载和重写函数

Override和Overload的区别?Overload是否可以改变放回值类型? 构造方法可以被override吗?
Override:重写
Overload:重载
方法重写:
在子类中,出现和父类中一摸一样的方法声明的现象.
构造方法不可以被重写
方法重载:
在一个类中,出现的方法名相同,参数列表不同的现象.

this和super的区别 和各自的作用?
this:代表当前类的对象引用。
super:代表父类存储空间的表示。(可以理解为父类的引用,通过这个东西可以访问父类的成员)
场景:
成员变量:
this.成员变量
super.成员变量
构造方法:
this(…)
super(…)
成员方法:
this.成员方法
super.成员方法

代码块初始化顺序

class Fu{
    static int i=1;
    static {
        System.out.println("静态代码块Fu");
    }
    {
        System.out.println("构造代码块Fu");
    }
    public Fu(){
        System.out.println("构造方法Fu");
    }
}
class Zi extends Fu{
    static {
        System.out.println("静态代码块Zi");
    }
    {
        System.out.println("构造代码块Zi");
    }
    public Zi(){
        System.out.println("构造方法Zi");
    }
}
public class test{
    public static void main(String[] args) {
        Zi z=new Zi();
    }
}

输出结果
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi

class X{
    Y b=new Y();
    X(){
        System.out.println("X");
    }
}
class Y{
    Y(){
        System.out.println("Y");
    }
}
public class Z extends X{
    Y y=new Y();
    Z(){
        System.out.println("Z");
    }
    public static void main(String[] args) {
        new Z();
    }
}

输出结果:
Y
X
Y
Z

Scanner

Scanner类有个问题:
先获取一个数值,然后再获取一个字符串,会出现问题
主要原因:就是那个换行符号的问题
如何解决的呢?
A:先获取一个数值后,在创建一个新的键盘录入对象获取字符串
B: 把所有的住居都先按照字符串获取,然后要什么,你就对应的转换成为什么。

StringBuffer和String的区别?

StringBuffer,StringBuilder和String的区别?
前者长度和内容可变,后者不可以改变。
如果使用前者做字符串的拼接,不会浪费太多资源。
StringBuffer:线程安全的可变字符串,同步的,数据安全,效率低。
(StringBuild?)
StringBuilder是不同步的,数据不安全的,效率高;
string 和stringbuffer互换
string s;
stringbufer sb=new stringbuffer(s);
or sb.apend(s); 通过构造方法,或者append()方法
stringbuffer转换成string通过构造方法或者tostring()方法 。
2 StringBuffer和数组的区别?

Random:产生随机数

构造方法:
public Random():没有给种子,用的是默认种子。是当前时间的毫秒值
publlic Random(long seed):给出指定种子

常见的数据结构的优缺点?

Hashtable和HashMap的区别?

HashMap:线程不安全,效率高。允许null键和null值
Hashtable:线程安全,效率低。不允许null键和null值

List,Set,Map等接口是否都继承了Map接口?

List,Set不是继承自Map接口,他们继承自Collection接口,Map接口本身就是一个顶层接口

Collection和Collections的区别?

Collection:是单列集合的顶层接口,有子接口List和Set
Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法

异常 编译器期异常和运行期异常的区别?

1: 编译器异常 必须要处理的,否则编译不通过
2: 运行期异常 可以不处理,可以处理

throw和throws区别

throw:

  1. 在方法体中,后面跟的是异常对象名,并且只能是一个
  2. 只能抛出一个异常对象名
  3. throw抛出一个异常对象,是一种可能,这个异常并不一定会产生

throws:
4. 在方法声明上,后面跟的是异常的类名,可以是多个
5. 表示抛出异常,由该方法的调用者来处理
3. throws是声明方法有异常,是一种可能性,这个异常并不一定会产生

finally关键字及其面试题

A:finally用于释放资源,它的代码永远会执行。特殊情况:在执行到finally之前jvm退出了
B:面试题

  • final,finally,finalize的区别?
    final:最终的意思,可以修饰类,成员变量,成员方法
    修饰类,类不能被继承
    修饰变量,变量是常量
    修饰方法,方法不能被重写
    finally:是异常处理的一部分,用于释放资源。
    一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了

    finalize:是Object类的一个方法,用于垃圾回收

  • 如果在catch里面有return,请问finally还执行吗?如果执行,在return前还是后
    会,前。
    实际上在中间。

public class FinallyDemo2 {
	public static void main(String[] args) {
		System.out.println(getInt());
	}

	public static int getInt() {
		int a = 10;
		try {
			System.out.println(a / 0);
			a = 20;
		} catch (ArithmeticException e) {
			a = 30;
			return a;
			/*
			 * return a在程序执行到这一步的时候,这里不是return a而是return 30;这个返回路径就形成了。
			 * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
			 * 再次回到以前的返回路径,继续走return 30;
			 */
		} finally {
			a = 40;
			return a;//如果这样结果就是40了。
		}
		// return a;
	}
}

outputStreamWriter close 和flush的区别?

close :先刷新缓冲区,然后关闭流对象。
flush:只刷新缓冲区

逻辑题

  • 矿泉水1元钱1瓶,每2个空瓶换一瓶矿泉水,现有20元钱,请问可以买多少瓶矿泉水?

    39 程序员
    40 销售 – 管理岗位
    逻辑思维能力是没有问题的:
    20+10+5+2+1+1 和1个空瓶子
    如何能达到40呢?
    借一个。
    如何借?交通能力。(交流沟通)
    1个空瓶子先给商店,再借。

  • 下面这个表达式,你移动一个数字或者符号就可以把这个表达式变成正确的
    62-63=1

    把6移动到2的次方位置。
    2的10次幂以内的值要非常的敏感。

  • 一栋房子需要一个工匠七天建成,这个工匠的工钱是一份金条,假如现在你需要盖一栋房子,而你只有一根完整的金条,怎么能把金条分三份的情况下每天都付给工匠工资,最后一天刚好付完?

  • 1/7,2/7,4/7

length

数组有没有length()这个方法? String有没有length()这个方法?
数组没有。
String有

编程题: 用最有效率的方法算出2乘以8等於几?

2<<3

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性吗?

可以。

switch

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

可以
不可以
JDK7以后可以

JDK中的5个类名,5个接口名,5个包名

5个常用类名

String
StringBuilder
Integer
集合类(ArrayList,LinkedList,HashSet,HashMap)
IO流(FileReader,FileWriter,FileInputStream,FIleOutputStream)
(BufferedXxx系列)

**5个接口名** 


Colletion,List,Set,Map,Iterator,Comparable,Comparator

跟数据库相关:
Connection,Statement,PreparedStatement,CallableStatement,ResultSet

**5个包名**
Java.lang
java.util
java.io
java.net
java.sql
java.math
java.awt

多态是编译时行为还是运行时行为? 如何证明?

三元运算符注意点

public static void main(String [] args){
char x=‘x’;
int i=10;
System.out.println(true?x:i);
}
输出 120
如果其中有一个是变量,按照自动类型转换规则换成相同的类型;

++

int i=3;
i=i++;
sout(i);
输出3;

定义float f=3.4;是否正确?
答:不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4

在这里插入图片描述

在这里插入图片描述

包装类

Object o1=true?new Integer(1):new Double(2.0);
System.out.println(o1);

//输出1.0

Object o2;
if(true)
o2=new Integer(1);
else
o2=new Double(2.0);
System.out.println(o2);
输出1

public void method1() {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j); false
Integer m = 1;
Integer n = 1;
System.out.println(m == n);// true
Integer x = 128;
Integer y = 128;
System.out.println(x == y);// false
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值