https://github.com/gzc426/Java-Interview

 

Java基础

八种常见数据类型:byte、short、int、long、float、double、boolean、char。

转换规则:从存储范围小的类型到存储范围大的类型。

具体规则为:byte→short(char)→int→long→float→double

转换规则:强转

具体规则为:double→float→long→int→short(char)→byte

 

1、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 +=1;有什么错?

 答:对于short s1=1;s1=s1+1来说,在s1+1运算时会自动提升表达式的类型为int,那么将int赋予给short类型的变量s1会出现类型转换错误。

 对于short s1=1;s1+=1来说 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

 

 2、char类型变量能不能储存一个中文的汉子,为什么?

char类型变量是用来储存Unicode编码的字符的,unicode字符集包含了汉字,所以char类型当然可以存储汉字的,还有一种特殊情况就是某个生僻字没有包含在unicode编码字符集中,那么就char类型就不能存储该生僻字。

 

 3、Integer和int的区别

int是java的8种内置的原始数据类型。Java为每个原始类型都提供了一个封装类,Integer就是int的封装类。

int变量的默认值为0,Integer变量的默认值为null,这一点说明Integer可以区分出未赋值和值为0的区别,比如说一名学生没来参加考试,另一名学生参加考试全答错了,那么第一名考生的成绩应该是null,第二名考生的成绩应该是0分。关于这一点Integer应用很大的。Integer类内提供了一些关于整数操作的一些方法,例如上文用到的表示整数的最大值和最小值。

 

 4、switch语句能否作用在byte上,能否作用在long上,能否作用在string上?

 byte的存储范围小于int,可以向int类型进行隐式转换,所以switch可以作用在byte上

 long的存储范围大于int,不能向int进行隐式转换,只能强制转换,所以switch不可以作用在long上

 string在1.7版本之前不可以,1.7版本之后switch就可以作用在string上了

 

5.是否存在 x>x+1?为什么?

  这就是临界值,当x=最大值  时; 再加1(根据二进制运算+1)就超过了它的临界值,刚好会是它最小值。  

举个例子吧,byte  8位, -128 ~ 127    

127  二进制: 0111 1111

1 二进制 :     0000 0001

相加结果:     1000 0000

byte  8位 有符号,   1000 0000  刚好 为  -128

 

String和StringBuffer/StringBuilder的区别:

StringBuffer:是线程同步;安全;效率低;建议多线程用;

StringBuilder:是线程不同步;不安全;效率高;建议单线程用;

首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

(一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞)

  3. 总结一下 

   String:适用于少量的字符串操作的情况

   StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

   StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

 

参考:https://www.cnblogs.com/weibanggang/p/9455926.html

 

Object的方法/EQUALs和==的区别:

我们比较无非就是这两种 1、基本数据类型比较  2、引用对象比较
  1、基本数据类型比较
  ==和Equals都比较两个值是否相等。相等为true 否则为false;
2、引用对象比较
  ==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false;
需注意几点:
  1、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;
  2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。
  所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;
  3、基本数据类型比较(string 除外) == 和 Equals 两者都是比较值;

在String中 equals方法被重写 当物理地址不同时,会进一步比较值

参考:https://www.cnblogs.com/mike-mei/p/7818713.html

 

Integer a = new Integer(100);
Integer b = new Integer(100);
a == b

Integer a = new Integer(100); Integer b = new Integer(100);

a == b 这个是false

Integer a = 100; Integer b = 100;

a == b 这个是true

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐