练习/面试题

 
GC是什么? 为什么要有GC
答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,
忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动
监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存
的显示操作方法。

 
一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
答:可以。
    一个源文件中只能有一个声明为public(公共的)的类,同时要求此类的类名与源文件名称相同

 
垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收
答:对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用
有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。
当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),
通知GC运行,但是Java语言规范并不保证GC一定会执行。

 
此处,Something类的文件名叫OtherThing.java
class Something {
    private static void main(String[] something_to_do) {       
        System.out.println("Do something ...");
    }
}
这个好像很明显。
答案: 正确。从来没有人说过Java的class名字必须和其文件名相同。但public class的名字必须和文件名相同。

 
看下面的程序是否有问题,如果有问题,请指出并说明理由。
· short s=1;s = s+1;
· short s=1;s+=1;

short s=1; s=s+1; 自然是编译不通过的 提示损失精度 ;
short s=1; s+=1; 能编译通过

隐式类型转换可以从小到大自动转,即byte->short->int->long如果反过来会丢失精度,必须进行显示类型转换。

  s+=1的意思与s=s+1不同,s=s+1这句先执行s+1然后把结果赋给s,由于1为int类型,所以s+1的返回值是int,编译器自动进行了隐式类型转换所以将一个int类型赋给short就会出错,

  而s+=1不同由于是+=操作符,在解析时候s+=1就等价于s = (short)(s+1),就是 s+=1 <=> s = (s的类型)(s+1)。


 
switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 
  switch语句中的表达式只能是byte,short,char ,int以及枚举(enum),所以当表达式是byte的时候可以隐含转换为int类型,而long字节比int字节多,不能隐式转化为int类型,所以switch语句可以用在byte上而不可以用在long上,另外由于在JDK7.0中引入了新特性,所以witch语句可以接收一个String类型的值,String可以作用在switch语句上
 
总结switch语句和if语句的各自使用场景
· switch建议判断固定值的时候用
· if建议判断区间或范围的时候用
switch语句应用面极窄,只能判断有限个整数/整数表达式/枚举。浮点/字符串/类都不能判断。

 

Java语言中的字符char可以存储一个中文汉字吗?为什么呢?
  可以。因为Java语言采用的是Unicode编码。Unicode编码中的每个字符占用两个字节。Char储存的是一个字符(两个字节),中文也是占的两个字节;所以,Java中的字符可以存储一个中文汉字


 

Java中的工具类可以直接调用(不用new对象,创建实例)

一般在Math.max()里面。。用Math能直接去调用max(),是因为max()是属于Math里面的一个静态方法。也就是用static来修饰的。。如果一个类里面的方法是属于静态的。那么在调用这个方法的时候就不需要创建一个实例的对象。而是用类名去直接调用了。因为静态函数在程序启动的时候就已经为它单独的创立了一个内存空间


 

java中==跟equlas有什么区别
1. == 是一种运算,比较两个数据内存地址是否相同。
2. equals 是Object类的方法,如果没有被覆盖,默认是比较两个数据值是否一样,不比较内存地址。
比如
Object A=new Object();
Object B=A;
A==B ==>false
A.equals(B) ==>true
在JAVA里面,牵扯到equals和equalsIgnoreCase比较字符串的功能函数,前者比较的时候区分大小写,后者比较时忽略大小写。


 

实现两个整数变量的交换
  注意:没有明确指定数据的类型,默认int类型。

class OperatorTest {
  public static void main(String[] args) {
  int a = 10;
  int b = 20;
  System.out.println("a:"+a+",b:"+b);

  //方式1:使用第三方变量(开发中用的)
  /*
  int c = a;
  a = b;
  b = c;
  System.out.println("a:"+a+",b:"+b);
  System.out.println("------------");
  */

  //方式2:用位异或实现(面试用)
  //左边:a,b,a
  //右边:a ^ b
  /*
  a = a ^ b;
  b = a ^ b;   //a ^ b ^ b = a
  a = a ^ b;   //a ^ b ^ a = b
  System.out.println("a:"+a+",b:"+b);
  */

  //方式3:用变量相加的做法
  /*
  a = a + b;   //a=30
  b = a - b;   //b=10
  a = a - b;   //a=20
  System.out.println("a:"+a+",b:"+b);
  */

  //方式4:一句话搞定
  b = (a+b) - (a=b);   //b=30-20=10,a=20
  System.out.println("a:"+a+",b:"+b);
  }
}


 

 

 

 

 

 


 

posted on 2018-02-28 09:28  荆棘Study  阅读(163)  评论(0编辑  收藏  举报