java面试题--java基础,
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不冲突。
相关文章
- 暂无相关文章
用户点评