java基础及面试题(1.1)

这里是对应java基础及面试题(1.0)的重要面试题

1 、对于java类型变量char c,short s,float f,double d,表达式c*s+f+d的结果类型为double

往精度高的转,整数的默认类型是int,小数默认类型是double。byte,short,char-> int -> long -> float -> double.依次是自动类型提升。

2、long为什么到float不用强转??

long到float不用强转,因为float表示的范围确实比long表示的范围大,虽然它只占4个字节,而long占8个字节,float是用科学记数法来表示数据的,long是用二进制表示的。所以两者单纯用字节长度来比较他们表示数据范围是没有可比性的。

3、问题:float f= 3.14;编译报错,3.14默认为double,double转float要强转,float f = 3.14f;才是对的/强转;

                 整型默认为int,int转short为什么不报错,即为什么short b = 2;没有报错。

我们知道隐性转换一般都是放宽转换(如byte到int,int到long等,都是小的赋给大的。)但是却有一个例外就是,在赋值转换中, 隐性转换也包含了缩窄基本转换。就是从int到byte,char,short的转换(只要不超出其范围):

比如:

byte b=1;//合法

byte b=128; //非法(超出byte的范围)

char和short都是同理的。

这是一种特殊情形,如果直接把一个在byte或short/char类型的表数范围内的整数值赋给一个byte或short变量,系统会自动把这个整数值当成byte或short/char类型处理~(即char,byte,short只要在其表示范围内直接赋值系统会当成char,short,byte来处理)

总结:在左边是char、byte、short,右边是整数值的情况,只要右边的整数值不超过左边表示的范围,系统则会把这个值当成是右边对应的类型。

各个数据类型

4、int没给赋值时,默认值是多少?boolean?String?float?对象?

各个数据类型对应的默认值

5、字符串和其他类型相加转换问题(+号两边如果有一边为字符类型  则为字符串连接)

string+int+int  :先int转为string然后相加:string+string+int------string+int----string+string-----string

int+int+string+int : int+string+int------string+string+int----string+int----string+string----string

6、字符类型(char)进行算数运算,运算的是ASCII码,

ch1 = 'D' + '8' - '3';  ch2 = '9' - '1';

'D'->68;'8'->56;'3'->51

7、a++、++a的运算

public void test() {       

int a = 10;        

System.out.println(a++ + a--);   

}

a++ 先把10赋值给a 再+1 所以左边是10, 但此时a=11。右边a--也是先赋值 a=11,再-1。10+11=21此时a=10。

8、基本类型之间的比较,应该会将低精度类型自动转为高精度类型再比较。

public staticvoid main(String[] args){       

int i=42;        double d=42.0000;        long l=42;        float f=42.0f;        float f2=42.00f;        System.out.println(d==i);       

System.out.println(f==i);       

System.out.println(f==f2);       

System.out.println(l==i);       

System.out.println(d==f);   

}

结果:truetruetruetruetrue

两个数值进行二元操作时,会有如下的转换操作:

如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。

    否则,如果其中一个操作数是float类型,另一个将会转换为float类型。

        否则,如果其中一个操作数是long类型,另一个会转换为long类型。

            否则,两个操作数都转换为int类型。

9、整型转换计算问题:

byte b1=1,b2=2,b3,b6,b8;

final byte b4=4,b5=6,b7;

b3=(b1+b2);  /*语句1*/

b6=b4+b5;    /*语句2*/

b8=(b1+b4);  /*语句3*/

b7=(b2+b5);  /*语句4*/

System.out.println(b3+b6);

下列代码片段中,存在编译错误的语句是()  A语句2,  B 语句1  ,C  语句3,  D  语句4

--------------解析--------------

语句1错误:b3=(b1+b2);b1和b2两个byte自动转为int,所以正确写法为b3=(byte)(b1+b2);或者将b3定义为int;

语句2正确:b6=b4+b5;b4、b5为final类型,不会自动提升,所以和的类型视左边变量类型而定,即b6可以是任意数值类型;

语句3错误:b8=(b1+b4);虽然b4不会自动提升,但b1仍会自动提升,所以结果需要强转,b8=(byte)(b1+b4);

语句4错误:b7=(b2+b5); 同上。同时注意b7是final修饰,即只可赋值一次,便不可再改变。 

------------知识点------------(左右运算其实是分两步,先运算右,再将右的赋给左边,而根据运算规则如下,左边运算会的到一个类型,当右边运算完后的类型和左边的不同时需要进行转换)(右边高于左边要强转低于则不用)

Java表达式转型规则由低到高转换

1、所有的byte,short,char型的值将被提升为int型;

2、如果有一个操作数是long型,计算结果是long型;

3、如果有一个操作数是float型,计算结果是float型;

4、如果有一个操作数是double型,计算结果是double型;

5、被fianl修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化。

10、整型等常量池问题

1)、Integer  i01=59;

2)、int i02=59;

3)、Integer  i03=Integer.valueOf(59);

4)、Integer  i04=new Integer(59);

则下面哪些正确:

System.out.println(i01==i02);//正确

System.out.println(i01==i03);//正确,都指向IntegerCache[59-(-128)]对象

System.out.println(i03==i04);//错误,引用指向的对象地址不同

System.out.println(i02==i04);//正确

第一行:由于59在-128~127范围之内,所以在自动装箱的时候,会返回IntegerCache[59 - (-128)];

第三行:同第一行

第四行:因为有new关键字,所以在heap中开辟了一块新内存放置值为59的Integer对象。

(用new就一定是再创建一个对象,则i04是指向一个对象该对象内容59,其他是直接指向常量池的59)

    Integer.valueOf方法中也有判断,如果传递的整型变量>= -128并且小于127时会返回IntegerCache类中一个静态数组中的某一个对象(即常量池中的)

    不止整型有常量池:Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127并且大于等于-128时才可使用常量池,因为他们只占用一个字节(-128~127); 

11、String常量池

12、运算符优先级问题:

boolean b=true?false:true==true?false:true;

System.out.println(b);

==  优先级高于 三目运算符,先判断   true ==true,此时返回为true,

这时表达式为boolean b =true?false:true?false:true

此时三目运算符从右向左执行,true?false:true,返回false

这时表达式为boolean b = true?false:false;

结果为:boolean b = false

int i = -5;

i =  ++(i++);会编译错误  

 ++i和i++中i不能用字面量(具体数据)代替。(++i)++也是错的

++(i++),i++先返回一个数值-5,此时为++(-5)则会报错

13 关于null和NULL区别及用法

null是java中的关键字,NULL不是关键字,区分大小写

null的用法

一、null是代表不确定的对象

Java中,null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。

比如:int a = null;是错误的。Ojbect o = null是正确的。

Java中,变量的适用都遵循一个原则,先定义,并且初始化后,才可以使用。我们不能int a后,不给a指定值,就去打印a的值。这条对对于引用类型变量也是适用的。

有时候,我们定义一个引用类型变量,在刚开始的时候,无法给出一个确定的值,但是不指定值,程序可能会在try语句块中初始化值。这时候,我们下面使用变量的时候就会报错。这时候,可以先给变量指定一个null值,问题就解决了。例如:

Connection conn = null;

try {

conn = DriverManager.getConnection("url", "user","password");

} catch (SQLException e) {

e.printStackTrace();

}

String catalog = conn.getCatalog();

如果刚开始的时候不指定conn = null,则最后一句就会报错。

二、null本身不是对象,也不是Objcet的实例

null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。

可以做一个简单的例子:

//null是对象吗? 属于Object类型吗?

if (null instanceof java.lang.Object) {

System.out.println("null属于java.lang.Object类型");

} else {

System.out.println("null不属于java.lang.Object类型");

}

结果会输出:null不属于java.lang.Object类型

三、Java默认给变量赋值

在定义变量的时候,如果定义后没有给变量赋值,则Java在运行时会自动给变量赋值。赋值原则是整数类型int、byte、short、long的自动赋值为0,带小数点的float、double自动赋值为0.0,boolean的自动赋值为false,其他各供引用类型变量自动赋值为null。

这个具体可以通过调试来看。

四、容器类型与null

List:允许重复元素,可以加入任意多个null。

Set:不允许重复元素,最多可以加入一个null。

Map:Map的key最多可以加入一个null,value字段没有限制。

数组:基本类型数组,定义后,如果不给定初始值,则java运行时会自动给定值。引用类型数组,不给定初始值,则所有的元素值为null。基本类型数组不给初值则为0/flase等

基本类型数组: 

byte[],short[],int[] ,

默认值为0, 

boolean[]

默认值为false

float[],double[],

默认值为0.0对象类型数组:默认值为null

五、null的其他作用

1、判断一个引用类型数据是否null。 用==来判断。

2、释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM垃圾回收机制去回收。

14、一些整型的api运用

设有下面两个赋值语句:

a =Integer.parseInt("1024");

b =Integer.valueOf("1024").intValue();

intValue()是把Integer对象类型变成int的基础数据类型; 

parseInt()是把String 变成int的基础数据类型; 

Valueof()是把String 转化成Integer对象类型;(现在JDK版本支持自动装箱拆箱了。)

本题:parseInt得到的是基础数据类型int,valueof得到的是装箱数据类型Integer,然后再通过valueInt转换成int

int i=Integer.parseInt(”123a”);

将产生NumberFormatException 数字转换异常  parseInt方法中的字符串需要是纯数字 

15、

int a=257;    Integer b=257;    Integer c=257;    Integer b2=57;    Integer c2=57;

System.out.println(a==b);

//System.out.println(a.equals(b));  编译出错,基本类型(要是对应的包装类)不能调用equals()

System.out.println(b.equals(257.0));

System.out.println(b==c);

System.out.println(b2==c2);

1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;

2、两个Integer类型进行“==”比较,如果其值在-128至127内并相等,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。

3、两个基本型的封装型进行equals()比较,原生的equals底层代码是==(自己重写的才是先类型、值、==等。==比较的是内存地址,而重写的equals比较的的是内容),返回true

4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

因此上面的代码的结果因此为true, false, false, true

j(包装类型)和i(基本数据类型)==比较,会先将包装类型的j转换成基本数据类型进行比较,此时i=0,在-128~127的范围所以两者的地址指向一样即j==i为true;

16、

语句:char foo='中',是否正确?(假设源文件以GB2312编码存储,并且以javac – encoding GB2312命令编译)

Java语言中,中文字符所占的字节数取决于字符的编码方式,一般情况下,采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节;

采用GB2312或GBK编码方式时,一个中文字符占2个字节;而采用UTF-8编码方式时,一个中文字符会占3个字节。

在C++中,char是基础数据类型,8位,1个字节。byte不是基础数据类型,一般是typedef

unsigned char byte;这样子的,也就是说,byte其实是unsigned

char类型,那么也是8位,1个字节。不同的是,char可以表示的范围是-128-127,而byte可以表示的范围是0-255。

在Java中

在java中,char和byte都是基础数据类型,其中的byte和C++中的char类型是一样的,8位,1个字节,-128-127。但是,char类型,是16位,2个字节, '\u0000'-'\uFFFF'。

为什么java里的char是2个字节?

因为java内部都是用unicode的,所以java其实是支持中文变量名的,比如string世界 = "我的世界";这样的语句是可以通过的。

综上,java中采用GB2312或GBK编码方式时,一个中文字符占2个字节,而char是2个字节,所以是对的

17、请你说明一下,在Java中如何跳出当前的多重嵌套循环?

ok:for(int i=0;i<10;i++){

for(intj=0;j<10;j++)

{system.out.println("i="+i+",j="+j);

if(j==5)             break ok;

}

}

在最外层循环加一个标记如ok,然后break ok可以退出多重循环,java支持带标签的break和continue语句,类似于c++的goto但应避免使用,

使用时基本不能进行字符串的equals比较,否则会出现NullPointerException异常。建议少用增加可读性及安全性。

18、&和&&的区别?

&有两种运算:逻辑与、按位与。

&&:短路与运算

逻辑与:左右t,整句t;左f依然执行右;

短路与:左f右短路不执行;左右t,整句t;

很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null

&&!username.equals(""),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。

19、一些补充的知识点

Java 为每个原始类型提供了包装类型:

- 原始类型: boolean,char,byte,short,int,long,float,double

- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

基本数据类型包括byte、int、char、long、float、double、boolean和short。

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类(多线程,大量字符串,线程安全,可修改)。StringBuilder(单线程,大量,线程不安全,可修改),String(较少,不可修改)。StringBuffer常用,StringBuilder少用。

Double d=100;整数默认是int类型,int类型不能转型为Double,最多通过自动装箱变为Integer但是IntegerDouble没有继承关系,也没法进行转型。

此时可以把Double包装类换成基本类型double则可以从int转为double。(基本类型可以转换(低精度转高精度不用写强转代码,高转低要写),包装类不能转)

byte的取值范围是-128—127 

布尔类型不能强转成其他数值类型。

Java标识符由数字、字母、下划线(_)、美元符号($)或人民币(¥)组成,首位不能是数字。并且Java关键字不能作为标识符

null表示没有地址;null可以赋值给引用变量,不能将null赋给基本类型变量,例如intdoublefloatboolean(基本类型默认是0,引用类型默认是null,局部变量要初始化不然会报错)

发布了8 篇原创文章 · 获赞 1 · 访问量 162

猜你喜欢

转载自blog.csdn.net/qq_35599414/article/details/104972423