Java基础语法
[面试题]:下面的区别是什么?
short s = 3;
//s = s + 3;//不可以因为short会自动类型提升为int
s += 3;// 可以:不会改变原来的数据类型-底层做了强转的处理。
[面试题]&和&&的区别是什么?|和||的区别是什么?
&和&&的区别是什么?
当运算符左边的结果为true时&和&&右边的式子都会执行。
当运算符左边的结果为false时(右边的值不能影响最终结果)
&右边的式子要执行
&&右边的式子不会执行
|和||的区别是什么?
当运算符左边的结果为false时&和&&右边的式子都会执行。
当运算符左边的结果为true时(右边的值不能影响最终结果)
|右边的式子要执行
||右边的式子不会执行
面向对象
[面试题]请简述final关键字
final修饰类(最终的类)-太监类:该类不能被继承。(比如:String StringBuilder,....)
final修饰方法(最终的方法):不能被重写
final修饰的变量 :值不能被修改
final修饰的属性:没有默认值要求必须赋值
赋值的方式 :①显示赋值 ②代码块赋值 ③构造器赋值-
一定要保证无论调用哪个构造器都可以给该变量赋值
常用类
[面试题] : equals和==的区别?(Object类)
== :
如果运算符两边是基本数据类型比较的是具体的值
如果运算符两边是引用数据类型比较的是地址值。
equals :
如果类中不重写equals方法那么调用的是Object中的equals方法那么比较的是地址值。
如果类中重写了equals方法其本上都是比较内容(看重写方法中做了什么)。
[面试题] final、finally、finalize的区别(Object类)
final是一个修饰符可以修饰类,方法,变量。
finally是try-catch-finally中的一个关键字。finally中的代码一定会执行。
finalize :finalize是一个方法名,它是Object类中声明的一个方法,
它是由GC垃圾回收器在回收垃圾对象之前用于释放该对象在JVM以外占用的内存和资源。
(
比如调用了native方法 native方法调用的是c程序。
c程序用的不是JVM的内存GC无法对该内存区域进行管理
再通过代码去清理JVM以外的内存(不清理就会导致内存泄露-该内存一直在被占用)
)
[面试题] String s = “a” + “b” + “c” 创建了几个对象 ?(String类)
1个-字符串常量池
[面试题] String s = new String(“abc”) 创建了几个对象 ?(String类)
如果字符串常量池中没有abc 那么会创建2个对象 1个在字符串常量池 1个在堆中
如果字符串常量池中已经存在abc 那么会创建1个对象在堆中
[面试题] String s1 = new String(“hello”);(String类)
String s2 = s1.intern();
[面试题] StringBuffer和StringBuilder的区别?(String类)
String: 不可变的字符序列 线程安全
StringBuffer: 可变的字符序列 线程安全
StringBuilder: 可变的字符序列 线程不安全
补充效率方面:StringBuilder > StringBuffer > String
结论:如果需要频繁进行字符串的拼接可以使用StringBuilder和StringBuffer
集合
[面试题] ArrayList的底实现?(List接口实现类)
当我们通过ArrayList的空参构造器创建对象时底层会创建一个长度为0的Object[]。
当我们第一次向该对象中添加元素时底层会扩容 扩容的长度为10(原来的长度是0).
当我们向该对象中添加第11个元素时底层会再次扩容扩容为原来的1.5倍。
并且将原来的数组中的元素copy到当前数组中。
[面试题] ArrayList和LinkedList的区别?(List接口实现类)
ArrayList底层是数组,LinkedList底层是双向链表
ArrayList和LinkedList都不是线程安全的
[面试题] ArrayList和Vector的区别?(List接口实现类)
1.ArrayList和Vector底层都是Object[]
2.ArrayList是线程不安全的,Vector是线程安全的。
3.ArrayList空参构造器创建的是一个长度为0的数组,
Vector空参构造器创建的是一个长度为10的数组
ArrayList扩容为原来的1.5倍。Vector默认扩容为原来的2倍(也可以指定扩容大小)
[面试题] ArrayList,LinkedList,Vector的区别?(List接口实现类)
1.ArrayList和Vector底层都是数组。LinkedList底层是双向链表
2.ArrayList和LinkedList是线程不安全的。Vector是线程安全的。
[面试题]HashMap和Hashtable的区别?(List接口实现类)
1.HashMap是线程不安全的 Hashtable是线程安全的 (重要)
2.HashMap和Hashtable底层都是Hash表
3.HashMap的空参构造器中只给加载因子赋值0.75
(第1次创建的数组长度为16-Node[] 阈值是12)
Hashtable的空参构造器中创建了一个长度为11的Entry[] 加载因子0.75 阈值是8
4.Hashtable中的key,value不能是null (重要)
HashMap中的key,value可以是nulll
5.HashMap扩容为原来的2倍。Hashtable扩容为原来的2倍+1
[面试题] : Collection和Collections的区别?(List接口实现类)
Collections工具类 : 用来对集合做一些操作
Collection是一个接口
[面试题]继承Thread和实现Runnable有什么区别?(多线程)
1.实现接口和继承类 - 实现接口更灵活因为可以多实现。
2.线程安全
同步代码块 :
继承Thread : 锁不可以是this
实现Runnable : 锁可以是this
同步方法
继承Thread : 同步方法要使用静态同步方法--锁是当前类的运行时类(类信息)
实现Runnable : 同步方法不是静态的 - 锁是this
3.共享数据
继承Thread : 如果共享数据是在Thread子类中声明的该共享数据需要使用static修饰
实现Runnable : 如果共享数据是在Runnable接口的实现类中声明的
共享数据不需要使用static修饰
[面试题]sleep和wait的区别?(多线程)
(1)sleep()不释放锁,wait()释放锁
(2)sleep(时间)指定休眠的时间,wait()/wait(时间)可以指定时间也可以无限等待直到notify或notifyAll
(3)sleep()在Thread类中声明的静态方法,wait方法在Object类中声明