Java语言有哪些特点
1简单易学
2.面向对象(继承、封装、多态)
3.平台无关性,java语言具有很强的代码一致性,经过编译后的字节码文件,通过不同平台的不同JVM进行解释后在不同平台进行运行
4.GC实现垃圾回收,java中通过gc垃圾回收器进行相关内存的回收
5.异常处理机制,java中具有完好的异常处理机制,主要分为error及exception,error为重大错误导致系统无法运行,异常则是代表程序本身可以处理的异常,则分为运行时异常与编译异常
6.支持多线程,主要可以通过继承Thread重写run方法、实现runnable实现run方法 接口,实现callable接口实现call方法等
7.支持网络编程并且很方便
8.编译与解释并存
面向对象和面向过程的区别
面向过程:面向过程思想主要是自上而下进行的一种编码方式,面向过程性能比面向对象高,主要是由于面向对象在进行类调用时需要进行类的实例化,这样导致系统的开销变大,消耗系统资源。正因为如此在一些例如单片机、嵌入式开发等对于性能需求比较高的应用时都是使用面向过程开发。面向过程没有面向对象容易维护、不容易复用且不易扩展。面向对象:面向对象思想主要是进行封装、继承、实现多态从而使得程序变得容易卫华、容易复用和扩展,使得系统更加灵活、易于维护。
Java和c++的区别?
java和c++都是面向对象的语言,并且都支持继承封装多态
JAVA虽然c++的改变而来,他摒弃了c++中比较复杂的指针和内存分配,java中不提供指针来直接访问内存,通过虚拟机来进行内存管理,使得程序的内存更加安全
java是单继承的,c++支持多重继承,java可以通过实现多个接口来实现多重继承的效果
java存在自动内存管理机制,不需要程序员手动释放内存无用的内存
在c语言中,字符串和字符数组最后都会有一个额外的结束符‘\0’来表示结束,java中没有结束符这个东西
Java有几种基本数据类型
byte(字节)、short、long、int、float、double、char、boolean总共八种
byte 8bit
short 16bit
char 16bit
int 32bit
float 32bit
long 64bit
double 64bit
基本类型和引用类型的区别
除了上方八种基本数据类型之外都是引用类型,为了面向对象操作的一致性,每种数据类型都有对应的包装类。
不同点:
-
赋值方法不同,基本数据类型是直接进行赋值,引用类型则需要通过new一个对象,对象实例化过后才能进行赋值。
-
数据比较方面的不同,基本数据类型比较的是数据的值,引用类型比较的是引用数据的地址
-
在数据进作为值进行参数传递时,基本数据类型传递的是当前数的值,引用数据类型传递的则是引用的地址,地址传递
-
分别放在jvm的哪里?
基本数据类型在创建时,在栈上给其划分一块内存,将数值直接存储在栈上(不绝对)
引用数据类型在创建时,首先需要在栈上给其引用分配一块内存,而对象的具体信息及数据将存放到堆内存中,而栈中引用指向堆中对象的地址
基本类型与其对应的引用类型之间的赋值使用自动装箱与拆箱完成
Integer x = 2; // 装箱 调用了 Integer.valueOf(2)
int y = x; // 拆箱 调用了 X.intValue()
缓存池–new Integer(123)与Integer.valueOf(123)的区别在于,前者每一次都会创建一个新的对象,后者会使用缓存池中的对象,多次调用会取得同一个对象的引用。
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k); // true
其中后者中的valueOf方法实现主要就是判断值是否在缓存池中,如果在缓存池中存在那么就直接返回相应的数据
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
重载和重写的区别
重载
发生在同一个类中,方法名必须相同,参数类型不同,个数不同、顺序不同,方法返回值和访问修饰符可以不同。
重写
重写是子类对附列的允许访问的方法的实现过程进行重新编写,翻身在子类中,方法名及参数必须相同,返回值范围必须小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类,另外父类方法访问修饰符为private则子类就不能重写该方法,也就是方法提供的行为改变,但是方法本身的外貌没有变。重写过后子类中父类的方法就被覆盖掉了,如果想要调用父类的方法需要使用super关键字
Java面向对象编程的三大特性
封装、继承、多态
封装
把描述一个对象的属性和行为的代码封装在一个类中。属性用变量定义,行为用方法定义,方法可以直接访问同一个对象中的属性。
继承
子类继承父类的特征和行为,子类可以有父类非私有的方法,属性。子类可以对父类进行扩展,也可以重写父类的方法,缺点就是提高代码之间的耦合性。
多态
多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定(像向上转型,只有运行才能够确定其对象属性),方法覆盖及重载体现了多态性。
final、finally、finalize有什么区别?
final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量被重写赋值。
finally主要作用在异常处理的时候,在trycatch中将一定要执行的代码方法放入finally代码块中,表示不管出现什么异常,该代码块都会执行,一般都用来存放关闭资源的代码
finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般有垃圾回收器gc来调用,当我们调用的gc方法的时候,有垃圾回收器调finalize回收垃圾
String、StringBuffer和StringBuilder的区别是什么?
数据可变和不可变
String类中由于数组是由final修饰的因此是不可变的,而StringBuffer和StringBuilder是可变的
线程安全
StringBuilder是线程不安全的,效率较高,StringBuffer是线程安全的,效率较低
源码中StringBuilder的append方法在进行多线程操作时操作只会进行一次而不是进行多次,而在StringBuffer中的append方法上加了一个synchronized锁,从而保证了线程的安全性,在进行多线程操作时,会进行多次,正因为需要竞争锁,因此StringBuffer的性能要比StringBuilder低。
性能
StringBuilder每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer每次都会对String对象本身进行操作,而不是生成新的对象并噶变对象应用。相同情况下使用StringBuilder能够得到10%左右的性能提升,但却要承担线程不安全的风险。
使用场景
需要操作少量的数据使用String
单线程操作字符串缓冲区的情况下操作大量数据使用StringBuilder
多线程操作字符串缓冲区下操作大量数据使用StringBuffer
String是如何实现不可变的?
string不可变的是字符串的值不变
源码:private final char value[]
String没有提供接口来改变value的值,所以value的值我们从String外部获取不到
补充:并不是真正的完全不能获取,利用反射可以直接获取类内部属性
String被声明为final,因此不可以被继承,内部使用char数组存储数据
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
value 数组被声明为 final,这意味着 value 数组初始化之后就不能再引用其它数组。并且 String 内部没有改变 value 数组的方法,因此可以保证 String 不可变。
接口和抽象类的区别
抽象类不能被实例化,只能被继承才能被使用。并不是所有类都是用来描述对象的,抽象类中没有包含足够的信息来描绘一个具体的对象
1.接口的方法默认是public,所有方法在接口中不能有事先(java8开始接口方法可以有默认实现),而抽象类可以有实现方法
2.接口中除了static、final变量,不能有其它变量,而抽象类中则不一定
public interface EduCourseService extends IService<EduCourse> {
//添加课程信息的基本方法
String saveCourseInfo(CourseInfoVo courseInfoVo);
}
3.一个类可以实现多个接口,但是只能实现一个抽象类。接口自己本身可以通过extends关键字扩展多个接口
4.接口方法默认修饰符是public,抽象方法可以有public、protected和defalut这些修饰符
Java序列化中如果有些字段不想进行序列化,怎么办?
对于不想进行序列化的变量,使用transient关键字修饰
transient关键字的作用是:阻止实例中那些用词关键字修饰的变量序列化;当对象呗反序列化时,呗修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。
String s=new String(“ABC”)会创建几个对象
使用这种方式一共会创建两个字符串对象(前提是String Pool中还没有“ABC”字符串对象),属于字符串字面量,因此在编译的时候会在String Pool会创建一个字符串对象并且指向这个“ABC”字符串字面量,而使用new的方式会在堆中创建一个字符串对象