目录
1.java的基本数据类型有哪些?
2.int和Integer的区别?
3.什么是重载和重写?
4.==和equals的区别?
5.java中final关键字有哪些作用?
6.HashMap和Hashtable的区别?
7.创建线程的方式?
8.什么是浅拷贝与深拷贝?
9.深拷贝与浅拷贝的区别?
10.面向对象有哪些特征?
11.什么是死锁?怎么防止死锁?
13.swtich选择语句中支持哪些数据类型?
14.什么是泛型?
15.堆栈的区别?
16.什么是线程同步,异步?
17.乐观锁和悲观锁的区别?
18.说一下 runnable和 callable有什么区别?
19.接口和类有什么区别和相同点?
20.线程的run()和start()有什么区别?
21.final 和 finally ,finalize的区别?
22.ArrayList 与 LinkedList 区别?
23.静态变量与非静态变量的区别?
24.什么是内存溢出,内存泄漏?
25.Throw 和 Throws 的区别?
26.JDK7 和 JDK8 区别?
27.Java 关键字 volatile 与 synchronized 作用与区别?
28.解决hashmap线程不安全问题?
29.Hashmap的底层实现原理
30.多线程怎么解决高并发?
31.Java中的锁有几种方式
32.解释下内存中的栈、堆、方法区的用法?
33.IO和NIO的区别?
34." " 和 null的区别?
35.线程的状态?
36.java的多态表现在哪里?
37.你对线程优先级的理解是什么?
38.Sleep()、suspend()和 wait()之间有什么区别?
39.String,StringBuilder和StringBuffer的区别?
40.什么是线程??
41.线程和进程有什么区别?
42.有哪些不同的线程生命周期?
43.什么是死锁(Deadlock)?如何分析和避免死锁?
44. 什么是线程安全?Vector 是一个线程安全类吗?
45.Java 中如何停止一个线程?
46.一个线程运行时发生异常会怎样?
47.ThreadLocal 可以用来共享数据吗?
48.什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?
49.Java 中的同步集合与并发集合有什么区别?
50.同步方法和同步块.哪个是更好的选择?
51.什么是线程池? 为什么要使用它?
52.多线程中的忙循环是什么?
53.多线程有几种实现方式?
54.有三个线程 T1,T2,T3,怎么确保它们按顺序执行?
55.怎么检测一个线程是否拥有锁?
56.如何在两个线程间共享数据?
57.什么地方用了多线程?
58.Excutors 可以产生哪些线程池?
59.Java 中多线程同步是什么?
60.线程之间如何通信?
61.用户线程和守护线程有什么区别?
62.如何暂停一条线程?
63.描述一下JVM加载class文件的原理机制?
64.java里有什么数据结构?
65.java中break,continue,return 的区别?
66.如果hashtable存储null值会怎么样?
67.JVM结构原理、GC工作机制详解?
68.TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
69.String类可以被继承吗?
70.& 和 && 的区别?
71.抽象类(abstract class)和接口(interface)有什么异同?
72.char 型变量中能不能存储一个中文汉字,为什么?
73.抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法(native),是否可同时被 synchronized?
74.阐述静态变量和实例变量的区别?
75.如何将一个 java 对象序列化到文件里?
76.字节流和字符流的区别?
77.如何实现对象克隆?
78.什么是 java 序列化,如何实现 java 序列化?
79.java线程池有几种?
80.接口有什么好处?
81.Java中的变量,代码块,构造器之间执行的顺序是怎样的?
82.throws,throw,try,catch,finally分别代表什么意?
1.java的基本数据类型有哪些?
-
1.byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。 -
2.short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。 -
3.int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。 -
4.long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。 -
5.float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。 -
6.double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。 -
7.boolean:只有true和false两个取值。 -
8.char:16位,存储Unicode码,用单引号赋值。
2.int和Integer的区别?
3.什么是重载和重写?
-
重写就是父类与子类之间的多态 -
重载是在一个类中多态对的体现 -
(1)方法重载是一个类中 定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方 法的重载(Overloading)。 -
(2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返 回值也一样的方法,就称为重写(Overriding)。
4.==和equals的区别?
5.java中final关键字有哪些作用?
-
其实 Final 是一个安全修饰符,就是用 final 修饰的类不能被继承,用 final 声明的方法不能被重 写,使用 final 声明的变量就相当于常量,不能被修改。
6.HashMap和Hashtable的区别?
-
1.这两个都是是 Map 接口下的实现类,我们开发的时候经常用的是 HashMap 虽然 HashMap 不是线程安全的但是他的存储效率比较高,Hashtable 是线程安全我们看过他底层的 put 方法前面加的 synchronized关键字,但是他的效率太低,我们开发很少用。 -
2.为什么说 hashTable 是线程安全的? 因为看源码的时候里面的 put 方法前面加了 synchronized 关键字。 -
3.什么情况下用 hashMap? 我们有时候在自定义返回 json 字符串的时候,封装到 List 中进行返回。
7.创建线程的方式?
-
1.继承Thread类创建线bai程子类
-
2.建一个类去实现Runnable接口
-
3.最后一种就是实现 Callable 接口
8.什么是浅拷贝与深拷贝?
9.深拷贝与浅拷贝的区别?
-
1.浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址, -
2.深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。 -
3.浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。 -
4.深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。
10.面向对象有哪些特征?
-
1、封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面;面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 -
2、继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法;对象的一个新类可以从西现有的类中派生,这个过程称为新类的基类(也就是父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更合适特殊的需要。 -
3、多态性:多态性是指允许不用类的对象对同一消息做出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很多的解决了应用程序函数同名问题。
11.什么是死锁?怎么防止死锁?
13.swtich选择语句中支持哪些数据类型?
14.什么是泛型?
15.堆栈的区别?
-
1.堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。 -
2.栈内存用来存储局部变量和方法调用。 -
3.栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。 -
4.堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。
16.什么是线程同步,异步?
17.乐观锁和悲观锁的区别?
-
对于乐观锁和悲观锁的区别及应用,要牢记一句话:读取频繁使用乐观锁,写入频繁使用悲观锁 -
1.乐观锁假定不会发生冲突,只有在提交操作的时候检查是否有冲突 -
2.悲观锁假定会发生冲突,访问的时候都要先获得锁,保证同一个时刻只有线程获得锁,读读也会阻塞
18.说一下 runnable和 callable有什么区别?
19.接口和类有什么区别和相同点?
-
1.不同点:
-
接口不能直接实例化。 -
接口不包含方法的实现。 -
接口可以多继承,类只能单继承。 -
类定义可以在不同的源文件之间进行拆分。
-
2.相同点:
20.线程的run()和start()有什么区别?
21.final 和 finally ,finalize的区别?
-
1.final修饰符(关dao键字)如果一个类dao被声明为final,意版味着它不能再派生出新的子类,权不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 -
2.finally再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 -
3.finalize方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
22.ArrayList 与 LinkedList 区别?
23.静态变量与非静态变量的区别?
-
1.java在类加载的过程中,再把.class文件加载进内存的时候就为静态变量在运行时数据区的方法区中分配内存,而且只分配一次. -
2.非static变量每创建一个实例的时候就会在堆中被分配一次内存,每个实例都有一个独立的非static变量 -
3.简而言之,static变量属于整个类,而不属于任何一个实例,生命周期取决于类.非static变量,属于实例,生命周期跟着实例走
24.什么是内存溢出,内存泄漏?
-
1.内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 -
2.内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory!
25.Throw 和 Throws 的区别?
26.JDK7 和 JDK8 区别?
-
我了解JDK8的新特性有:就是接口里也可添加普通的方法了,不用非得是抽象方法了, 但是必须得用default进行修饰,调用的时候也还是得实现这个接口以后才能调用,还有就 是添加了一个Lambda 表达式,让我们遍历集合数据的时候速度更快,我大概就知道这些, 我们目前开发也还没用到过这些新特性,对了,还有就是JDK1.8以后的map存储方式是1.7 的也有些区别.如果不相等则形成链表结构,jdk1.7后加的在前面,先加的移下,这种情 况叫碰撞。这种碰撞的情况应尽量避免,否存一个索引中链表的数据大量时,该索引当再 次插入一个对象时equals比较全部影响效率。 因此jdk1.8改善这种碰撞情况的出现,jdk1.8中的HashMap存储结构是由数组、链表、 红黑树这三种数据结构形成,红黑树查询删除快新增慢。
27.Java 关键字 volatile 与 synchronized 作用与区别?
-
1.volatile
-
2.synchronized
-
区别:
28.解决hashmap线程不安全问题?
29.Hashmap的底层实现原理
30.多线程怎么解决高并发?
-
1.synchronized 关键字主要解决多线程共享数据同步问题。 -
2.ThreadLocal 使用场合主要解决多线程中数据因并发产生不一致问题。 -
3.ThreadLocal 和 Synchonized 都用于解决多线程并发访问但是 ThreadLocal 与 synchronized 有本质的区别:
31.Java中的锁有几种方式
32.解释下内存中的栈、堆、方法区的用法?
33.IO和NIO的区别?
34." " 和 null的区别?
-
1.null是没有地址 -
2." "是有地址但是里面的内容是空的
35.线程的状态?
36.java的多态表现在哪里?
37.你对线程优先级的理解是什么?
38.Sleep()、suspend()和 wait()之间有什么区别?
-
1.Thread.sleep()使当前线程在指定的时间处于“非运行”(Not Runnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入该块或方法中。如果另一线程调用了interrupt()方法,它将唤醒那个“睡眠的”线程。 -
2.sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sleep(),(这里的t是一个不同于当前线程的线程)。即便是执行t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,使用suspend()导致线程进入停滞状态,该线程会一直持有对象的监视器,suspend()容易引起死锁问题。 -
3.object.wait()使当前线程出于“不可运行”状态,和sleep()不同的是wait是object的方法而不是thread。
39.String,StringBuilder和StringBuffer的区别?
-
1.String是只读字符串,所引用的字符串不能被改变 -
2.Stringbuffer和Stringbuilder定义的可以通过各种方法来达到简单的增删改; -
3.String和Stringbuilder在单线程环境下使用; -
4.StringBuffer在多线程环境下使用,可以保证线程同步; -
5.Stringbuilder 和StringBuffer 实现方法类似,均表示可变字符序列,不过StringBuffer 用synchronized关键字修饰(保证线程同步) -
运行速度:Stringbuilder最快,StringBuffer次之;String最慢,因为每次都要重新开辟内存,产生很多匿名对象,影响系统性能。
40.什么是线程??
41.线程和进程有什么区别?
42.有哪些不同的线程生命周期?
43.什么是死锁(Deadlock)?如何分析和避免死锁?
44. 什么是线程安全?Vector 是一个线程安全类吗?
45.Java 中如何停止一个线程?
-
Java 提供了很丰富的 API 但没有为停止线程提供 API。JDK 1.0 本来有一些 像 stop(), suspend() 和 resume()的控制方法但是由于潜在的死锁威胁因此在后续 的 JDK 版本中他们被弃用了.之后 Java API 的设计者就没有提供一个兼容且线程安 全的方法来停止一个线程。当 run() 或者 call() 方法执行完的时候线程会自动结束, 如果要手动结束一个线程.你可以用 volatile 布尔变量来退出 run()方法的循环或者 是取消任务来中断线程
46.一个线程运行时发生异常会怎样?
47.ThreadLocal 可以用来共享数据吗?
48.什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?
49.Java 中的同步集合与并发集合有什么区别?
-
1.同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合.不过并 发集合的可扩展性更高。 -
2.在 Java1.5 之前程序员们只有同步集合来用且在多线程并发的时候会导致争 用.阻碍了系统的扩展性。 -
3.Java5 介绍了并发集合像 ConcurrentHashMap.不仅提供线程安全还用锁分 离和 内部分区等现代技术提高了可扩展性。
50.同步方法和同步块.哪个是更好的选择?
51.什么是线程池? 为什么要使用它?
-
1.创建线程要花费昂贵的资源和时间.如果任务来了才创建线程那么响应时间会 变长.而且一个进程能创建的线程数有限。 -
2.为了避免这些问题.在程序启动的时候就创建若干线程来响应处理.它们被称为 线程池.里面的线程叫工作线程。 -
3.从 JDK1.5 开始.Java API 提供了 Executor 框架让你可以创建不同的线程池。 比如单线程池.每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适 合很多生存期短的任务的程序的可扩展线程池)
52.多线程中的忙循环是什么?
-
1.忙循环就是程序员用循环让一个线程等待.不像传统方法 wait(), sleep() 或 yield() 它们都放弃了 CPU 控制.而忙循环不会放弃 CPU.它就是在运行一个空循环。 这么做的目的是为了保留 CPU 缓存。 -
2.在多核系统中.一个等待线程醒来的时候可能会在另一个内核运行.这样会重建 缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。
53.多线程有几种实现方式?
54.有三个线程 T1,T2,T3,怎么确保它们按顺序执行?
55.怎么检测一个线程是否拥有锁?
56.如何在两个线程间共享数据?
57.什么地方用了多线程?
58.Excutors 可以产生哪些线程池?
59.Java 中多线程同步是什么?
60.线程之间如何通信?
61.用户线程和守护线程有什么区别?
-
1.所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如 垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部 分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有 守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。 -
2.用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开: 如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。因 为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了
62.如何暂停一条线程?
63.描述一下JVM加载class文件的原理机制?
64.java里有什么数据结构?
65.java中break,continue,return 的区别?
66.如果hashtable存储null值会怎么样?
67.JVM结构原理、GC工作机制详解?
-
JVM主要包括四个部分:
-
1.类加载器(ClassLoader)
-
2.执行引擎
-
3.本地方法接口
-
4.内存区(也叫运行时数据区)
-
GC工作机制
68.TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
-
1.TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。 -
2.TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。 -
3.Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象必须实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)。
69.String类可以被继承吗?
70.& 和 && 的区别?
71.抽象类(abstract class)和接口(interface)有什么异同?
-
不同点:
-
1.抽象类中可以定义构造器,接口不能; -
2.抽象类可以有抽象方法和具体方法,接口不能有具体方法; -
3.接口中的成员全都是 public 的,抽象类中的成员可以使用private、public、protected、默认等修饰; -
4.抽象类中可以定义成员变量,接口中只能是常量; -
5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法; -
6.抽象类中可以包含静态方法,接口中不能有静态方法; -
7.一个类只能继承一个抽象类,一个类可以实现多个接口;
-
相同点:
72.char 型变量中能不能存储一个中文汉字,为什么?
73.抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法(native),是否可同时被 synchronized?
-
都不能。 -
1.抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。 -
2.本地方法是由本地代码(如 C++ 代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。 -
3.synchronized 和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
74.阐述静态变量和实例变量的区别?
75.如何将一个 java 对象序列化到文件里?
76.字节流和字符流的区别?
77.如何实现对象克隆?
78.什么是 java 序列化,如何实现 java 序列化?
79.java线程池有几种?
-
一:newCachedThreadPool(缓存线程型池)
-
(1)缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse,如果没有,就建立一个新的线程加入池中; -
(2)缓存型池子,通常用于执行一些生存周期很短的异步型任务;因此一些面向连接的daemon型server中用得不多; -
(3)能reuse的线程,必须是timeout IDLE内的池中线程,缺省timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。 -
(4)注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止
-
二:newFixedThreadPool (缓存线程池和上面的差不多)
-
(1)newFixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程 -
(2)其独特之处:任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子 -
(3)和cacheThreadPool不同,FixedThreadPool没有IDLE机制(可能也有,但既然文档没提,肯定非常长,类似依赖上层的TCP或UDP IDLE机制之类的),所以FixedThreadPool多数针对一些很稳定很固定的正规并发线程,多用于服务器 -
(4)从方法的源代码看,cache池和fixed 池调用的是同一个底层池,只不过参数不同
-
三:ScheduledThreadPool(调度型线程池)
-
四:SingleThreadExecutor(单例线程)
80.接口有什么好处?
-
1.重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。 -
2、简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。 -
3.维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。 -
4.安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。
81.Java中的变量,代码块,构造器之间执行的顺序是怎样的?
-
步骤:
-
1、父类静态变量和静态代码块(先声明的先执行); -
2、子类静态变量和静态代码块(先声明的先执行); -
3、父类的变量和代码块(先声明的先执行); -
4、父类的构造函数; -
5、子类的变量和代码块(先声明的先执行); -
6、子类的构造函数。
82.throws,throw,try,catch,finally分别代表什么意?
-
1.try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。 -
2.catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。 -
3.finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。 -
4.throw – 用于抛出异常。 -
5.throws – 用在方法签名中,用于声明该方法可能抛出的异常
|