1、列出说明数据类型,各占字节和占用位数?
在Java中,数据类型分为基本数据类型和引用数据类型。
基本数据类型有byte、short、int、long、float、double、char、boolean
引用数据类型有类、接口、数组
字节 位数
byte 1 8
short 2 16
int 4 32
long 8 64
float 4 32
double 8 64
char 2 16
boolean 1 8
2、String 能被继承吗?
String 被final修饰,所以不能被继承
延伸:
final修饰类时:不能被继承
final修饰方法时:不能被覆盖(重写),但是可以被继承
final修饰变量时:表示常量,只能被赋值一次,赋值后不可以修改
final不能修饰构造方法
使用final的原因:
1、把方法锁定,防止任何继承类修改其意义和实现
2、高效。编译器在遇到有final时,会转入内嵌机制,大大提高效率。(在《Java编程思想》中有存疑)
3、String、StringBuffer、StringBuilder的区别?
1、String类中使用字符串数组保存对象,其被final修饰,所以String对象是不可变的;而StringBuffer、StringBuilder都没有被final修饰,其值可以被改变。
2、String、StringBuffer都是线程安全的,因为String被final修饰,StringBuffer对方法加了同步锁,StringBuilder线程不安全。
3、StringBuffer是多线程,StringBuilder是单线程。
4、如果程序不是多线程的,那么StringBuilder的效率要高于StringBuffer。
4、ArrayList和LinkedList的区别?
ArrayList和LinkedList都基于List接口。但也有不同点。
1、ArrayList是基于索引的数据接口,它的底层是数组;LinkedList是基于元素列表的形式存储数据,每一个元素都和它前一个和后一个元素链接在一起。
2、ArrayList的获取(get)和修改数据(set)的速度要大于LinkedList,因为LinkedList需要移动指针,依次查找;LinkedList的新增(add)和删除(del)操作要大于ArrayList,因为ArrayList要修改下标,移动数据;
3、ArrayList相对于LinkedList而言,它的存储空间要小,因为LinkList为每一个节点存储两个引用,一个指向当前元素,一个指向下一个元素
5、抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么?
1、抽象类和接口都不能被实例化
2、抽象类中可以没有抽象方法,也可以有具体的方法实现,接口中有抽象方法,也可以有方法体(1.8新特性)
3、抽象类型需要被继承,接口需要被实现
4、抽象类只能单继承,接口可以多继承,并可以多实现
5、抽象类中可以有构造方法,静态方法,变量,常量;接口中只能有静态常量,只能并且默认是public staitc
final类型
6、抽象类中权限修饰符可以是public、protected(默认类型虽然eclipse不报错,但是应该也不行),接口
中权限修饰符只能是public,并且默认是public abstract 类型
7、接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发
挥作用,可以实现代码的重用
6、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个class,但是只能有一个public的类
7、说说&和&&的区别?
&和&&都表示逻辑与,如果两边等式均为true,则运算结果才为true,否则运算结果为false
&&具有短路功能,即当左面等式为false时,不会进行右面等式的计算,而&仍会计算右面等式
&还表示位运算,当左右等式值都不是boolean时执行
8、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在jdk1.7版本以前,switch的条件仅限于int类型的值,byte、short、int、char均满足条件
在jdk1.7版本以后,整形,boolean,String,枚举均支持,当条件为String时,switch会调用String.hashCode自动转为int类型
9、short s1 = 1;s1 = s1 +1; 有什么错? short s1 = 1; s1 += 1;有什么错?
s1+1时,值会自动像上转型为int型,这时用short类型接收,会类型转换失败,而s1+=1时,+=会进行特殊处理,自动转义
10、用最有效率的方法算出2乘以8等於几?
2<<3
将一个数左移n,表示这个数乘以2的n次方,而位运算是cpu支持的,效率更高
11、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final时,对象的引用变量不能变,引用对象所指向的对象内容可变
例如:
final SatringBuffer str = new StringBuffer("str");
str.apperd("_123");
但是,str = new StringBuffer("str_123");是错误的!
12、"=="和equals方法究竟有什么区别?
1、==是运算符,equals是方法
2、==运算符专门用来比较两个变量的值是否相等,也就是比较变量所对应堆内存中所存储的值是否相同
3、equals是比较两个对象内容是否相等
注意:Object类中的equals方法和 == 是一样的,没有区别,但是String和Integer等类重写了equals方法,所以,对于基本数据来说,两者没有区别。
13、静态变量和实例变量的区别?
1、静态变量前需要加 static 标识符
2、静态变量属于类,当类加载时,就会分配空间,创建对象;普通变量属于对象,只有创建对象后,才会分配空间,创建对象
14、是否可以从一个static方法内部发出对非static方法的调用?
不可以,因为static方法是在类初始化时就加载的,这个是后还没有创建的对象,所以非static的方法无法再static方法中调用
15、Integer与int的区别?
int是基本数据类型,而Integer是int的包装类,是对象,其中包含了一些使用方法。int的默认值是0,Integer的默认值是null。
16、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math提供了3个与取整有关的方法
1、ceil 向上取整
2、floor 向下取整
3、round 四舍五入(其含义是,数值+0.5后,向下取整)
所以Math.round(11.5)=12;Math.round(-11.5)=11;
17、下面的代码有什么不妥之处?
1、if(user.equals("name")){}
2、int x = 1; return x == 1 ? true : false;
1、无法判断username是否为null,如果其为null,则找不到equals方法,应写为if("name".equals(username))
2、== 表达式返回 true或false,应写为 return x == 1;
18、请说出作用域public,private,protected,以及不写时的区别?
public 当前类,同包下,子孙类,其他包
protected 当前类,同包下,子孙类
default 当前类,同包下
private 当前类
19、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
Overload为重载,指在同一类中,同一个方法名,参数列表(参数个数,顺序,类型)不同
Override为重写,指在子类中,可以有与分类相同方法名,相同返回值,相同参数列表的方法
在Overload重载时,只能在同一类中,与其返回值类型是否相同无关
在Override重写时,只能在子类中,父类方法的权限不能为private,子类方法抛出的异常与父类抛出的异常相同或是其子异常
20、写clone()方法时,通常都有一行代码,是什么?
写clone()方法是,需先克隆父类,所以一般来说通常都有的代码是 super.clone();
21、构造器Constructor是否可被override?
构造器Constructor不能被继承,所以就不能重写(覆盖)Override,但是可以重载Overload
22、面向对象的特征有哪些方面?
封装、抽象、继承、多态
封装:封装是指把描述一个对象的属性和行为的方法封装在一个类中,实现高内聚,低耦合,防止产生依赖的影
响。
抽象:抽象是找出一些事物的共性,将这些共性归为一个类,这个类只考虑这些事物的共性之处。
继承:继承是指在定义或实现一个类的时候,可以在一个已存在的类的基础之上来进行,把这个已存在的类所定义
的内容作为自己的内容,并可以加入若干新内容,或修改原来的方法,使其更符合本身需求,这就是继
承。继承是子类共享父类数据和方法的机制,这是类之间的关系,提高了软件的可用性和可扩展性。
多态:多态是指父类或接口定义的引用变量指向子类或具体实现类的实例对象,多态就是一个引用,多种实现方
式。
23、实现多态的机制是什么?
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量本身定义的方法。
24、abstract的方法是否可同时是static,是否可同时是native,是否可同时是synchronized?
1、abstract中的方法是不可以static的,因为抽象方法是要被子类实现的。
2、native方法表示该方法要被另外一种依赖平台的编程语言实现的,不存在被子类实现的问题,所以也不可以。
3、关于synchronized与abstract合用的问题,我觉得也不行,因为在我几年的学习和开发中,从来没见到过这
种情况,并且我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronize
d同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。
25、getClass() 和 super.getClass()?
public class Time extends Date {
public void getName(){
System.out.println(getClass().getName());
System.out.println(super.getClass().getName());
}
public static void main(String[] args){
Time t = new Time();
t.getName();
}
}
// 输出什么?
/*
super.getClass()表示调用父类中的方法。getClass()返回当前运行的类,所以无论是
super.getClass()还是getClass()都会返回当前运行的类。
此外,getClass()在Object中被定义final,子类不能覆盖该方法,所以子类中调用getClass(),就相当于
调用父类的getClass(),也就相当于 super.getClass().getName()。
如果想输出 父类名称,可以调用getClass().getSupperClass().getName();
*/
26、String s = "s1"; s =s+ "s2"; 执行代码后,原始对象String中内容到底变了没有?
没有改变。因为String被final修饰,所以String是不可变对象。当前代码中,对String对象做+操作,只是在内存中新开辟了一块空间,将String对象引用指向这块新空间,而原数据并没有被改变。
27、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别?
一个或两个对象。首先会在String常量池中查找,如果找不到会新建一个对象。执行new操作会在内存在新建一个对象。
28、数组有没有length()这个方法?String有没有length()这个方法?
数组有length属性,String有length()方法。
29、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会被执行,finally中的代码会在return和break语句后执行
30、final、finally、finalize的区别?
final用于声明属性,方法和类,分别表示为属性值不可被改变,方法不可以被重写,类不能被继承。
finally是异常处理的一部分,表示总被执行。
finalize是Object的一个方法,在垃圾收集器执行的时候会调用此方法,用来做最后的资源回收。
31、error和exception有什么区别?
error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
32、运行时异常与一般异常有何异同?
两种异常同属于Exception父类。
运行时异常都是RuntimeException及其子类异常;一般异常是除RuntimeException以外的其他异常。
Java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
33、请写出你最常见到的5个runtimeexception?
NullPointerException 空指针异常
ArithmeticException 除数为0异常
ArrayStoreException 数组存储空间不足异常
IoExcepton Io异常
ClassNotFoundEception 类未找到异常
FileNotFoundException 文件未找到异常
ClassCastException 将某一对象归于某类,但实际上该对象并不属于这个类和其子类
IlleaglMonitorStateException 监控器状态出错异常
NegativeArraySizeException 数组长度负数异常
IndexOutOfBoundsException 数组越界异常
ArrayIndexOutOfBoundsException 访问数组时越界异常
CloneNotSupportedException 对象引用Object中Clone(),但是此对象并没有链接Cloneable接口
34、Java中的异常处理机制的简单原理和应用。
异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。
Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try..catch处理或用throws声明,所以系统异常也称为unchecked异常。
提示答题者:就按照三个级别去思考:虚拟机必须宕机的错误,程序可以死掉也可以不死掉的错误,程序不应该死掉的错误;
35、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
有两种实现方法,分别使用 new Thread() 和 new Thread(runnable)形式,分别继承了Thread和Runnable接口。用synchronized关键字修饰同步方法。
stop()是线程不安全的,suspend()容易造成死锁。
36、sleep() 和 wait() 有什么区别?
sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行.
37、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
38、多线程有几种实现方法?同步有几种实现方法?
多线程的实现方法有两种,分别是继承Thread类,和实现Runnable接口。
同步的实现有两种,分别是synchronized和wait与notify。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
39、启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
40、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
分几种情况:
1.其他方法前是否加了synchronized关键字,如果没加,则能。
2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。
41、线程的基本概念、线程的基本状态以及状态之间的关系?
一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main方法执行的那个线程。
状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。
42、简述synchronized和java.util.concurrent.locks.Lock的异同?
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。
43、ArrayList和Vector的区别?
两个类都实现了List接口。
Vector是线程安全的,方法间线程同步,而ArrayList线程不安全,方法不同步。如果只有一个线程,那么考虑ArrayList,因为他不考虑安全效率高,如果有多个线程,最好使用Vector。
对于数据增长来说,Vector增长为原来的2倍,ArrayList增长原来的0.5倍。
44、HashMap和Hashtable的区别?
Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
HashTable为线程安全的,而HashMap线程不安全。
HashMap可以将空值作为一个表的条目的key或value。
45、List 和 Map 区别?
List存储单列数据的集合,Map存储键值双列的数据集合。
List是有序的,并且可以重复的数据集合,Map是无序的,key值不可以重复的,value可重复。
46、List, Set, Map是否继承自Collection接口?
List、Set是,Map不是。
47、List、Map、Set三个接口,存取元素时,各有什么特点?
List和Set有用一个父类,它们都是单列元素的集合。List是有序的数据集合,可重复数据。Set无法拥有重复数据,内部排序,Set只能通过Iterator接口遍历的方式获取数据。Map是双列的集合,通过put(key,value)存储一对 key/value 数据。
48、ArrayList,Vector, LinkedList的存储性能和特性?
ArrayList和Vectoy都是使用数组方式存储数据,因为设计数组元素的移动,所以插入数据慢,查找数据块,Vector是线程安全的,通常性能会交ArrayLis性能差一些。LinkList使用双向列表,按序号索引数据经行遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数据较快。LinkList线程不安全。
49、去掉一个Vector集合中重复的元素?
List<Integer> vector = new Vector<Integer>();
vector.add(1);
vector.add(2);
vector.add(3);
vector.add(1);
vector.add(1);
// 第一种方式
List<Integer> nv = new Vector<Integer>();
for(int i = 0; i < vector .size(); i++){
if(!nv.contains(vector .get(i))){
nv.add(nv.get(i))
}
}
// 第一种方式
Set<Integer> set = new HashSet<Integer>(vector);
50、Collection 和 Collections的区别?
Collection是集合类的上级接口,继承与他的接口主要有Set和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
51、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
对。
如果对象要保存在HashSet或HashMap中,它们的equals相等,那么,它们的hashcode值就必须相等。
如果不是要保存在HashSet或HashMap,则与hashcode没有什么关系了,这时候hashcode不等是可以的,例如ArrayList存储的对象就不用实现hashcode,当然,我们没有理由不实现,通常都会去实现的。
52、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常?
需要看当前调用方法的对象是哪个对象,就用那个对象的方法
53、常用的类,包,接口,请各举5个?
常用的类:
BufferedReader,
BufferedWriter,
FileReader,
FileWirter,
String,
Integer,
java.util.Date,
System,
Class,
List,
HashMap
常用的包:
java.lang,
java.io,
java.util,
java.sql,
javax.servlet,
org.apache.strtuts.action,
org.hibernate
常用的接口:
Remote,
List,
Map,
Document,
NodeList,
Servlet,
HttpServletRequest,
HttpServletResponse,
Transaction(Hibernate),
Session(Hibernate),
HttpSession
54、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。
字节流继承于InputStream OutputStream。
字符流继承与InputStreamReader OutputStreamWriter。
55、字节流与字符流的区别?
要把一片二进制数据数据逐一输出到某个设备中,或者从某个设备中逐一读取一片二进制数据,不管输入输出设备是什么,我们要用统一的方式来完成这些操作,用一种抽象的方式进行描述,这个抽象描述方式起名为IO流,对应的抽象类为OutputStream和InputStream,不同的实现类就代表不同的输入和输出设备,它们都是针对字节进行操作的。
在应用中,经常要完全是字符的一段文本输出去或读进来,用字节流可以吗?计算机中的一切最终都是二进制的字节形式存在。对于“中国”这些字符,首先要得到其对应的字节,然后将字节写入到输出流。读取时,首先读到的是字节,可是我们要把它显示为字符,我们需要将字节转换成字符。由于这样的需求很广泛,人家专门提供了字符流的包装类。
底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进行写入。字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,这为我们向IO设别写入或读取字符串提供了一点点方便。
字符向字节转换时,要注意编码的问题,因为字符串转成字节数组,
其实是转成该字符的某种编码的字节形式,读取也是反之的道理。
56、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用?
我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。
57、heap和stack有什么区别?
java的内存分为两类,一类是栈内存,一类是堆内存。
栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
58、GC是什么? 为什么要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
59、垃圾回收的优点和原理。并考虑2种回收机制。
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
60、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。
垃圾回收器可以马上回收内存,程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
61、java中会存在内存泄漏吗,请简单描述。
所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。由于Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。
java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。
未完待续...