面试直击之javaSE复习day2

  • 简述一下java的跨平台原理

      由于个操作系统支持的指令集不是完全一致的,就会让我们的程序在不同的操作系统上要执行不同的代码,Java开发了适用于不同操作系统及位数的Java虚拟机来屏蔽不同系统之间的差异,提供统一的接口。对于Java开发者而言,只需要在不同的系统上安装对应的不同Java虚拟机,这时我们的Java程序只要遵循Java规范,就可以在所有的操作系统上面运行Java程序了。

总结:Java通过不同系统,不同版本,不同位数的Java虚拟机(JVM)来屏蔽不同系统指令集差异而对外提供统一的接口(Java API),对于我们开发者而言,只需要按照接口开发即可,如果我们的系统需要部署到不同环境上时,只需要在系统上面安装对应的虚拟机即可。

  •  为什么有了基本数据类型,还需要包装类型?

 每一个基本的数据类型都会对应一个包装类型。

装箱:把基本的数据类型转换为对应的包装类型。      

手动装箱:Integer.valueOf(1);

自动装箱:Integer i=1,实际上在编译时会调用Integer.valurOf()方法来装箱;

拆箱:把包装类型转换为对应的基本数据类型  。

手动拆箱:  int j=i.intValue();

自动拆箱:Integer i=1,int j=1;实际上编译时会调用intValue();

那么为什么需要包装类型呢?Java是一个面向对象的语言,而基本数据类型不具备面向对象的特性。

举个例子:Integer在表示为空时用null,int在表示为空时用0,当我们分别用Integer和int来表示Person这个类的ID,那么null就表示ID为空,而0则会发生歧义,0表示ID为0还是ID为空呢?这时就可以体现出包装类的重要性了。 

  • “==”和“equals”的区别

1. ==用来判断两个变量的值是否相等,变量分为基本数据类型和引用数据类型,如果是基本数据类型的变量直接比较值,如果是引用类型,则比较的是地址值。

2. equals:equals只适用于引用数据类型的比较,用来比较两个对象的内容是否相等。如果没有覆写equals方法,则比较的是对象的地址。 像String类,Date类,File类,以及包装类等都重写了Object类中的equals()方法,重写以后,比较的不是两个引用的地址是否相等,而是比较两个对象的“实体内容"是否相等。

总结:通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的”实体内容“是否相同,那么,我们就需要重写euqals()方法。

  • String,StringBuffer和StringBuilder的区别

 在Java中提供了三个类String,StringBuffer,StringBuilder来表示和操作字符串,字符串就是多个字符的集合。

1.String是内容不可变的字符串,底层使用了一个不可变的字符数组(final char[])

而StringBuffer和StringBuilder是内容可变的字符串,底层使用的是可变的字符数组(没有用final来修饰)

最经典的就是拼接字符串

1)String进行字符串拼接:String c="a"+"b";

2)StringBuffer或者StringBuilder进行字符串拼接

eg:StringBuilder sb=new StringBuilder();

       sb.append("a");

       sb.append("b");

因此拼接字符串不能使用String 进行拼接,要使用StringBuffer或者StringBuilder

2.StirngBuffer和StringBuilder的区别

StringBuffer是线程安全的,但是效率低;

StringBuilder是线程不安全的,但是效率高。 

  • java中的集合

 ①Java中的集合分为Collection(value)和Map(key-value)两种

②Collection分为List和Set两种

 List:有序的,可以重复的

Set:无序的,不可以重复的,根据equals和hashCode判断,也就是如果一个对象要存储在Set中,必须重写equals和hashCode方法

③List常用的有LinkedList和ArrayList

两者区别:ArrayList底层使用的是数组,LinkedList底层使用的是链表,数组具有索引,因此查询特定元素比较快,而插入,删除,和修改比较慢(数组在内存中是一块连续的内存空间,如果插入或者删除需要移动内存);

      链表不要求内存是连续的,在当前元素中存放下一个或者上一个元素的地址,查询时需要从头开始,一个一个的找,因此查询效率低,插入时不需要移动内存,只需改变引用指向即可,所以插入或者删除的效率高

使用场景:ArrayList适合使用在查询比较多,而插入和删除比较少的情况;

                  LinkedList适合使用在查询较少而插入和删除比较多的情况。

③Map常见的有hashMap和HashTable

两者区别:1)HashMap是可以把null作为key或者value的,而HashTable是不可以的

                  2)HashMap是线程不安全的,效率较高,而HashTale是线程安全的,效率较低

但是有时候我们想要线程安全又要效率高,因此后面又有了currentHashMap,通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。

 

你可能感兴趣的:(面试直击之javaSE复习day2)