JavaSE基础
JDK和JRE的区别
- JDK:Java开发工具包,提供了Java的开发环境和运行环境
- JRE:Java运行环境,提供Java的运行环境
- JDK包含了JRE,还包含了java源码的编译器javac,以及很多java程序调试分析的工具,如果只需要运行程序,JRE即可,如果还需要写程序则需要JDK
Java8新特性
- Date Time API :加强对日期和时间的处理
- Optional类:用来处理空指针的问题
- Lambda表达式
- 优化HashMap,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)
Java的多态
- 多态:一种事物的多种存在形态,比如说男人和女人都是人,人可以分为男人和女人
- 好处:消除了类之间的耦合关系,大大提高了程序的简洁性和可拓展性
- 重写Overriding和重载Overloading
- 重载:以类统一的方式处理不同数据的一种手段,实质就是多个具有不同参数个数或者类型的同名函数,且返回类型可随意。(动态绑定)
- 重写:父类与子类之间的多态性,实质就是子类对父类的函数进行重写定义。子类的访问权限不能小于父类的访问权限。(否则调用的时候可能无法调用)(静态绑定)
- 重写方法参数列表、返回类型必须与被重写的方法相同。
- 子类对象的多态性
- 是使用父类的引用,指向子类的对象,然后虚拟方法调用子类重写父类的方法
数据类型 自动拆装箱
- 8种,int long short char float double byte boolean
- 自动装箱是Java编译器在基本数据类型和对于对象包装类型中做的一个转化。比如int类型转化为Integer,double类型转为Double等,反之及时自动拆箱。
Java中IO流分为几种
- 按照功能:输入流、输出流
- 按照类型:
- 字节流:按8位传输以字节为单位输出输出数据
- 字符流:按照16位传输以字符为单位输出输入数据
值传递和引用传递
- 值传递对于基本类型而言的,传递的是该变量的一个副本,改变副本不影响原变量
- 引用传递对于对象类型而言的,传递的是该对象地址的一个副本,并不是原对象本身,所以对引用对象操作会改变原对象。
- 一个对象被当做参数传递给一个方法后,此方法可改变它的属性,并返回变化后的结果,那么这里是什么传递?
- 值传递。Java没有引用传递,方法的参数的值是对象引用(传入的变量)的一个副本,但指向同一个对象,所以在方法中改变对象也会改变原变量的值,因为他的引用的对象改变了。
&和&&的区别
&:按位于,两边都要判断
&&:短路与,左边的为true才会判断右边
经常使用短路与,比如用户登陆时判定用户名不是null且不是空字符串时就只能用&&
1
username!=null&&username.equals("")
String、StringBuffer和StringBuilder
- 都是可以储存和操作字符串
- String是final类型,每次声明的都是不可变更的对象,然后将指针指向新的String对象
- StringBuffer,StringBuilder是可变字符继承自AbstractStringBuilder,在原有对象上进行操作
- StringBuffer是线程安全的,StringBuilder不是线程安全的,但性能更高
- 使用场景:
- 并发必选StringBuffer
- 迭代必选StringBuilder
- 普通场景使用String,避免不必要的类型转换开销
- Object若不重写hashCode()的话,hashCode()如何计算出来的?
- Object的hashCode()方法是一个本地方法,该方法是直接返回对象的内存地址
equals和hashcode
- 如果两个对象的引用相同,他们之前互相调用equals()为true即两个对象相同。如果不重写hashCode()方法,系统默认的hashCode()是本地计算对象的内存地址(经哈希算法),此时不会相同。就会产生矛盾。
两个对象equals相等,则它们的hashcode必须相等,反之则不一定。
两个对象=相等,则其hashcode一定相等,反之亦然。
两个对象==相等,则其hashcode一定相等,反之不一定成立。 //有可能是Integer对象比较之类的
两个对象==相等,则其hashcode一定相等,反之不一定成立。
==和equals的区别
- ==
- 基本类型:比较值是否相同
- 引用类型:比较的引用是否相同
- equals默认情况下是引用比较,只是很多类重载了equals()方法 (也可自定义) ,比如String、Integer等将它变为值比较
final和static
final
- final可以修饰属性,方法,类,局部变量(静态变量、实例变量和局部变量);
- final修饰的方法不能被子类重写,但可以被继承;
- final修饰的类不能被继承,没有子类,final类中的方法默认是final的
- final不能用于修饰构造方法;
- 对于基本类型数据,final会将值变为一个常数(创建后不能被修改)
staic
- static表示“全局”或者“静态”的意思,可以用来修饰:属性,方法,代码段,内部类(静态内部类或嵌套内部类),static不可以修饰局部变量
- static修饰的属性的初始化在编译期(类加载的时候),初始化后能改变,并且每个对象都只有一个值,主要强调它们只有一个。
- static修饰的属性、方法、代码段跟该类的具体对象无关,不创建对象也能调用static修饰的属性、方法等,
- static和“this、super”势不两立,因为this、super正好跟具体对象有关。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
- 用public修饰的static属性和方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static final(等价于final staic)
- static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用
静态代码块与普通代码块的区别
public class HelloB extends HelloA { public HelloB(){ } { System.out.println("I’m B class"); } static{ System.out.println("static B"); } public static void main(String[] args){ new HelloB(); } } class HelloA { public HelloA(){ } { System.out.println("I’m A class"); } static{ System.out.println("static A"); } } //输出结果 static A static B I’m A class I’m B class
执行顺序:
- 父类静态代码块
- 子类静态代码块
- 父类普通代码块
- 父类构造方法
- 子类普通代码块
- 子类构造方法
相同点
- 都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。
不同点
- 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。
接口和抽象类有什么区别
- 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
- 构造函数:抽象类可以有构造函数;接口不能有。
- main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
- 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
- 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
String a=”i” 和String b=new String(“i”)的区别
- 前者,Java虚拟机将其分配到常量池中,并把”i”的内存地址赋给a,如果还有一个String a1=”i”,也把”i”的内存地址赋给a1,即a和a1这两个引用的是同一个地址,共享一个内存。
- 后者,则会被分配到堆内存中,即新创建了一个对象,如果还有一个String b1=new String(“i”),相当于又创建了一个对象,然后将其地址赋给b1,虽然b和b1值相同,但是并不是一个对象。
String类的常用方法有哪些
indexof()
:放回指定字符索引charAt()
:返回指定索引处字符replace()
:字符串替换trim()
:去除字符串两端空白spilt()
:分割字符串,返回一个分割后的字符串数组getBytes()
:返回字符串的 byte 类型数组。ASCII码length()
:返回字符串长度。toLowerCase()
:将字符串转成小写字母。toUpperCase()
:将字符串转成大写字符。- substring() :截取字符串。
- equals() :字符串比较。
Files的常用方法
Files.exists()
: 检测文件路径是否存在。Files.createFile()
:创建文件。Files.createDirectory()
:创建文件夹。Files.delete()
:删除一个文件或目录。Files.copy()
:复制文件。Files.move()
:移动文件。Files.size()
:查看文件个数。Files.read()
:读取文件。Files.write()
:写入文件。
java创建对象的方法
- 用new语句创建对象,是最常见的创建对象的方法。
- 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
- 调用对象的clone()方法。
- 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
assert
- 断言。是在软件开发过程中的一种调试方法。它对一个boolean表达式进行检验。一个正确的程序必须保证这个表达式正确,如果不正确系统则会给出警告或者退出。一般来说,asset用于保证程序最基本,最关键代码的正确性。软件发布后,通常assert检查通常是关闭的。
抽象类
- 抽象类不一定要有抽象方法
- 抽象类不能使用final,因为被final标记的类不能被继承,但抽象类就是为了让其子类继承的
- 抽象类和普通类的区别
- 抽象类不能实例化,普通类可以 绝不会拿3e
- 普通类不能含有抽象方法,抽象类可以有抽象方法
lambda 表达式
* 示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
发布时间: 2020-04-29 19:38:10
更新时间: 2022-04-21 16:32:01
本文链接: https://wyatt.ink/posts/Code/dc174266.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!