1.什么是JVM ?
- JVM是可以运行java字节码文件的假想计算机
- JVM是解释运行字节码文件的软件和工具,也是java语言跨平台的基本支持,java语言是运行在JVM上的,而JVM是运行在各种不同的平台上的,那么java程序和平台本身就解耦了,那么自然也就跨平台了
2.JDK和JRE的区别
- JDK是java开发环境包,JRE是java运行环境
- JDK里面包含了JRE和java开发工具,可以编译和运行java运行程序,而JRE只是运行环境,只能解释运行字节码文件
3.什么是跨平台性,原理是什么?
- java通过编译器编成字节码文件,而字节码文件是运行在JVM上的,每个不同的平台都有不同的JVM,所有同一个字节码文件就能运行在不同的平台上,这就是java的跨平台性
4.你怎么理解变量?
- 变量是数据存储的最小单元;
- 变量是一块内存区域,用来存储数据,随着程序的执行,变量的值也可能跟着改变。
5.java有哪些数据类型。
- 基本类型有:byte,short,int,char,long,float,double,blloean
- 其他类型都是引用类型
6.switch能否作用在byte上,能否作用在long上面,能否作用在string上?
可以作用在byte上,不能作用在long上面,在jdk1.7之前不能作用在string上面,之后可以
7.java访问修饰符的区别
- pricate :在同一类可见,使用对象:变量方法,注意不能修饰类(外部类)
- default(缺省):在同一个包中可见,可以作用在类,接口,变量方法上面
- protected:在当前包以及所有子类可见,可以作用在变量以及方法上面,不能修饰类(外部类)
- public:所有类可见,可以修饰变量,方法,接口,类,
8.&和&&的区别
&:按位与,逻辑与
&&:短路与,和&最大的区别就是虽然两者都是表达式两边的布尔值为true结果才为true,但是&&在表达式左边的值为false时,表达式后半部分就不会执行了,所以称之为短路与
9.break,continue,return去区别
break是跳出上一层循环,结束当前循环体
continue是跳出本次循环,继续执行下一次循环
return程序返回,不在执行下面的代码,(结束当前的方法,直接返回)
9.char类型能否存储一个中文汉字,为什么?
char类型变量是存储Unicde的编码的字符的,Unicode编码字符集中包含了汉字,所以,char类型变量中当然可以存储汉字,如果某个特殊的汉字没有被包含在unicode编码集中,那么这个char类型的变量中就蹦年存储这个特殊汉字,补充说明:unicode 编码占用两个字节,char类型的变量也是占两个字节。
10.什么是值传递,什么是引用传递
java中没有值传递和引用传递,都是值传递
基本类型值传递传递的就是值,因为基本数据类型的值就是存储在栈内存中
引用数据类型传递时,传递的是引用地址的拷贝,因为引用数据类型在栈中存储的是地址。
11.类是什么?
类就是一类具有相似的特征 和行为的事务的抽象描述
在程序中,一个类就是一个新的数据类型,类中主要描述这个类的属性和方法,我们可以根据类创建对应的数据类型的数据对象。
12.对象是什么
‘万物皆对象’ , 对象就是一个类型的具体存在的实例
在程序中就是通过类的构造方法创建的类的实例
13.面向对象的特征都有那些?
封装:即使把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
继承是指:可以实现现有类的所有功能,并在无序重写编写原来的类的情况下对象这些功能进行扩展
多态性是说:同一类型的不同变现形态,就是将子类型对象赋值给父类型的引用,导致父类型的引用在运行期表现出子类型的状态
14.成员变量的默认值
所有成员变量都是有默认值的
成员变量的默认值和数组的默认值一致
所有的整数类型都是0或者0l,lfoat是0.0f,double是0.0,char是空字符\u000,boolean是false,其他类型全部都是null
15.方法重载
重载是我们可以在一个类中定义同名的方法,通过不同的参数类区分这些方法吗,在调用的时候吗JVM会根据传入的参数自动调用对应的方法,
所有参数不同,有三种情况
参数的类型不同
参数的个数不同
参数的顺序不同
方法重载和方法的放回置无关
静态方法和非静态方法之间的情况不能构成重载
16.构造方法
在每一个类中都有构造方法,构造方法就是用来拆功能键这个类对象的
构造方法的要求:
构造方法的方法名和类名必须一致
构造方法没有返回值,也不能写void
和访问修饰符无关,和参数也无关
17.this关键字
this关键字可以表示当前类对象或者当前类的其他构造方法
this在当前类的构造方法中或者当前类的实例方法中可以表示当前对象
this()可以在构造方法中吊桶本类的其他重载的构造方法,这是this()必须方法构造方法第一行
this在静态方法或者静态块中使用
18.构造方法是否可以重载
在类的继承中,构造方法是不能继承的
任何一个类的默认的构造方法中默认调用父类的无参数的构造方法
当在子类的构造方法中使用super关键字调用父类的构造方法,必须写在第一行
19.父子类之间的转换
任何需要父类的地方,都可以使用子类代替
子类对象赋值给父引用,不需要类型转换
父类对象赋值给子类引用,需要强制进行类型转换,如果父类对对象本身不是子类的实例会出现类型转换异常
20.什么是方法重写
所谓方法重写就是在子类小红重新定义服了ide方法
要求子类中的方法的名称,参数列表必须和父类中的一致,访问修饰符应该大于等于父类同样方法的权限修饰符,返回值类型要和父类一致获知是父类返回值类型的子类’
方法重写是实现多态的基本要求
21.super关键字
super关键字在子类中使用
super在子类中可以表示父类对象,当super作为父类对象使用的时候,可以调用父类被覆盖的方法或者没有被覆盖的方法,但是蹦年调用父类私有的任何成员
super还可以在子类的构造方法中调用父类的构造方法,当super用来调用父类的构造方法的时候,必须卸载子类构造方法的第一行
22.多态
就是同一种类型的不同表现形态,就是将不同的子类对象当作父类来看,这时这些对象表现的是子类本身的形态
多态产生的条件是:第一要实现继承,第二要重写方法
我们一般说的多态是运行时多态
有时我呢本也会将方法重载称之为静态多态
多态可以提高程序的可扩展性
23.java实现多态的机制
靠的是父类或者接口定义的引用变量指向子类或者具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量锁指向实例对象的方法,而不是引用变量的类型中定义的方法
24.static修饰符
static可以修饰成员变量,方法,成员内部类,静态代码块
static修饰的成员可以使用类名直接调用
static修饰的任何成员变量都是属于类的,而不是属于某一个对象的,所以才可以使用类名直接调用,当然了也可以使用对象调用,但是这种方式不合理
在任何静态(方法)中都不能使用非静态的任何引用
25.final修饰符
final修饰符表示是最终的
final修饰的变量必须在申明的同时赋值,而且不能重新赋值,final修饰的变量一般都是常量
final修饰额方法不能被子类重写
final修饰的类不能被继承,默认情况下final修饰的类中所在的方法都是final的
26.抽象类
抽象类是使用abstract修饰的
抽象类不能实例化对象
抽象类中可以定义抽象方法和非抽象方法
抽象类就是为了让其他的类来继承
抽象类可以继承非抽象类
当一个类继承了抽象类以后,这个类必须实现抽象类的所有抽象方法,当然如果这个子类也是抽象类,就可以选择不实现
27.抽象方法
抽象方法是必须使用abstract子u是的
抽象方法必须写在抽象类或者接口中
抽象方法是没有方法体的
抽象方法不能使用static或final修饰
28.抽象类和接口有什么区别
- 抽象类和接口不能直接实例化,如果实例化,抽象类变量是必须指向实现所有抽象类方法的子类对象,接口变量必须执行实现所有接口方法的类对象。
- 抽象类要被子类继承,接口要被类实现
- 接口只能错方法申明使用,抽象类可以做方法申明,也可以做方法实现
- 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量
- 抽象类里的抽象方法必须全部被子类实现,如果子类不能全部实现抽象方法,那么子类必须是抽象类,同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
- 抽象方法,只能申明,不能实现,接口时设计的结果,抽象类时重构的结果
- 抽象类里可以没有抽象方法
- 如果一个类里面由抽象方法,那么这个类只能时抽象类。
- 抽象方法要被实现,所以不能是静态的,也不能时私有的
- 接口可以继承接口,毕竟而已多继承接口,但类只能单继承
29.为什么java中的方法不能根据返回值类型来区分重载
因为调用时,编译器无法根据返回值类型判断调用哪个函数
方法重载指的是方法的名称相同,参数列表不同,当参数不同时编译器可以根据参数类型调用对应的方法,而无法根据返回值类型来判断调用哪个方法。
30.抽象方法是否可以定义为static的,是否可以定义为native的,是否可以定义为synchronized的?
都不能,抽象方法是需要子类实现的,而静态方法不能被子类重写,而且静态方法可以是同类名直接调用,抽象方法没有方法体,所以是矛盾的,Native修饰的时本地方法,需要其他语言实现,而抽象方法方法是没有方法实现的,也是矛盾的,syncronized修饰的方法和实现细节有关,也是矛盾的。
31.静态变量和实例变量的区别
语法区别:静态变量,静态变量时需要static关键字修饰,实例变量不需要。
程序运行时的区别:静态变量属于类,实例变量从属于对象,实例变量必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量;静态变量就是类变量,静态变量即类变量,只要程序加载了字节码文件,静态变量就会被分配空间,即可使用
32.int和Integer有什么区别,Integer的值缓存范围
1.Integer是int的包装类,int 则是java的一种基础数据类型
2.Integer变量必须实现实例化后才能使用,而int变量不需要
3.Integer实际是对象的引用,当new一个Integer时,实际上时生成一个指针指向此对象,而int则是直接存储数据值,int数据是在栈中,Integer是在堆中的,
4.Integer的默认值是null,int的默认值是0,Integer的值缓存范围是-128-127
33.equals与==的区别
1。==使用来比较两个数据是否一致的,基本数据类型比较的就是数值。引用数据类型比较的是两个对象的地址。
2Equals是object类中定义的方法,也是比较当前对象和传入的参数对象的。默认情况下也是使用==做比较的,所以默认情况下和==是一样的效果。一般都会重写equals,重写之后就按照重写的程序执行。String的equals就是重写的,比较的就是两个字符串的字符序列。
34.静态内部类和非静态内部类有什么区别
内部类是申明在一个类的内部的类
当内部类使用static修饰时,就是静态内部类,静态内部类在外部类没有实例化的情况下就可以实例化,而非静态内部类必须是外部类实例化之后才能实例化。
35.什么是异常
异常由于非合理的操作或者使用导致的程序运行的意外情况。
java中的意外情况体系为:Throwable
/ \
Error Exception
Throwable为例外的老祖宗,Error一般是指一些严重的错误导致程序无法继续运行。而Exception就是我们常说的异常,是可以捕获处理,程序可以继续运行的情况。我们处理异常就是为了让程序继续运行。
36.java检查型异常和非检查型异常的区别?
检查型异常:在java中所有不是运行时异常的Exception都是检查型异常,当方法中存在抛出检查型异常时,当方法中存在抛出检查型异常时,该方法的声明中必须包含throws语句,调用该方法的其他方法也必须对异常进行处理,如不进行处理必须在调用函数上声明throws语句,
非检查型异常:在java中所有运行时异常的子类都是非检查型异常,与检查型异常对比,非检查型异常可以不在方法中添加throws语句,调用方法也不需要强制处理
37.Try-catch-finally的执行过程
try语句块中放的是要检测的代码,可能会抛出异常,也可能会正常执行
catch(异常类型){}块时当java运行时系统接收到try块中抛出的异常对象时,会寻找处理这一异常catch块来进行处理(可以有多个catch块)
finally{}不管系统有没有抛出异常都会去执行,一般用来释放资源,除了在之前执行了System.exit(0)强制终止了JVM
38.String的“”赋值和new String的不同
当使用""赋值的时候,会首先检查内存中是否存在对应的字符串字样,如果存在就直接指向已经存在的字符串,倮不存在才会开辟新的空间存储对应的字符串
当使用new String()创建String 对象的时候,无论如何都会开辟新的空间。
39.String的不可变性
我们常说的String时常量,就是String的不可变性,String的不可变性是说String一旦创建存储在内用中对应的字符序列是不可变的,但是存储在栈中的地址是可以改变的,
40.stringBuilder和strignbuffer的区别
StringBuilder和StringBuffer都是可以变的字符串
我们可以通过它们的API直接修改这些对象在内存中存储的对应的字符序列
StrignBuilder是线程不安全的,StringBuffer是线程安全的
41.是否可以继承String
不能,因为String类是使用final修饰的,final修饰的类不能被继承,final修饰的方法不能被重写,final 修饰的类中的方法默认都是final的,final修饰的量不呢个被修改
42.List和Set有什么区别?
List和Set都是Collection接口的字节,List中的元素是由顺序的,可以重复的,Set中的元素是没有顺序的,不可以重复。
43.HashMap和HashSet有什么区别
- HashMap实现的是Map接口,HashSet实现的是Set接口。
- HashMap是以键值对形式存储数据,HashSet只是存储对象
- HashMap是使用键值对计算哈希值的,HashSet是使用对象来计算哈希值的,HashSet的底层是使用HashMap实现的
44.List和Map的区别
List:是存储单列数据的集合,存储的数据是有序并且是可以重复的
Map:存储双列数据的集合,通过键值对存储数据,存储的数据是无序的,Key值不能重复,Value值可以重复
45.ArrayList和LinkList的区别
- ArrayList底层使用数组实现,Linklist底层使用链表实现
- 对于随机方法get和set ArrayList优于LinkedList,因为LinkedList查询时需要指针移动
- 对应增删改操作LinkedList优于ArrayList,因为ArrayList需要创建新的数组拷贝数据,元素数量越多效率差别越大
46.ArrayList与Vector的区别
- ArrayList和Vctor都是list的实现类
- ArrayList和Vector底层都是使用数组实现的。
区别
- ArrayList的所有方法都不是线程安全的,Vector的所有方法都是线程安全的
- rrayList和Vector的空间增长方式不同,ArrayList按照1.5倍扩容,Vector当容量大于0时,新数组的长度为原数组的长度+扩容容量,否则新数组的长度为原数组的两倍
47.java中有序的Map
- LinkedHashMap 利用一个链表保存元素的添加顺序
- TreeMap 利用一个比较器对元素排序,或者使用元素的自然顺序进行升序排列。
48.HashMap和Hashtable的区别
核心区别:
- HashMap的方法不是同步的,Hashtab1e的方法是同步的。
- HashMap允许value为nul1,允许有一个key为nu11。Hashtable不允许出现为nu11的key和value。
次要区别:
- 1 HashMap和Hashtable继承的父类不同。
- 2 两个Api也略有不同,
- 3 Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍
49.HashSet是如何判断元素是否相同的?
- Hashset的底层是HashMap实现的,所以比较方式和HashMap的key的比较方式相同。
- 先比较key的hashcode值,如果hashcode不同就认为不同,如果hashcode相同再比较equals,如果equals返回 true,就表示相同,否则就表示不同。
50.字节流如何转换流字节流
- 字节输入流可以通过InoutStreamReader流转换,InputStreamReader流的构造方法的输入参数就是InputStream。
- 字节输出流可以通过OutputStreamWriter流转换,OutputStreamWriter流的构造方法的输入参数就是OutPutStream。
51.什么时序列化,java中如何实现序列化
- 为了便于存储或者传输,将一个对象转换为另一种形式的过程就是序列化,类似于商家打包(序列化),方便快递送货,到货后买家将商品拆包(反序列化)。
- java中通过ObjectOutputStream将对象序列化,要求对象必须实现java.io.seriaizaition接口,通过ObjectInputStream将对象反序列化
52.java中有几种流
- 按照流的方向分为:输入流和输出流
- 按照类型分为:字节流和字符流
53.字节流和字符流的区别
- 字节流在操作时不会用到缓冲区,是文件本身在操作的,而字符流在操作时使用到了缓冲区,通过缓冲区再拷贝文件
- 字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组、或者字符串,而字节流处理单元为1个字节,操作字节和字节数组
- 字节流可用户任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串
54.什么是线程安全,如何保证线程安全
线程安全:就是多线程访问同一代码,不会产生不确定的结果
如何保证线程安全:
- 使用线程安全的类
- 使用synchronized同步代码块,或者用lock锁
- 多线程并发情况下,线程共享的变量改为方法局部变量
55.什么是同步,什么是异步
java中常说的同步有两类:一类是方法,一类是说请求
方法调用:
同步方法一旦调用开始,调用者必须等到方调用结束后,才能继续后续的行为。
异步方法调用更像是一个消息传递,一旦开始,方法发调用就会立即返回,调用者就可以继续后续的操作,异步方法通常会在另外一个线程中,真实的执行者,整个过程不会阻碍调用者的操作
请求:
同步交互:指发出一个请求,就需要等待返回,然后才能狗发送下一个请求,有个等待过程。
异步交互:指发送一个请求,不需要等待返回,随时可以发送下一个的请求,不需要等待
56.sleep和wait有什么区别?
使用上
从使用角度来看
sleep是Thread线程类的方法,而wait是Object顶级类的方法,
sleep可以在任何地方使用,而wait只能在同步方法或者同步块中使用。
CPU及资源释放
sleep,wait调用后都会暂停当前线程并让出CPU的执行时间,当不同的是sleep不会释放当前持有的对象资源,到时间后继续执行,而wait会放弃所有锁并需要notifyAll后重新获得当前对象资源后才能继续执行,
异常捕获
sleep需要异常捕获或者抛出异常,而wait、notify、notifyAll不需要
57、创建线程的方式以及实现
public static MyThread extends Thread{
public void run(){
//重写run方法
//}
}
public class MyThread implements Runnable{
public void run(){
}
}
58.线程和进程的概念,并行和并发的概念
进程是计算机中的程序关于某数据集合上的一次进行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。
线程,有时被称为轻量进程,是程序执行流的最小单元,线程是程序中一个当以的顺序控制流程。
并行:多个程序可以同时执行,每一个时间短,可以有多个吸纳成同时执行
并发:多个线程同时竞争一个位置,竞争到的才能执行,每个时间段只有一个线程在执行。