1、java的基本数据类型及封装类
byte、int、short、long、float、double、boolean、char
boolean单独使用占4个字节,在数组中占1个字节
基本类型所占的储存空间是不变的,放在栈中,直接储存值
1.1、基本类型与对应的封装类型的区别
- 基本类型按值传递,而封装类按引用传递
- 基本类型在栈中创建,封装对象在堆中创建,对象的引用在栈中创建,基本类型由于在栈中效率会更高,但可能会存在内存泄漏的问题
1.2、包装类型的使用场景
- 基本类型有默认值,而包装类型初始为null
- POJO类必须使用包装类型,而在本地变量推荐使用基本类型
- 这个字段允不允许null值,如果允许,则必然要用封装类,否则,基本类型就可以了
- 集合类、泛型、反射调用函数,就需要用包装类
2、== 与 .equals 的区别
- == 对于基本类型来说是比较两个值是否相同,对于引用类型来说是比较的是引用地址是否相同
- 而 equals默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下equals 比较的是值是否相等
3、while与do while的区别
- while(){} 在循环的开始判断满足条件执行
- do{}while() 至少循环一次,循环的结尾判断是否满足条件
4、public,private,protected区别
5、float = 3.4,是否正确
double赋值给float属于向下转型,需要强制转型
float = float(3.4)
6、short s1=1,s1 = s1+1有错吗,short1 s1 = 1,s1+=1有错吗
- 1是int类型,s1+1也是int类型,int赋值给short属于向下转型,强制转换s1 = short(s1+1);
- += 会进行隐式自动类型转换,s1+=1;相当于s1 = short(s1+1);
7、&与&&区别
- & 按位与、逻辑与 a=b & b=c(即使前面是false,后面还会继续判断)
- && 短路与 a=b && b=c(前面是false,后面就不用判断)
8、String str = "a" 与 String str = new String("a") 区别
内存分配方式不一样
String str = "a" 常量池 (方法区)
String str = new String("a") 堆内存(对象放在堆中)
String a = "string";
String b = "string";
String c = new String("string");
String d= new String("string");
System.out.println(a==b); // true
System.out.println(a==c); // false
System.out.println(c==d); //false
System.out.println(a.equals(b)); // true
System.out.println(a.equals(c)); //true
System.out.println(c.equals(d)); //true
true -->声明变量a,b的同时,系统将字符串"string"这个值内存中的地址赋给了a,b,所以这两个引用的是
同一个地址值,他们两个共享同一个内存,(a==b)就是比较两个值是否相同
false -->系统将字符串"string"这个值内存中的地址赋给了a,而new String("string")是将对象地址赋给c
false -->new String("string")是将对象地址赋给c,然后将对象的地址值赋给d,虽然c的值和d的值是相同的,但是他们依然不是同一个对象了
true -->equals 比较的一直是值("string"),所以结果都为 true
true -->equals 比较的一直是值("string"),所以结果都为 true
true -->equals 比较的一直是值("string"),所以结果都为 true
9、string、StringBuilder、StringBuffer的区别
- String是内容不可变的字符串,String底层使用了一个不可变的字符数组(final char[])
- StringBuffer是内容可变字符串,StringBuffer底层使用的是可变的字符数组(char[],没有使用final来修饰)
- 拼接字符串使用StringBuffer,StringBuilder,append
- StringBuilder是线程不安全的,效率高,StringBuffer是线程安全的(添加了同步锁synchronized),效率低
10、重写与重载的区别
- 重写:当一个子类继承父类,而子类方法与父类方法的名称,参数个数,类型完全一致,称子类中的这个方法重写了父类中的方法。(方法名,参数个数,类型一致)
- 重载:一个类中一个方法与另一个方法名相同,参数个数类型不同(方法名相同,参数个数类型不同)
11、设计模式,常用的设计模式
设计模式是经过前人无数次实践总结出来的,设计过程可以反复使用的,可以解决特定问题的设计方法。
-
单例(饱汉模式&&饥汉模式)
构造方法私有化,除了自己类中创建外其他地方都不能创建,在自己类中创建一个单实例(饱汉模式是先创建单实例,而饥汉模式是需要的时候才创建)区别 ,提供一个方法获取该实例的对象(创建时需要进行方法同步)
-
工厂模式:SpringIOC就是使用了工厂模式(对象的创建交给工厂创建)
-
代理模式:SpringAop就是使用了动态代理
package com.ccshen.basic;
public class PersonFactory {
//构造方法私有化
private PersonFactory() {
}
//饿汉模式(创建单实例)
// private static PersonFactory instance = new PersonFactory();
//饥汉模式
private static PersonFactory instance = null;
//提供方法获取
public static PersonFactory getInstance() {
if(instance == null) {
instance = new PersonFactory();
}
return instance;
}
public static void main(String[] args) {
PersonFactory.getInstance().toString();
}
}
12、java的反射机制
java中的反射机制是运行中,对于任何一个类都知道类中的方法、属性,并且对于任何一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态的调用对象方法的功能。
13、反射的应用场合
编译时类型和运行时类型
在 Java 程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。
编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定
Person p=new Student();
其中编译时类型为 Person,运行时类型为 Student
14、java 反射 API
- Class 类:反射的核心类,可以获取类的属性,方法等信息
- Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值
- Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
- Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法
15、java内部类
- 内部类 : 静态内部类,成员内部类,局部内部类,匿名内部类
- 静态内部类 : 可以访问外部类所有的静态变量和方法,可以定义静态变量、方法,构造方法
- 成员内部类 : 非静态的,不能定义静态的方法和变量
- 局部内部类 : 定义在方法中的类,如果考虑类在方法中使用
- 匿名内部类 : 继承一个父类或实现一个接口,直接使用 new 来生成一个对象的引用
16、抽象类与接口的区别
16.1、抽象类
- 抽象类使用abstract修饰;
- 抽象类不能实例化,即不能使用new关键字来实例化对象;
- 含有抽象方法(使用abstract关键字修饰的方法)的类是抽象类,必须使用abstract关键字修饰;
- 抽象类可以含有抽象方法,也可以不包含抽象方法,抽象类中可以有具体的方法;
- 如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则就是抽象类;
- 抽象类中的抽象方法只有方法体,没有具体实现;
16.2、接口
- 接口使用interface修饰;
- 接口不能被实例化;
- 一个类只能继承一个类,但是可以实现多个接口;
- 接口中方法均为抽象方法;
- 接口中不能包含实例域或静态方法(静态方法必须实现,接口中方法是抽象方法,不能实现)
17、String常用方法
- indexOf() : 返回字符串的索引
- charAt() : 返回指定索引处的字符
- replace() : 字符串的替换
- trim() : 去除字符串两端的空白
- split() : 分割字符串
- getBytes() : 返回字符串的byte数组
- length() : 返回字符串的长度
- subString() : 截取字符串
- equals() : 字符串比较
- toLowerCase() : 字符串变小写
- toUpperCase() : 字符串变大写