java面试题--java基础

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

2.自动拆箱和自动装箱

3.jre和jdk的区别

可从它们的面向对象主要作用组成部分三方面对比

JDK---Java Development Kit  
1). 主要面向开发人员;
2). 开发Java程序,运行Java程序的平台。 
3). 是整个Java开发的核心,包括了Java运行环境,Java工具和Java基础类库。 
JRE---Java Runtime Enviroment 
1). 主要面向程序使用者。 
2). 只能运行Java程序,不能从事Java开发。 
3). 包含JVM标准实现及Java核心类库。

4.== 和 equals 的区别是什么

 ==:基本数据类型比较的是值; 引用类型比较的是地址值。

equals:不能比较基本类型;比较引用类型时,等同于“==”,也就是比较地址值

               可重写equals方法,比如String类型中的equals方法比较的是具体的内容是否相同

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

不一定相同。正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同。但是如果不重写hashcode方法,就会出现不相等的情况。

6.final 在 java 中有什么作用

final关键字可用于修饰类、类属性和类方法。

被final关键字修饰的类不能被继承,被final关键字修饰的类属性和类方法不能被覆盖(重写)

7.java 中操作字符串都有哪些类?它们之间有什么区别?

String:不可变字符创序列

StringBuffer:可变字符串序列、线程安全、效率低

StringBuilder:可变字符串序列、线程不安全、效率高

8.String str="i"与 String str=new String("i")一样吗?

  • 在内存中的区别:

    String str= “abc”:在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。

    String str2 = new String("abc") :在编译阶段JVM先去常量池中查找是否存在“abc”,如果过不存在,则在常量池中开辟一个空间存储“abc”。在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“abc”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。

  • String类的特性:String类 是final修饰的,不可以被继承;底层是基于char数组的。
  • 性能效率

    String类被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。例如:

    String str = “hello";

    str = str + "world“;

    所以当上文str指向了一个String对象(内容为“hello”),然后对str进行“+”操作,str原来指向的对象并没有变,而是str又指向了另外一个对象(“hello world”),原来的对象还在内存中。

    由此也可以看出,频繁的对String对象进行修改,会造成很大的内存开销。此时应该用StringBuffer或StringBuilder来代替String。

    而new String()更加不适合,因为每一次创建对象都会调用构造器在堆中产生新的对象,性能低下且内存更加浪费。

  • 安全性

    对象都是只读的,所以多线程并发访问也不会有任何问题。

    由于不可变,用来存储数据也是极为安全的。

9.什么是不可变对象(immutable object),不可变对象有什么好处

不可变对象就是创建后不可以改变的对象,典型的例子就是Java中的String类。

    1).不可变对象可以提高String Pool的效率和安全性。如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存效率也很高。对于同时引用个“ABC”的其他变量也不会造成影响。
    2).不可变对象对于多线程是安全的,因为在多线程同时进行的情况下,一个可变对象的值很可能被其他进程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况。

运算符优先级【+优先级高于==,详见笔记《运算符优先级表》】的区别,前者是先计算+号,执行拼接,再和后面的s2比较

先执行StringBuilder的拼接,相当于new了一下,虽然值相等,但内存地址已变。

10.抽象类必须要有抽象方法吗

抽象类可以不包含抽象方法,包含抽象方法的类一定是抽象类。

11.普通类、抽象类和接口的区别

普通类和抽象类的区别:

  • 普通类可以去实例化调用;抽象类不能被实例化
  • 普通类和抽象类都可以被继承,但是抽象类被继承后子类必须重写继承的方法,除非自类也是抽象类

抽象类和接口的区别:

  • 概念不一样:接口是对动作的抽象,抽象类是对本质的抽象
  • 当关注一个事物的本质的时候,用抽象类;当关注一个操作的时候,用接口;
  • 抽象类主要用来抽象类别,接口主要用来抽象功能
  • 抽象类可以有具体的方法 和属性,  接口只能有抽象方法和不可变常量

12.抽象类能使用 final、private 修饰吗

java类一旦被声明为abstract(抽象类),必须要继承或者匿名(其实匿名也是种继承)才能使用。而final则是让该类无法被继承,所以final是必然不能和abstract同时声明的
一个类被声明为private的时候,它一定是内部类,内部类是可以被它的外部类访问到的,所以,可以继承,private和abstract不冲突。

                         

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值