JAVA ⾯试知识点(⼀)
⽂章⽬录
引⾔
为了java⾯试,我刷了不少的java笔试题,这个是⼀个⽐较简短的总结笔记,希望能帮到有需要的⼈。这篇博⽂其实只写了⼀些,我内⼼还有更⼤的蓝图(集合啊线程那些还有⼀些其他的考点),只不过最近⽐较忙没写~以后再更新啦。
如果您觉的有⽤的话,可以给我点个赞如果⽂章有错误请指正。如果您需要转载的话,请在明显位置(加⼤加⿊哈哈)注明转载地址。GitHub地址为:
⼀、数据类型
基本数据类型
数值类型:
数据类型
封装类型存储需求(字节)取值范围=(-2(8*存储需求)-1)byte
Byte 1-27-1(-128~127)
short
Short 2int
Integer 4long
Long 8float
Float 4double Double 8以整型int 4字节来计算,4字节也就是32位,1KB=1024B,1024/32=32,也就是1KB最多能存32个int。
⾯试考点:取值范围,运算,拆装箱,⽐较,类型转换
赋值
需要注意的⼀点是⼀些不常见的赋值⽅法,这个也要结合下⾯类型转换来看。
⾸先要明确的⼀点是整型默认类型为int,浮点型默认类型为double,
然后要考虑类型的取值范围,
再考虑⼀点就是下⾯的表现形式。
数值的表现形式
1. 进制类:例如2,8,16进制。
(8*存储需求)~28~2
int a =10;
int b =0b10;
int c =010;
int d =0x10;
System.out.println("a = "+a+" b = "+b+" c = "+c+" d = "+d);
//a = 10 b = 2 c = 8 d = 16
2. 科学计数法:要注意的是使⽤科学计数法则元素为double类型。
double d =5e2;
int i =(int)5e2;
System.out.println(d);//500.0
3. 后缀类:float->f,double->d;结合默认类型和⾃动类型转换考虑。
float f =(float)1.1;
float ff =1.1f;
double e =1.1d;
其他
偶尔有些题⽬还会有封装类型的直接赋值,这时候考虑第⼀点默认类型处理。
Double d =1;//(x)因为1默认是int,这⾥直接赋值是错的。
运算and类型转换
实⼼箭头代表⽆信息丢失,虚箭头表⽰有精度损失
补充:5、被final修饰的变量不会⾃动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型⽽转化。案例:
final byte b =1;
byte j = b +1;
注意:结合赋值会隐式进⾏强制类型转换
案例:
byte i =1;
i = i +1;//报错,因为运算的时候byte转换成了int类型
i =(byte)(i +1);//可以,使⽤了强制类型转换
i +=1;//可以,这种结合赋值会隐式进⾏强制类型转换
位运算⾥:~n = -n - 1
⾃动装拆箱and⽐较
⾃动装箱和拆箱⼤部分⼈的印象应该就是这样⼦的:
Integer i =1;//⾃动将int类型装箱为Integer
int a =new Integer(5);//⾃动拆箱为int
那么⾯试的考点应该是下⾯这样⼦的:
1. 基本型和基本型封装型进⾏==运算符的⽐较,基本型封装型将会⾃动拆箱变为基本型后再进⾏⽐较。
2. 两个Integer类型进⾏“==”⽐较,还要看Integer对象创建的⽅式,这⾥还有⼀个缓存池的概念。Integer缓存的是-128~127
3. 两个基本型的封装型进⾏equals()⽐较,⾸先equals()会⽐较类型,如果类型相同,则继续⽐较值,
如果值也相同,返回true
4. 基本型封装类型调⽤equals(),但是参数是基本类型,这时候,先会进⾏⾃动装箱,基本型转换为其封装类型,再进⾏3中的⽐较。
Integer i =9;
int j =9;
System.out.println(i == j);//true,i⾃动拆箱,然后进⾏⽐较
Integer k =9;
Integer kk =new Integer(9);
Integer kkk = Integer.valueOf(9);
System.out.println(i == k);//true。i,k创建⽅式不是new,⽽且值在缓存池⾥,所以==⽐较对象的会是同⼀个地址
System.out.println(i == kk);//false。kk是new的,所以内存地址不⼀样。
System.out.println(i == kkk);//true。如果值在缓存池⾥valueOf会直接返回对应缓存,否则调⽤new Integer
Integer ii =128;
Integer jj =128;
System.out.println(ii == jj);//false.如果值在缓存池⾥valueOf会直接返回对应缓存,否则调⽤new Integer
System.out.println(i.equals(k));//⽅法为public boolean equals(Object obj)
System.out.println(i.equals(kk));//
基本类型对应的缓冲池如下:
boolean values true and false
all byte values
short values between -128 and 127
int values between -128 and 127
char in the range \u0000 to \u007F
boolean类型:
封装类型:Boolean,取值为true|false.
⾯试考点:逻辑符的短路
逻辑符的短路:
逻辑符的短路表⽰按顺序执⾏&&,||时,如果前⾯语句满⾜了判断那么就不会执⾏后⾯的语句:
if(true||5/0==0){
...
}
执⾏前半句得到true,逻辑短路不会执⾏后⾯的语句,故不会报错。
实际上位运算符&,|也可以表⽰与,或,代表的是⼀种⾮短路的运算。如果上述条件改为|那么就会报错。
char类型:
char原本⽤于表⽰单个字符。现在可以描述⼀些Unicode字符。封装类型为:Character,取值范围现在是0~2^16-1.
⾯试考点:封装类型,常见char对应int值
字符ASCII码值
‘0’48
‘a’97
‘A’65
注意:当赋值为整型的时候不是代表对应的值,⽽是ASCII值:
char a =1;
char b ='1';//a!=b
String类型
string的⾯试考点⼀般有 判断是否相等,equals(),不可变性,StringBuffer/StringBuilder的区别
内部实现
String类被声明为 final,因此它不可被继承。
⽽且内部使⽤ char 数组存储数据,该数组被声明为 final,这意味着 value 数组初始化之后就不能再引⽤其它数组。并且 String 内部没有改变 value 数组的⽅法,因此可以保证 String 不可变。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
常⽤的String的创建
1. String s = "java";我们把这类创建称为字⾯量 ⽅式,直接使⽤双引号将字符数组value[]括起来。
2. String s = new String("java");使⽤构造函数构造String对象。
之所以要区分这两种不同创建⽅式是因为他们在创建String对象的时候会有不同的表现形式。
字⾯量创建:
使⽤字⾯量的⽅式创建,⾸先JVM会到字符串常量池中检查是否有内容为java的对象存在。
如果不存在,那么会先在在堆内存创建⼀个内容为java的String对象,然后将指向该对象的内存地址引⽤存⼊字符串常量池中。
如果存在则返回该引⽤。
如果是String s = "ja"+"va";这样的⽅式创建字符串,由于编译优化,那么在编译器会直接在字符串常量池创建内容为java的引⽤,⽽没
有ja,va这两个。
但是如果是String s1 = "ja";String s = s1 + "va";由于⽆法在编译器确定s的内容,jvm会在运⾏时确认。⽽在运⾏时确认需遵循以下规则:只要s1是变量,不论s1指向池中的字符串对象还是堆中的字符串对象,运⾏期s1 + “aa”操作实际上是编译器创建了StringBuilder对象进⾏了append操作后通过toString()返回了⼀个字符串对象存在heap上。
在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是⽅法区)中;
在JDK7.0版本,字符串常量池被移到了堆中了。因为⽅法区的内存太⼩,只能存放1009个,⽽现在可以通过指定-XX:StringTableSize参数初始化字符串常量池的⼤⼩。
构造⽅法创建:
使⽤构造⽅法创建时,不过字符串常量池是否有相应的内容的String对象引⽤,都会在堆上新建⼀个String对象。
对于上⾯使⽤new创建的字符串对象,如果想将这个对象的引⽤加⼊到字符串常量池,可以使⽤intern⽅法。
调⽤intern后,⾸先检查字符串常量池中是否有该对象的引⽤,如果存在,则将这个引⽤返回给变量,否则将引⽤加⼊并返回给变量。
案例:
String a ="java";
String b ="java";
String c =new String("java");
String cc = String.valueOf("java");
String ccc =new StringBuilder("java").toString();
String d ="ja"+"va";
System.out.println(a == b);//true
System.out.println(a == d);//true
System.out.println(a == c);//false
System.out.println(a == cc);//true
System.out.println(a == ccc);//false
StringBuffer和StringBuiler:
1. StringBuffer线程安全,StringBuiler线程⾮安全。
2. StringBuiler牺牲了对⽅法的互斥锁,所以运⾏速率⽐StringBuffer⾼。
3. 都继承了AbstractStringBuilder。
⼆.修饰符
权限修饰符
基础
权限修饰符修饰类,⽅法,字段
权限修饰符有3种,分别是public(本包,其他包可见),protected(包内和⼦类可见),private(类内私有)。
权限除了上⾯3中,还有⼀种是不带修饰符的,也可以称为缺省的,表⽰包内可见。
按权限⼤⼩划分为public > protected > 缺省 > private.
继承
抽象类的使用继承⾥,关于权限修饰符有⼀条限制:⼦类的重载⽅法访问权限要等于或者⼤于⽗类的权限。
如果⼦类继承接⼝,那么如果要实现接⼝的⽅法,⽅法的修饰符⼀定是public,因为接⼝中⽅法默认为public abstract. final修饰符
final修饰⽅法表⽰⼦类不能覆盖。
final修饰类表⽰该类不能被继承。
final修饰字段表⽰该字段时常量。
final修饰参数表⽰该参数不能被重复赋值。
被final修饰的变量不会⾃动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型⽽转化。
blank final
空的final,即不给变量赋初值,只有在构造某个类的对象时才(必须)给它赋⼀次初值。
类⾥的不同对象可以是不同的final值,⽽且保留了不可变的特性。
public final String helloString ="Hello";
public final String javaString;
public FinalTest(){
javaString ="java";
}
static修饰符
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论