Java基础知识学习

复习基本知识点自我学习

本篇文章记录一些java基本信息面试中可能会问到,以及工作中可能会造成写出bug的问题记录

java基本数据类型

数据类型默认值
byte0
short0
int0
long0L
float0.0f
double0.0d
char‘u0000’
booleanflase

1.java在JDK1.5中引入了新特性:自动装箱和拆箱:
自动装箱,相当于Java编译器替我们执行了 Integer.valueOf(XXX);
自动拆箱,相当于Java编译器替我们执行了Integer.intValue(XXX);
2.面试问题:
Integer i = null;
int j = i + 1; 请输出j值
结果:报错空指针,i会进行自动拆箱,调用 intValue()方法,报错空指针
3.自动类型转换:

  • 不能对boolean类型进行类型转换。
  • 不能把对象类型转换成不相关类的对象。
  • 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
  • 转换过程中可能导致溢出或损失精度,例如:
    int i =128;
    byte b = (byte)i;
  • 必须满足转换前的数据类型的位数要低于转换后的数据类型
    4.强制类型转换
  • 条件是转换的数据类型必须兼容的
    5.隐含强制类型转换
  • 整数的默认类型是int
  • 浮点型不存在这种情况,因为定义float类型时整数必须在数字后面跟上F或者f

java修饰符

访问控制修饰符

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
  • public : 对所有类可见。使用对象:类、接口、变量、方法
  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。

访问控制和继承

请注意以下方法继承的规则:

  • 父类中声明为 public 的方法在子类中也必须为 public。
  • 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
  • 父类中声明为 private 的方法,不能够被继承。

非访问修饰符

为了实现一些其他的功能,Java 也提供了许多非访问修饰符。

  • static 修饰符,用来修饰类方法和类变量。
  • final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
  • abstract 修饰符,用来创建抽象类和抽象方法。
  • synchronized 和 volatile 修饰符,主要用于线程的编程。
synchronized 修饰符

synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。

transient 修饰符

序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。
实例
public transient int limit = 55; // 不会持久化
public int b; // 持久化

volatile 修饰符

volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
一个 volatile 对象引用可能是 null。

Java运算符

自增自减运算符

  1. 自增(++)自减(–)运算符是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算,而自增自减运算符是一个操作数。
  2. 前缀自增自减法(++a,–a): 先进行自增或者自减运算,再进行表达式运算。
  3. 后缀自增自减法(a++,a–): 先进行表达式运算,再进行自增或者自减运算

短路逻辑运算符

当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。&&为短路逻辑运算符(第一个操作为false就停止),&逻辑运算符(左右操作均会判断)

instanceof 运算符

该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型),例:
( Object reference variable ) instanceof (class/interface type)

循环

break 关键字

break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
break 跳出最里层的循环,并且继续执行该循环下面的语句。

continue 关键字

continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。

Java String 类

  1. String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了(final修饰)
    如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类
  2. StringBuilder的方法不是线程安全的,StringBuffer是线程安全的

Java 日期

JDK1.8 新增LocalDate、LocalTime、LocalDateTime代替原先Date,SimpleDateFormat线程不安全,LocalDate、LocalTime、LocalDateTime线程安全

集合框架

图片来自菜鸟教程
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map)。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是抽象类,最后是实现类,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等
集合框架体系如图所示
图片来自菜鸟教程

集合特点介绍

  1. List有序,可重复,类似数据查询快,插入删除慢
  • ArrayList实现底层采用数组,查询快,增删慢
  • LinkedList底层采用双链表,增删快,查询慢
  1. Set无序,不可重复,查询效率底,插入和删除效率高,切不引起元素位置改变
  • HashSet新增数据是通过HashMap的put方法取vakue进行新增数据的,所以HashSet是无序不可重复的
  • TreeSet有序不可重复,底层运用二叉树进行排序。排序自定义类型,需要重写comparaTo(),允许有 null 值
  1. Queue: 一个队列,就是一个先入先出(FIFO)的数据结构
  2. Map 无序存储键值对,key是不能重复的
  • HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。HashMap 是无序的,即不会记录插入的顺序。
  1. Iterator: 迭代器,用于迭代ArrayList和HashSet等集合

Object对象相关知识点

equals方法和hashCode()方法

自定义类 需要判断对象在业务逻辑上是否相等,需要重写hashCode和equals, 在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。
在这种情况下,原生的equals方法就不能满足我们的需求了。在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回 同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。
所以这个时候我们需要重写equals方法,来满足我们的业务系统上的需求。那么为什么在重写equals方法的时候需要重写hashCode方法呢?
如果不重写hashCode的话,可能导致HashSet、HashMap不能正常的运作

finalize() 方法

finalize() 方法
Java 允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象。
例如,你可以使用 finalize() 来确保一个对象打开的文件被关闭了。
在 finalize() 方法里,你必须指定在对象销毁时候要执行的操作。
finalize() 一般格式是:
protected void finalize()
{
// 在这里终结代码
}
关键字 protected 是一个限定符,它确保 finalize() 方法不会被该类以外的代码调用。
当然,Java 的内存回收可以由 JVM 来自动完成。如果你手动使用,则可以使用上面的方法。

clone() 拷贝

  1. 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝(拷贝对象的改变会影响被拷贝的对象,因为浅拷贝本质是用的同一个引用)
  2. 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝(实则浅拷贝和深拷贝只是相对的,如果一个对象内部只有基本数据类型,那用 clone() 方法获取到的就是这个对象的深拷贝,而如果其内部还有引用数据类型,那用 clone() 方法就是一次浅拷贝的操作)

getClass()方法

Java中获取类对象的几种方式

  1. 通过Class类的forName()方法获取,括号中的内容是类的全名
Class class=Class.forName("com.day03.Student");
  1. 通过类名.class获取
Class class=Student.class;
  1. 通过具体对象获取
Student student=new Student();
Class class=student.getClass();

线程创建

  1. 继承Thread类创建线程
  2. 实现Runnable接口创建线程
  3. 使用Callable和Future创建线程
  4. 使用线程池例如用Executor框架
    建议使用线程池创建线程,1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦。使用线程池创建线程的好处:
  • 降低资源消耗。通过重复利用机制已降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。

java异常分类

在这里插入图片描述

java.lang.Throwable是所有异常的根
java.lang.Error是错误信息
java.lang.Exception是异常信息

Error

是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

Exception

1.运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
2.非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

日志级别

日志记录器(Logger)的行为是分等级的:
    分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级 从高到低分别是 ERROR、WARN、INFO、DEBUG。
    通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别, 则应用程序中所有DEBUG级别的日志信息将不被打印出来。
    优先级高的将被打印出来。项目上生产环境时候建议把debug的日志级别重新调为warn或者更高,避免产生大量日志。

java IO流

字节流
在这里插入图片描述
字符流
在这里插入图片描述
处理流用到了装饰者模式

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值