Java语法面试题
1、String是最基本的数据类型吗?【string和stringbuffer单独用来一天的时间在讲,常用API部分】
不是,
基本数据类型包括:byte,short,int,long,float,double,boolean,char.
而String是类代表字符串,属于引用类型,所谓引用类型包括:类,接口,数组...
2、string和stringBuilder、StringBuffer的区别?
(1)第一点就是执行速度
string是字符串常量,对string对象进行的操作实际上就是一个不断创建新的对象并将旧的对象回收的一个过程
stringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对对象进行更改,而不进行创建和回收的操作,所以要比string快。
{正是因为StringBuffer是线程安全的所以它才比stringBuilder跑的慢,因为需要判断锁对象,获取锁对象,释放锁对象操作}
(2)第二点就是是否线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
StringBuilder是线程不安全的,而StringBuffer是线程安全的。
因为StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
(3)总结一下
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
面试补充:
string和stringbuffer有什么区别?操作几个string变量连接具体是怎么操作的?
问题一:
string是字符串常量,对string对象进行操作实际上就是一个不断创建新对象并将就对象回收的一个过程。
stringbuffer是字符串变量,长度是可变的,对变量进行操作就是直接对对象进行更改,不进行创建和回收,所以要比string快
问题二:
字符串拼接问题
情况一:字符串常量的拼接
String str3="hello"+" word!";
String str4="hello word!";
System.out.println(str3==str4);
//运行结果:true
原因:JVM编译器对字符串做了优化,在编译时str3就已经被优化成“hello Word!”,str3和str4指向字符串常量池同一个字符串常量,所以==比较为true。
情况二:字符串+字符串变量、字符串变量之间的拼接。
String str1="hello";
String str2=" word!";
String str3="hello word!";
String str4=str1+"word!";
System.out.println(str3==str4);
//运行结果为false
原因:字符串拼接时如果有字符串变量参与拼接,底层调用了StringBuffer可变字符串处理。代码如下
StringBuffer sb=new StringBuffer("");
sb.append(str1);
sb.append("word!");
str4= sb.toString();
//StringBuffer的toString()方法底层new了一个String对象,所以str4在堆内存中重新开辟了空间,
//str3指向常量池,所以为false
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。
private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
char[] value;
(1)首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
(3) 是否线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
2、float f = 3.4是否正确
笔试时经常会出现的一个问题,float型float f=3.4是否正确
答案:不正确。
原因:精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4 或float f = 3.4f
在java里面,没小数点的默认是int,有小数点的默认是 double;
编译器可以自动向上转型,如int 转成 long 系统自动转换没有问题,因为后者精度更高
double 转成 float 就不能自动转了,所以后面的加上个 f;
3、java语言中有没有goto关键字?
goto是java语言中的保留字,目前还没有在java中使用。C语言中使用。
4、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
各种数据类型按照数据范围从小到大依次列出:
byte -> short -> int -> long -> float -> double
自动类型转换
表示范围小的数据类型转换成范围大的数据类型,这种方式称为自动类型转换
自动类型转换格式:
范围大的数据类型 变量 = 范围小的数据类型值;
强制类型转换
表示范围大的数据类型转换成范围小的数据类型,这种方式称为强制类型转换
强制类型转换格式:
范围小的数据类型 变量 = (范围小的数据类型) 范围大的数据类型值;
5、int和Integer的区别
1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0
6、Java中三种长度表现形式
数组.length 属性 返回值 int
字符串.length() 方法,返回值int
集合.size()方法, 返回值int
7、&和&&区别
& 不管前面的条件是否正确,后面都执行
&& 前面条件正确时,才执行后面,不正确时,就不执行,就效率而言,这个更好。
&&”是逻辑运算中的“短路”,若"&&"前的条件为false时判断结果为false,不再执行"&&"后的语句块。"&&"前为true则继续进行进行后半部分的判断 。
8、switch能作用的类型
在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。
在Java7中,也支持了String类型。不支持Long类型,long类型转成int类型,可能得不到精确值,但是byte、short、char都可以转成int,并且得到的数没有损失。
9、Math.round(x)
返回值
与 x 最接近的整数。
说明
对于 0.5,该方法将进行上舍入。
例如,3.5 将舍入为 4,而 -3.5 将舍入为 -3。
10、程序注释
单行注释 //注释内容
多行注释 /注释内容/
文档注释 /*注释内容/
11、标识符
不能使用关键字。不能以数字开头
12、数据类型
数据类型.png常量
整数类型
十进制表示方式:正常数字 如 13、25等
二进制表示方式:以0b(0B)开头 如0b1011 、0B1001
十六进制表示方式:以0x(0X)开头 数字以0-9及A-F组成 如0x23A2、0xa、0x10
八进制表示方式:以0开头 如01、07、0721
小数类型
如1.0、-3.15、3.168
布尔类型
true、false
字符类型
如'a','A', '0', '家'
字符必须使用’’ 包裹,并且其中只能且仅能包含一个字符。
字符串类型
字符串String类型是一种引用类型,我们先了解作为常量类型的使用方式
如“我爱Java”,“0123”,“”,“null”
字符串必须使用“”包裹,其中可以包含0~N个字符。
13、break、continue、return的区别
break:【break用于完全结束一个循环,跳出循环体。如果break语句包含在嵌套循环里,它只跳出最里面的循环。】此语句导致程序终止包含它的循环,并进行程序的下一阶段(整个循环后面的语句),即,不是跳到下一个循环周期而是退出循环。如果break语句包含在嵌套循环里,它只跳出最里面的循环。
continue:continue的功能和break有点类似,区别是continue只是中止本次循环,接着开始下一次循环。而break则是完全中止循环。
return:return的功能是结束一个方法。 一旦在循环体内执行到一个return语句,return语句将会结束该方法,循环自然也随之结束。与continue和break不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。
14、Java中是否可以继承String类,为什么
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。
15、方法重载和重写的区别
方法重写(overriding):
1、也叫子类的方法覆盖父类的方法,要求返回值、方法名和参数都相同。
2、子类方法抛出的异常不能超过父类相应方法抛出的异常。(子类异常不能超出父类异常)
3、子类方法的的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
方法重载(overloading):
重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同(个数或者类型),方法体也不相同,最常见的重载的例子就是类的构造函数,
重载Overloading是一个类中多态性的一种表现。
重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。