Java面试精选1

1.Java中的基本类型包括byte,boolean,char,short,int,long,float,double,java.lang.String类是final类型,因此不能继承这个类,不能修改这个类。为了提高效率,节省空间,应该使用StringBuffer类

  String与StringBuffer的区别

  在Java中有3个类负责字符的操作

  (1)Character是进行单个字符操作

  (2)String对一串字符进行操作,不可变类(final类型,不能改变,不能被继承)

  (3)StringBuffer对一串字符进行操作,可变

 

  a.String

    a.1 是对象不是原始类型

    a.2 不可变对象,一旦被创建,就不能修改对象的值,对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去

   重新创建一个新的对象,赋给已有的String对象

    a.3 String是final类,不能被继承

 

  b.StringBuffer

    b.1 可变对象,对他修改时不会像String那样重新建立对象

    b.2 只能通过构造函数来建立  note  不能通过赋值符号对StringBuffer进行赋值  StringBuffer sb = new StringBuffer();

         sb = "welcome to here"  是错误的

    对象被建立后(通过构造函数创建StringBuffer类型对象),在内存中就会分配内存空间,并初始化保存一个null,修改StringBuffer对象时是调用它的append方法

         sb.append("hello");

    b.3 字符串连接操作中StringBuffer的效率要比String高

 

   String str = new String("welcome to");

   str += "here";

 

  jvm处理过程是通过建立一个StringBuffer,然后调用append(),最后将StringBuffer toString(),这样String的连接操作就比StringBuffer多出了一些附加操作,效率上要打折,《这是时间上》

  《空间上》由于String对象是不可变对象,每次操作String都会重新建立新的对象来保存新的值,这样原来的对象就没用了,没有变量引用原来的对象,就要被垃圾回收,这是要影响性能

 

  str += "here"

  等同于

  StringBuffer sb = new StringBuffer(str);

  sb.append("here");

  str = sb.toString();

 

 举个例子

 

看看以下代码:
26个英文字母重复加了5000次,

1.           String tempstr = "abcdefghijklmnopqrstuvwxyz";

2.           int times = 5000;

3.           long lstart1 = System.currentTimeMillis();

4.           String str = "";

5.           for (int i = 0; i < times; i++) {

6.               str += tempstr;

7.           }

8.           long lend1 = System.currentTimeMillis();

9.           long time = (lend1 - lstart1);

10.        System.out.println(time);

可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。
也就是46秒。
我们再看看以下代码

1.           String tempstr = "abcdefghijklmnopqrstuvwxyz";

2.           int times = 5000;

3.           long lstart2 = System.currentTimeMillis();

4.           StringBuffer sb = new StringBuffer();

5.           for (int i = 0; i < times; i++) {

6.               sb.append(tempstr);

7.           }

8.           long lend2 = System.currentTimeMillis();

9.           long time2 = (lend2 - lstart2);

10.        System.out.println(time2);

得到的结果为 16有时还是 0
所以结论很明显,StringBuffer的速度几乎是String上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。

 

所以上面直接利用"+"来连接String的代码可以基本等同于以下代码

1.           String tempstr = "abcdefghijklmnopqrstuvwxyz";

2.           int times = 5000;

3.           long lstart2 = System.currentTimeMillis();

4.           String str = "";

5.           for (int i = 0; i < times; i++) {

6.               StringBuffer sb = new StringBuffer(str);

7.               sb.append(tempstr);

8.               str = sb.toString();

9.           }

10.        long lend2 = System.currentTimeMillis();

11.        long time2 = (lend2 - lstart2);

12.        System.out.println(time2);

平均执行时间为46922左右,也就是46秒。

 

  3. ArrayList,Vector,LinkedList的存储性能和特性

    ArrayList和Vector都是使用数组方式存储数据,此数组元素数目大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

  4.Collection和Collections的区别

  Collection是集合类的上级接口,继承它的接口主要有Set和List,Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

  5.sleep()和wait()的区别

   sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给把执行机会给其他线程,但是监控状态依然保持,到时候会自动回复,调用sleep不会释放对象锁。

  调用线程的sleep方法是线程暂时放弃CPU给其他线程使用,但是没有放弃对象锁

  a.是Thread的方法

  b.放弃CPU使用权,让其他线程执行

  c.不会放弃监控状态,不会放弃对象锁

  wait是Object类的方法,在线程中调用对象的wait()方法,对此对象调用wait方法导致本线程放弃对象锁,进入此对象的等待锁定池,只有针对此对象发出notify(或notifyAll)方法,本线程才能进入对象锁定池准备获得对象锁进入运行状态

  对象等待池:放弃对象锁后进入对象等待池

  对象锁定池:拥有对象锁,尚未获得CPU资源,进入对象的锁定池

 

  6.final  finally  finalize

  final

   变量:常量,必须初始化,两种初始化方法:声明时初始化,构造方法初始化

   方法:方法不能被覆盖(父类方法不能被子类覆盖)

   类:不能被继承

finally

  异常处理结构的一部分,表示总是执行

finalize

  Object类的一个方法,在GC执行时调用被回收对象的finalize方法(Object类的方法,GC调用,被回收对象的finalize方法)可以覆盖此方法提供垃圾收集时的其他资源回收,如关闭文件

总结:如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高

2.int和Integer有什么区别

  Java提供两种不同的类型:引用类型和原始类型,int是java的原始数据类型,Integer是java为int提供的封装类,Java为每个原始类型提供了封装类,原始类型封装类

  boolean  Boolean

  char  Character

  byte  Byte

  short  Short

  int   Int

  long  Long

  float  Float

  double  Double

引用类型和原始类型的行为完全不同,并且他们具有不同的语义,引用类型和原始类型具有不同的特征和用法,包括大小和速度问题,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值,对象引用实例变量的缺省值为null,原始了性实例变量的缺省值与它们的类型有关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值