1、面向对象(OO)的优点
A.与人类的思维习惯一致
B.信息隐藏,提高了程序的可维护性和安全性
C.提高了程序的可重用行
2. 通常什么情况下使用数组?使用数组的好处是什么?
- 当需要储存或者在处理一系列数据的时候可以使用数组。
好处:
- 一组变量具有相同的名字,相同的数据类型,并且在存储器中连续存放可以使用数组。使用数组可以快速简单的处理大量变量。(方便查询和修改)
3、数组基本要素
- 标识符(数组的名称,用于区分不同的数组)
- 数组元素(向数组里面存放数据)
- 元素下标(对数组元素进行编号,从0开始,数组中的每个元素都可以通过下标进行访问)
- 元素类型(数组元素的数据类型)
4、如何使用数组?(四步)
- 声明变量
- 分配空间
- 赋值
- 处理数据
5、通常什么情况下使用数组?如何定义一个int数组?
- 需要储存或者运算大量同类型的数据时可以采用数组。
A.数据类型 数组名[];
B.数据类型[] 数组名;
6、数组实例化有几种方式?
实例化:定义或者声明一个变量,但是不赋值
初始化:在实例化的基础上,进行复制。
Int a[];
int[] a;
Int []a = new int[5];
7、怎样引用一个数组中的元素?如何为数组元素赋值?
- 通过数组下标来调用数组当中的元素,下标从零开始
例如:
A.int[] score = {98,85,65};
B.Int[] score = new int[]{98,85,65};
C.通过for循环以及数组的下标,对其意义进行赋值
8、break和continue的区别是什么?
1.break 常用于switch结构和循环当中。
2. continue 一般用于循环结构当中。
1.break语句种植某个循环,程序跳转到循环块外的下一条语句
2.continue跳出本次循环,进入下一次循环
9、自动类型转换规则是什么?强制类型转换规则是什么?(什么是隐式转换,什么是显式转换?)
自动转换:
1.低级别的可以自动转换为 高级别的
2.满足自动类型转换的条件,两种类型要兼顾。数据类型(整型和浮点型),互相兼容,目标类型大于原类型 例如double > int
强制类型转换规则:
将高级别类型赋值给第级别类型时。(需要进行添加强制转换目标的类型)
比如:
double a = 5.2;
int b,c = 5 ;
b = (int)a;//强制转换
c = a;//自动转换
10、switch选择结构的表达式可以是哪些数据类型?
Int char byte short (枚举) String
其中String类型的需要这样用,如图:
11、举例说明,循环结构用于解决哪些问题?
循环用于解决步骤重复,运算量大的问题,简单例子,求叠加!
12、程序调试有哪些步骤?
- 先对相应的代码行上双击打上断点,然后用debug模式启动这个程序,程序在执行到断点代码行时会停止,然后可以根据对应的操作,执行下一行代码等等来发现程序在执行到哪一行代码时出错,为什么出错。
- 查看每一步程序执行过后的,变量的变化,以来判断程序哪里出现问题。
13、===三个等号和两个等号的区别?
“==”时判断值是否相等(如果一个值是null,另一个值是undefined,它们相等。)
=== 判断的是值及类型是否完全相等(如果两个值都是null或都是undefined,它们完全相同)
14、Java定义的常用数据类型有哪些?
- byte:8 位,用于表示最小数据单位,如文件中数据,-128~127
- short:16 位,很少用,-32768 ~ 32767
- int:32 位、最常用,-231-1~231
- long型数据后面加 L或
l,可省略,长整型,在内存中占64位,即8个字节-263~263-1,默认值0L两种浮点数类型(float、double): - float:32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。
- double:64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾。
- char:16 位,是整数类型,用单引号括起来的 1 个字符(可以是一个中文字符),使用 Unicode 码代表字符,0~2^16-1(65535)
- true 真 和 false 假。
引用数据类型:类(class)、接口(interface)、数组【】、枚举、注释
15、Java中各种数据默认值?
- 对于short,int,long,byte而言,创建数组的默认值是0;
- 对于float double而言,默认值是0.0;
- 对于char类型数组的默认值是空格null(\u0000);
- boolean类型数组的默认值是false;
- 引用类型数组的默认值是null。
- String的默认值是null;
16、常用的逻辑运算符及其作用?
&& 逻辑与
|| 逻辑或
!逻辑非当表达式进行&&运算时,只要有一个为假,总的表达式就为假. 只有当所有都为真时,总的式才为真.
当表达式进行||运算时,只要有一个为真,总的值就为真. 只有当所有的都为假时,总的式子才为假.
逻辑非(!)运算是把相应的变量数据转换为相应的真/假值.
17、怎么判断键盘输入为非整数?
用if判断,其中用input.hasNextInt()方法去判断输入的是否为整数。
18、什么是变量?如何定义?
- 变量是程序运行过程中它的值是允许改变的量。
- 变量定义:定义必须严格按照标识符的命名规则,即0~9数字、字母、下滑线、$等组成,且首字母不能是数字、不能是java关键字。
变量格式为[访问修饰符][修饰符]数据类型 变量名[=初始值]。
19、举例说明什么是类,什么是对象?类与对象的关系是什么?
- 比如:前边有一群狗,都有4条腿,都会跑会叫,都有颜色
- 类:将一群狗共有的属性(4条腿,颜色),行为(跑,叫),放在一起
- 对象:就是其中的一条狗,调用类中共有的属性和方法,去看什么颜色,几条腿,会做什么
- 类与对象的关系:
类是抽象的概念,仅仅是模板
对象是一个你能够看得到、摸得着的具体实体
类是对象的类型,对象是类的实例
20、如何创建和使用对象?
.创建对象 类名 对象名 = new 类名();
例如: School student = new School();
.使用对象:
1.通过对象引用对象成员:使用“.”进行操作
2.引用类的属性:对象名.属性
3.引用类的方法:对象名.方法名()
例如:
center.name = "北京中心"; //给name属性赋值
center.showCenter(); //调用showCenter()方法
21、成员变量和局部变量的区别有哪些?
- 作用域不同:
A.成员变量在整个类内都是可见的
B.局部变量仅限于定于它的方法内
- 初始值不同:
A.会为成员变量赋初始值
B.不会为局部变量赋初始值
在同一个类中,成员变量和局部变量同名时,局部变量具有更高
22、方法的返回值有几种?分别是哪些?
- 可以返回八大基本数据类型;
- 可以返回八大基本数据类型对应的数组,以及集合对象;
- 可以返回java类的对象;
- 可以返回String
如果方法具有返回值,方法中必须使用关键字return返回该值, 返回值类型为该返回值的类型
如果方法没有返回值,返回值类型为void
23、调用带参方法时,有哪些注意事项?
1.注意方法的修饰符 有 private public static 包级别的transient;
2.注意方法的返回值;
3.注意方法的参数的个数,和类型,以及是否重载;
4.注意方法是否抛出了异常;
24、静态方法和实例方法两者的区别:
25、基本数据类型的final特征
- final修饰符可以修饰静态变量、实例变量和局部变量,分别表示静态常量、实例常量和局部常量。
- final类型的变量必须显式地初始化,否则将导致编译错误。
- final变量只能被赋值一次。
- 在定义final常量时,一般以大写字母命名,且多个单词之间使用下划线“_”隔开
语法:
final int MAX_VALUE=1000;
final int MIN_VALUE=0;
26、Java中创建一个String对象有哪几种方法?
String s1 = "abc";
String s2 = new String("abc");
第一种方法,仅仅是一个赋值语句
第二种方法会在内存中创建1个对象。把 new String(“abc”) 这句话拆成两个部分来看,一个是”abc”, 另一个是 new String()。
27、String对象与StringBuffer对象的区别有哪些?
- String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象;
- StringBuffer类对象为可修改对象,每次返回的都是原对象,可以通过append()方法来修改值
- String类对象的性能远不如StringBuffer类。
28、把基本数据类型转换为字符串有几种方法?
- toString先把基本数据类型装箱,再用对象的toString()方法
- String类的valueOf方法,这是一个静态方法,几乎可以把各种类型转换为字符串String.valueOf();注意区别包装类的valueOf方法,那个也是静态方法,返回的是包装类型。
- 加一个空字符串“”来实现自动转型
29、break和continue语句的区别是什么?
- break作用于循环语句和switch语句,continue作用于循环语句。
- 当break和continue都作用于循环语句时,break语句将无条件跳出并结束当前的循环结构 ,continue语句是结束此轮循环和开始新的一轮循环 。
30、成员变量和局部变量的区别有哪些?
- 在类中位置不同:
成员变量:在类中方法外。
局部变量:在方法定义中或者方法声明上。 - 在内存中的位置不同:
成员变量:在堆内存。
局部变量:在栈内存。 - 生命周期不同:
成员变量:随着对象的创建而存在,随着对象的消失而消失。
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失。 - 初始化值不同:
成员变量:有默认值初始化。
局部变量:没有默认值初始化,必须定义,赋值,然后才能使用。
31、阐述静态变量和实例变量的区别?
- 语法上: 静态变量需要static修饰,实例变量不需要。
- 静态变量从属于类,实例对象从属于对象
- 实例变量必须创建实例对象后,才会被分配空间,才能够使用。
- 静态变量也为类变量,只要程序运行,生成类的字节码,就会被分配空间,就可以使用。
- 实例变量必须创建对象后,通过这个对象来使用;静态变量直接类名来引用。
32、静态方法和实例方法两者的区别:
- 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有"对象名.方法名"的方式。也就是说,调用静态方法可以无需创建对象。
- 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
33、static修饰与非static修饰的区别?(从属性、方法、调用方式、归属 叙述)
- 当修饰变量时,static是类变量,只能修饰成员变量,不能修饰局部变量。
- Static修饰的方法只能调用静态方法和静态变量。非static修饰的方法则没有这个限制。
- 调用Static方法或变量时可以通过类名.调用也可通过对象.调用。非static方法或变量只能通过对象.调用。
- Static修饰的方法或变量属于类,而非static修饰的属于对象
34、什么是封装?用封装好处是什么?
- 封装是将类中某些信息隐藏在类内部,不允许外部程序直接访问,通过该类中的方法来实现对隐藏信息的访问和操作。
好处:
1、隐藏类实现的细节。
2、只能通过规定的方法访问数据。
3、方便加入控制语句
4、方便修改实现
35、封装的步骤有哪些?(三步)
1、修改属性的可见性
2、创建setter和getter方法
3、在setter或getter中加入属性控制语句
36、什么时候用this?this调用构造方法应注意什么?
1、在一个类方法中当局部变量和成员变量同名时,利用this来访问成员变量。
2、在本类的构造方法或方法中使用。
- 注意:
1、构造方法只能在构造方法中调用,并且需要把 this放在另一个构造方法的第一句。
2、两个构造方法不能同时调用。
37、什么是继承?有哪些特点?
- 继承就是子类继承父类的特征【属性】和行为【方法】,使得子类具有父类部分(父类的私有属性或方法不能继承)相同的行为与特征。
特征:
- 继承是代码重用的一种方式
- 将子类共有的属性和行为放到父类中
- 符合is-a关系(例如猫是一种动物)的设计使用继承
38、实现多态的三要素是什么?为什么要使用多态?实现多态的两种形式是什么?
三要素:
继承
重写
父类引用指向子类对象
为什么使用多态(多态的好处):
- 使用多态可以减少类中代码量
- 提高代码的可扩展性和可维护性
实现多态的两种形式:
- 使用父类作为方法形参实现多态(形参)
- 使用父类作为方法返回值实现多态(返回值)
39、请说明final的用途?
- 被final修饰的类不可以被继承
- 被final修饰的方法不可以被重写
- 被final修饰的变量不可以被改变
40、ArrayList和Vector的区别?
这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的,这是与HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素。
- (1)同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
- (2)数据增长:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
总结:即Vector增长原来的一倍,ArrayList增加原来的0.5倍。
41、ArrayList和LinkedList的区别?
- ArrayList和LinkedList两者都实现了List接口
- ArrayList是由Array所支持的基于一个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。所以,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引的节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。(检索目标元素,Linkedlist比较慢)
- 与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快,因为在一个元素被插入到中间的时候,不会涉及改变数组的大小,或更新索引(插入,删除等操作LinkedList比较快)
- LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。(LinkedList占用内存较大)
42、abstract class和interface有什么区别?(至少说出5个)
- 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
- 抽象类要被子类继承,接口要被类实现。
- 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
- 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
- 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
- 抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
- 抽象类里可以没有抽象方法
- 如果一个类里有抽象方法,那么这个类只能是抽象类
- 抽象方法要被实现,所以不能是静态的,也不能是私有的。
- 接口可继承接口,并可多继承接口,但类只能单根继承。
43、Array和ArrayList有何区别?什么时候更适合用Array?
- Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
- Array指定大小的,而ArrayList大小是固定的。
- Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。
- 如果列表的大小已经指定,大部分情况下是存储和遍历它们。
- 对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。
- 如果你要使用多维数组,使用[][]比List<List<>>更容易。
44、集合与数组的区别
- 数组是固定长度的;集合可变长度的。
- 数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型(包装类)。
- 数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。
45、Collection和Collections的差别
- java.util.Collection是一个集合接口,Collection接口在Java类库中有非常多详细的实现。比如List、Set
- java.util.Collections 是针对集合类的一个帮助类,它提供了一系列的静态方法实现对各种集合的搜索、排序、线程安全化等操作。
46、 HashMap和Hashtable的区别
- HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。
- HashMap允许键和值是null,而Hashtable不允许键或者值是null。
- Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
- HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。
- 另一方面,Hashtable提供了对键的列举(Enumeration)。一般认为Hashtable是一个遗留的类。
- 后两条可以简单的理解为:继承的父类不一样,以及HashMap内部含有containsKey方法,而Hashtable没有。(仅供参考)
47、 List与Map的差别
- List是存储单列数据的集合,Map是存储key和value这样双列数据的集合;
- List中存储的数据是有顺序的,而且同意反复;
- Map其中存储的数据是没有顺序的,它存储的key是不能反复的,value是能够反复的;
- List继承Collection接口,Map不是,Map没有父类。
48、Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
- Set 里的元素是不能重复的,用equals ()方法来区分重复与否。
- equals()方法用来判断对象的内容是否相同,而”==”判断地址是否相等,用来决定引用值是否指向同一对象。
49、GC是什么? 为什么要有GC? (基础)。你能保证 GC 执行吗?
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
不能,虽然你可以调用 System.gc() 或者 Runtime.gc(),但是没有办法保证 GC 的执行。
50、hashCode()和equals()方法有何重要性?
HashMap使用Key对象的hashCode()和equals()方法去决定key-value对的索引。
当我们试着从HashMap中获取值的时候,这些方法也会被用到。如果这些方法没有被正确地实现,在这种情况下,两个不同Key也许会产生相同的hashCode()和equals()输出,HashMap将会认为它们是相同的,然后覆盖它们,而非把它们存储到不同的地方。
同样的,所有不允许存储重复数据的集合类都使用hashCode()和equals()去查找重复,所以正确实现它们非常重要。equals()和hashCode()的实现应该遵循以下规则:
(1)如果o1.equals(o2),那么o1.hashCode() == o2.hashCode()总是为true的。
(2)如果o1.hashCode() == o2.hashCode(),并不意味着o1.equals(o2)会为true。
51、什么是线程调度?Java的线程调度采用什么策略?
线程调度指按照特定机制为多个线程分配CPU的使用权
线程优先级 (0-10)
52、在Java中wait()和sleep()方法的不同?
- 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。
- wait()需要被notify或者notifyAll进行唤醒,而且必须在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)和不需要唤醒。
- sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常 。
53、线程的基本状态及状态之间的关系?
54、多线程当中start()方法和run()方法的区别
- 只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。
- 如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码。
55、在Java中join()和yield()方法的不同?
- yield()礼让,必须在同一优先度。join()强制运行,与优先级没有关系。
- join方法是将主线程关闭,运行自己。yield变相的理解是降低自己的优先度(有可能礼让,也可能不礼让)
56、类继承Thread类和实现Runnable接口有什么不同
- 都需要对run方法进行重写。
- 在实现的时候不一样,Thread直接向上转型 创建线程。runnable是通过先建立Thread对象,在创建对象的时候进行传参(这个是线程类(自己写的)的对象)。
例:
Thread继承实现:
> Mythread thread = new Mythread();
> thread.start();
> runnable接口实现:
> Thread thread1 = new Thread(new Mythread(),"lxy");
> thread1.start();
- 在调用线程的时候,都是通过
57、error 和exception的区别
- Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等
- Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。(try…catch处理)
- 其中的Exception又分为检查性异常和非检查性异常。两个根本的区别在于,检查性异常 必须在编写代码时,使用try catch捕获(比如:IOException异常)。非检查性异常 在代码编写使,可以忽略捕获操作(比如:ArrayIndexOutOfBoundsException),这种异常是在代码编写或者使用过程中通过规范可以避免发生的。 切记,Error是Throw不是Exception 。
58、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
byte String(JDK1.7以上) 可以,另外还有short char 枚举 int
long不行,因为范围比int大,没有办法自动转型为int
59、默写一个饿汉式设计模式和懒汉式设计模式
饿汉式设计:
public class Singleton {
// 私有构造方法
private Singleton() {}
private static Singleton single = new Singleton();
// 静态工厂方法
public static Singleton getInstance() {
return single;
}
}
懒汉式设计:
public class Singleton2 {
// 私有构造方法
private Singleton2() {}
private static Singleton2 single = null;
public static Singleton2 getInstance() {
if(single == null){
single = new Singleton2();
}
return single;
}
}
60、 = a + b 与 a += b 的区别
+= 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。如果加法操作的结果比 a 的最大值要大,则 a+b 会出现编译错误,但是 a += b 没问题。
61、3*0.1 == 0.3 将会返回什么?true 还是 false?
false,因为有些浮点数不能完全精确的表示出来。
62、final、finalize 和 finally 的不同之处?
- final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。
- finalize 方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。
- finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。
63、Java 中堆和栈有什么区别?
JVM 中堆和栈属于不同的内存区域,使用目的也不同。
- 栈常用于保存方法帧和局部变量,而对象总是在堆上分配。
- 栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享
64、简述java内部类?
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:
成员内部类、局部内部类、匿名内部类和静态内部类。
65、什么事序列化?其作用是什么?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
66、泛型的本质是什么?泛型的存在是用来解决什么问题?
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率
67、什么情况下会发生栈内存溢出。
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
68、讲讲 JAVA 的反射机制
Java程序在运行状态可以动态的获取类的所有属性和方法,并实例化该类,调用方法的功能
69、创建一个对象用什么运算符?对象实体与对象引用有何不同?
new运算符,new创建对象实例(对象实例在堆内存中)。
对象引用指向对象实例(对象引用存放在栈内存中)。
一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);
一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)
70、String和StringBuilder、StringBuffer的区别?
- Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。
- 其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。
- StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。 StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰(非同步),因此它的效率也比StringBuffer要高。
71、简述Java中同步有几种实现方法。
- 1.synchronized关键字修饰的方法。
- 2.synchronized关键字修饰的语句块。
- 3.使用特殊域变量(volatile)实现线程同步
72、Java中如何获取string类型的当前日期?
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
java.util.Date time= sdf.parse(sdf.format(new Date()));