java面试题知识点总结

题目来源java面试宝典,只针对知识点进行总结

第一类:i++问题

1.局部变量不影响全局变量的值。

2.int x,y;  默认的x和y的值是0;

3 int j=0;

for(int i=0;i<100;i++){
j=j++;     //j=0;然后一直循环j还是等于0

}   所以输出的j等于0

4 a&&b   当a为真的时候执行b,如果a为假,则不执行b

第二类:类型转换问题:

1.Short mushort=99S;   Short  中S是大写的所以是基本类型short的包装类   对后边的大99S无法识别,应该直接数值。

2.float z=1.0; 默认浮点数是double类型,所以此处需要float z=1.0f ;  或者  double z=1.0;

3.数组的长度是包含length属性,length()是字符串的方法,返回字符串的长度。如下代码:

int[] a={1,2,3};
System.out.println(a.length);
int b="adfa".length();
System.out.println(b);

java数据类型:

                                             ┏数值型━┳━整数型:byte short int long
              ┏基本数据类型━━┫              ┗━浮点型:float double
              ┃                            ┣字符型:char                                          
数据类型╋                            ┗布尔型:boolean              
              ┃                            ┏类(class)
              ┗引用数据类型━━╋接口(interface)
                                             ┗数组(array)
类型之间的低级到高级:(byte short char)--int--long--float--double   

对于(byte short char)三种类型  级别相同,想换转换的话需要使用强制类型。

4.关于a=a+b;a+=b;的问题:

a=a+b;放回的类型是a和b中类型最高类型

a+=b;》a=(a Type)a+b;返回a的类型;

当a,b类型一致的时候两者无差别

当a,b类型不一致的时候两者是有差别的

5.考点一: 8进制数以0开头,十六进制以0X开头

考点二:int a=018;会报编译错误,而 int i=(int)056L;则不报错;056L是长整型,(int)是强制类型转换。所以正常。

第三类:程序结构

1.java main函数:标准版:public static void main(String[] args){}

(1).main方法必须定义成public  ,默认代表protect。所以不合法

(2).args参数:使程序使用者在命令行状态下,可以向main函数传递参数。

(3).不加static关键词编译可以通过,但是运行时会报错:如下

错误: main 方法不是类 com.demo.exam.Test 中的static, 请将 main 方法定义为:
   public static void main(String[] args)

第四类:运算法问题

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

考察两类问题:第一:运算法优先级。第二:三元运算符;

三元运算符的级别很低,低于==  所以先进行==运算

2. int a=5;
    System.out.println("Value is "+((a<5)?10.9:9));

java会给据运算法的精度类型进行自动类型转换。  所以9自动变成9.0;

所以输出9.0;

3

char c='x';

int i=10;
System.out.println(false?i:c);
System.out.println(false?10:c);

第一个表达式:一个是int,一个char,  所以类型转换。  char变换为int类型

第二个表达式:一个是常量10 ,一个是char(T)。如果常量可以被T表示,输出为T类型。

提示:java高质量代码151建议:三元运算符最好数据类型是一致的。

4. int m,n,j;
j=m=n=5;
if((m!=5)&(n++==6)){
System.out.println("b."+n);
}
System.out.println(j++ == 6);

(1)其中n++==6是false, 并不是n++以后n=6,然后再n==6;应该是n==6;然后n++

(2)类似j++ +=6; 等价于j=j+6;然后j++;(以前看到过这个题,但是下边这段java代码编译报错):

(k++)+=6;                理解主要是思想还是先进行左右两端都是一次运算后,变量才加1;

(3) int k=6;    k+=(k++);

System.out.println(k);      输出为12;参考j=j++;j的值是不变的

第五类:传递和引用

1.(1)知识点:每一个new语句返回的都是一个指针的引用,使用java时不需要关心如何操作这个指针。

(2)不管java参数类型是什么,一律值传递参数的副本。 如果java是传值,那么传递的是java的引用。如果传递的是引用,那么传递的是引用的副本。

(3)java变量分为:1.基本类型变量,传递的是副本的值。2,对于一切对象型变量,java传递的是引用的副本,(副本的引用可以修改变量的内容)。

(4)与c++不同之处,c++传递的是真实引用,而不是引用副本。

(5)对于基本类型,传值就是把自己复制一份传递,即使副本变了,自己也不变。

关于对象和基本类型引用参考如下例子:

package com.demo.exam;
public class TestPointer {
public static void test(int i){
i++;
System.out.println(i);
}
public static void testString(StringBuffer str){
str.append(",world");
}
public static void testStr(String str){
//str是string引用的一个副本,他们的值一样,但是现在新建了一个world对象
//str这个引用指向这个新的对象,并不会影响string。
//本来都是打开仓库a的要死,现在让str打开b仓库,并不会影响string打开a。
str="world";
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//基本类型传递的是值得副本,修改副本不影响本身的值。
/* int i=12;
System.out.println("12   "+i);
test(i);
System.out.println("afda"+i);   
//对于对象变量,传递的是对象引用的副本,引用副本可以找到这个对象然后对这个对象进行修改。也就修改了对象
StringBuffer buffer=new StringBuffer("hello");
testString(buffer);
System.out.println(buffer);    */
//str是string引用的一个副本,他们的值一样,但是现在新建了一个world对象
//str这个引用指向这个新的对象,并不会影响string。
//本来都是打开仓库a的要死,现在让str打开b仓库,并不会影响string打开a。
String string="hello";
testStr(string);
System.out.println(string);
}
}

2.静态变量和私有变量:

(1)定义在类 里的成员变量会被赋予一个默认的值。布尔型的默认初值是false。

(tips:

当 全局变量 没有被显示初始化,jdk会自动赋予 默认值给他,并且 ,当你在其他地方引用 该变量的时候,编译器是不会报错的。
局部变量 在没有被显示初始化情况下,jdk 同样也会自动 赋予他默认值,可不同之处就在于 ,你无法引用他,因为编译器会在 你要引用的位置报错

若基本数据类型作为类成员的时候,即使没有进行初始化。java也会给定默认的初始值。默认是如下所示:

boolean        false

char              '/uoooo'(null)

byte              (byte)0

short             (short)0

int                  0

long               0L

float               0.0f

double           0.0d

 当变量作为作为类成员使用时,java才确保给定其初始值,防止程序运行时错误。

public class TestArr {
static boolean t;
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a=new int[10];
for(int i=0;i<a.length;i++){
System.out.println(a[i]);   //输出全为0
}
String[] str=new String[10];
for(int j=0;j<str.length;j++){
System.out.println(str[j]);//输出全为null
}
        System.out.println("boolean  "+t);
}
}

2.java中的静态方法不可以访问非静态变量。(报错main函数,因为main函数是static所以不能使用非静态变量),静态方法在在类初始化的时候就存在了,但是私有变量(非静态变量的时候还没有初始化,不能使用)还没有具体的值,是不能被调用的。所以会出错,是编译错误。(构造函数可以使用非静态变量)报如下错误:

第六类:内存管理

1.垃圾回收标准:

(1)给对象赋予了空值null,以后对象再没有被调用过

(2)给对象赋予了新值,即重新分配了内存空间。

java垃圾回收与其他语言的不用:其他的语言需要显示的分配内存、释放内存,程序在需要时分配内存,不需要的时候释放内存。(这样子容易引起内存泄露)。java不需要程序员显示的分配内存和释放内存。java在创建的时候会自动分配内存,并当对象引用不存在的时候释放这块内存。(无须显示的请求垃圾收集器)

java 内存的管理:内存管理就是对象的分配和释放问题,通过new为每个对象申请内存空间,对象在堆中,变量再栈中。对象的释放由GC决定和执行。。内存的分配有程序完成,内存的释放由GC完成。释放对象的根本原则:该对象不再被引用。

java内存泄露:内存泄露就是存在一些被分配的对象,这些对象有两个特征:(1)对象是可达的,就是有别的对象引用它。(2)对象是无用的。内存泄露的主要原因:保留下来却永远不再使用的对象引用。


1. 程序String str = “hello,everybody”; System.out.println(str.substring(5,4));的运行结果是:______    subStringbeginIndex,endIndex;一个开始一个结束,4小于5此时会报错。

 

2.try()里有一个return语句。那么紧跟在这个try后的finally{}里的code会不会被执行?什么时候被执行,在return前还是后?

会执行,并且在return之前执行。因为finally中的代码是肯定会执行的,finally的作用就是在返回之前需要关闭一些链接。

例如数据库的链接在返回之前都是需要关闭的。


9.自己写JavaBean,判断内同是否相同,有时候需要重写equals方法如下:

一个重写equals  就是判断内容是否相等

第一步:equalsObject o

先看一下 o是不是等于null

第二步:o是不是这个类的一个实例

第三部:比较数据是否相等。

例如:

1.  public boolean equals(Object obj) {  

2.         if (obj == this) {    //可以直接判断内存地址是否相等,相等则相等。

3.             return true;  

4.         }  

5.         if (obj == null || obj.getClass() != this.getClass()) {  

6.             return false;     //   是否为空,或者  是否是这个类

7.         }  

8.   

9.         Person guest = (Person) obj;    //判断具体的数值是否相等。

10.         return id == guest.id  

11.                 && (firstName == guest.firstName   

12.                      || (firstName != null && firstName.equals(guest.getFirstName())))  

13.                 && (lastName == guest.lastName   

14.                      || (lastName != null && lastName .equals(guest.getLastName())));  

15.     } 

 






(未完待续)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值