1、Java基础
4、当数据需要大量更改时候,String 和 StringBuffer 哪个是更好的选择?
操作字符串的类有:String、StringBuffer、StringBuilder。
String每次赋值都会申请一片新的内存,创建一个新的对象;
StringBuffer 本质上是动态的,可以动态的更改其值;
所以,当数据需要大量更改的时候,StringBuffer 是更好的选择。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
21、String str=“i” 与 String str=new String(“i”) 一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
5、如何在Java中完成垃圾回收?
Java中,对象不被引⽤时,垃圾回收就会发⽣,对象会被⾃动销毁,调⽤ System.gc() ⽅法或 Runtime.gc() ⽅法。
6、可以在Main() ⽅法前执⾏代码?
如果要在类加载时,对象创建之前执⾏语句,可以在类中使⽤静态代码块。所以,即使在main⽅法中创建对象之前,此静态代码块中的语句都将在加载类时执⾏⼀次。
8、是否可以为对象多次调⽤类的构造函数?
不可以。使⽤new创建对象时,会⾃动调⽤构造函数,对象创建之后,则⽆法再调⽤该构造函数。
9、如何制作⼀个Java对象的副本?
使⽤克隆,我们可以创建具有对象的实际状态的副本。Clone() 是Cloneable Binterface的⽅法,因此需要实现Cloneable interface来进⾏对象拷贝。
10、如何限制⼀个类不被继承?
使⽤关键字final
11、在Java中,如何禁⽌序列化变量?
想要某些变量不被序列化,那么可以在声明时使⽤关键字transient。
private transient val;
13、定义了类的显式构造函数之后,还可以使⽤默认构造函数吗?
如果没有定义显式构造函数,那么Java将提供⼀个默认的⽆参数构造函数,但是如果定义了显式构造函数之后,就不能再调⽤默认构造函数。
14、在没有执⾏main()的情况下,成功编译了⼀个Java类,这⼀说法正确吗?
正确,虽然Java编译器规定程序的⼊⼝点为static main,但是没有 main() 还是能够编译,只是不能运⾏。
15、Java中变量没有初始化可以使⽤吗?
Java不会给变量分配默认值,因此变量没有初始化的情况下,程序会编译失败并给出错误提⽰。
16、Java中可以使⽤goto来转到特定⾏吗?
不可以,Java中没有goto关键字
17、equals() 和 == 有什么区别?
Java中,== 操作:
(1)基本数据类型:比较两个变量的值是否相等
(2)引⽤数据类型:比较两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作:表⽰的两个变量是否是对同⼀个对象的引⽤,即堆中的内容是否相同。
19、以下哪个类将分配更多的内存?
A类:三种⽅法,四个变量,⽆对象
B类:五个⽅法,三个变量,⽆对象
在创建对象之前,不会分配内存,所以这两个类都没有分配内存。
20、想要保留对象的数据以供以后使⽤,最好的做法是什么?
序列化
22、接口和抽象类有什么区别?
(1)实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
(2)构造函数:抽象类可以有构造函数;接口不能有。
(3)实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
(4)访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
2、Java容器
23、Java的容器有哪些?
数组 ArrayList
链表 LinkedList
队列 Queue
栈 stack
哈希表 HashMap TreeMap(key排序)
集合 set
树 Tree
堆 heap
24、HashMap 和 Hashtable 有什么区别?
(1)存储:HashMap 运行 key 和 value 为 null,而 Hashtable 不允许。
(2)线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
(3)推荐使用:Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。
25、说一下 HashMap 的实现原理?
HashMap的底层实现原理:
(1)第一步:当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值;
(2)第二步:根据 hash 值将 value 保存在 bucket 里。
(3)第三步:当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时使用链表;否则使用红黑树。
26、HashSet 的实现原理?
(1)HashSet 是基于 HashMap 实现的
(2)HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单
(3)相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成
(4)HashSet 不允许重复的值。
27、ArrayList 和 LinkedList 的区别是什么?
(1)数据结构实现:ArrayList 是动态数组, LinkedList 是双向链表
(2)数据存储方式:ArrayList 顺序存储,LinkedList 链式存储
(3)随机访问效率:ArrayList 随机访问的时候效率要高
(4)增加和删除效率:LinkedList 效率要高
(5)使用:频繁访问用ArrayList;频繁增删用LinkedList
28、Array 和 ArrayList 有何区别?
(1)存储内容:Array 可以存储:基本数据类型和对象,ArrayList :只能存储对象。
(2)大小:Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
(3)内置方法:Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。
3、多线程
1、什么是多线程
多线程是一个编程概念。在单个程序中以并发方式执行多个任务,同一个进程的多个线程堆栈共享,有助于改进程序的性能
2、为什么Java中会使用Runnable interface?
Runnable 在Java中用于实现多线程。java.lang.Runnable 是由一个支持多线程的类来实现的。
3、Java中三种实现多线程的方法?
(1)通过使用 java.lang.Runnable Interface中的 run 方法来实现多线程;
(2)编写一个扩展 java.lang.Thread类的类
(3)实现 Callable 接口;其中Runnable与Callback的区别:runnable 没有返回值,callable 可以拿到有返回值,callable 可以看作是 runnable 的补充。
7、在多线程中,如何确保资源不会同时被多个线程使⽤?
在多线程中,通过使⽤同步的概念来控制对多个线程之间共享的资源的访问。使⽤synchronized关键字,可以确保只有⼀个线程可以⼀段时间内使⽤共享资源。
12、请描述⼀下线程的不同状态。
Java中的线程往往是处于下⾯的某⼀种状态。
NEW:通过New关键字创建了Thread类(或其⼦类)的对象
RUNNABLE:这种情况指的是Thread类的对象调⽤了start()⽅法,线程处于就绪状态。
RUNNING:线程获得了CPU,处于运⾏状态。
DEAD:处于RUNNING状态的线程,在执⾏完run⽅法之后,就变成了DEAD状态了。
BLOCKED:这种状态指的是处于RUNNING状态的线程,出于某种原因,⽐如调⽤了sleep⽅法、等待⽤户输⼊等⽽让出当前的CPU给其他的线程。
18、在Java线程编程中,哪个⽅法是所有线程必须实现的?
Run() 是⼀个Runnable接⼝的⽅法,必须由所有线程实现。
29、并行和并发
并发 = 两个队列和一台处理器。
并行 = 两个队列和两台处理器。
4、设计模式
30、设计模式
(1)概念:
31、常见的设计模式
32、说一下单例模式的实现
33、简单工厂模式和抽象工厂模式
34、
35、
36、
37、
38、
39、
40、
41、
42、
43、
44、
45、
46、
47、
48、
49、
50、
51、
52、
53、
54、
55、
56、
57、
58、
59、
60、
61、
62、
63、
64、
65、
66、
67、
68、
69、
70、
71、
72、
73、
74、
75、
76、
77、
78、
79、
80、
81、
82、
83、
84、
85、
86、
87、
88、
89、
90、
91、
92、
93、
94、
95、
96、
97、
98、
99、
100、
1、
2、
3、
4、
5、
6、
7、
8、
9、
0、