👨💻个人主页: 才疏学浅的木子 🙇♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇♂️ 📒 本文来自专栏: 面试 🌈 每日一语:世界会向那些有目标和远见的人让路 🌈
Java是面向对象的,与C++相比去除了指针的概念,而且是单继承。 Java拥有平台独立性,可以做到一次编译到处运行,因为通过编译器将.java文件编译成class文件 Java具有垃圾回收机制、异常检测机制、数组越界检查等。数组越界检查可以避免访问到其它位置数据
8 种基本数据类型 整数型 : byte(1个字节 - 2^7 ~ 2^7-1)、short(2个字节 - 2^15 ~ 2 ^15-1)、int(4个字节 -2^31 ~2^31-1)、long(8个字节 -2^63 ~ 2^63 -1) 浮点型:float(4个字节)、double(8个字节) 字符型: char(2个字节) boolean 引用数据类型 数组、String、类
共同点 都不能被实例化,都可以有抽象方法,继承或实现抽象类与接口的子类都要对抽象方法进行实现 不同点 抽象类中有构造方法,而接口中没有构造方法 抽象类中可以定义成员变量而接口中只有静态常量 抽象类中可以包含普通方法,而接口中只有抽象方法 抽象类被使用时只能单继承,而接口可以多实现 抽象类中的方法范围可以是private、public等而接口中只有public 使用场景 接口是对动作的抽象,抽象类是对根源的抽象 抽象类表示的是这个对象是什么,而接口表示的是这个对象能做什么
final关键字可以修饰类、方法、变量 final修饰类时,该类不能被继承 final修饰方法时,该方法不能被修改 final修饰基本数据类型时,一旦被赋值就不能被修改 final修饰类变量时,类的地址不能变但是类中的数据可以修改
static可以修饰成员变量、方法、初始化块、内部类。static修饰的成员被称为类成员,类成员无法访问实例成员,因为类成员属于类,类成员的范围比实例成员的作用域更大,很容易出现类成员初始化完成时但实例成员还没有被初始化,这时如果类成员访问实例成员就会引起错误。static修饰的成员会优先于对象存在,静态方法中没有this因为静态方法是和类同时被加载,而this是随着对象的创建而存在的
String s1 = "abc"是直接在字符串常量池中创建,而使用new String(“abc”)则会现在常量池中创建一个,然后new 一个新的String对象放到堆中,所以使用new则会创建两个对象,占用更多的内存
== 如果基本数据类型比较那么就是比较的他们的值相等,如果是引用数据类型那么比较的就是地址是否相等 equals是用来比较引用数据类型的,如果没有重写equals方法,默认比较使用的是 ==
String是不可变字符串,StringBuffer与StringBuilder是可变字符串 String是使用final修饰的char数组,而后两个没有被final修饰 StringBuffer与StringBuilder相比,StringBuffer更加安全因为加了synchronized锁 性能上StringBuilder快于StringBuffer,安全上低于StringBuffer 建议 操作少量数据的时候使用String 操作数据较多但是是单线程使用StringBuilder 操作数据较多但是是多线程就使用StringBuffer
hashCode()与equals()中有个约束,如果两个对象相等那么hashCode就要相等,如果hashCode相等,两个对象不一定相等
函数式接口 一个接口里面只有一个方法 消费型接口 – void accept(T t) 供给型接口 – T get() 函数型接口 – R apply(T t) 断言型接口 – boolean test(T t) Lambda表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为一段可以传递的代码,使用它可以写出更简洁、更灵活的代码,Lambda表达式的类型依赖上下文环境,是由编译器推断出来的 Stream流 Stream是用来操作数据源(集合、数组)的 Stream流自己不会存储元素,不会改变源对象它会产生一个新的集合或值、strean是惰性求值的(在中间处理过程中,只对操作进行记录,并不会立即执行,只有等到执行终止操作的时候才会进行实际的计算)