本篇文章记录一些java基本信息面试中可能会问到,以及工作中可能会造成写出bug的问题记录
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或者fJava中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)public : 对所有类可见。使用对象:类、接口、变量、方法protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。请注意以下方法继承的规则:
父类中声明为 public 的方法在子类中也必须为 public。父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。父类中声明为 private 的方法,不能够被继承。为了实现一些其他的功能,Java 也提供了许多非访问修饰符。
static 修饰符,用来修饰类方法和类变量。final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。abstract 修饰符,用来创建抽象类和抽象方法。synchronized 和 volatile 修饰符,主要用于线程的编程。synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。
序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。 该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。 实例 public transient int limit = 55; // 不会持久化 public int b; // 持久化
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 一个 volatile 对象引用可能是 null。
当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。&&为短路逻辑运算符(第一个操作为false就停止),&逻辑运算符(左右操作均会判断)
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型),例: ( Object reference variable ) instanceof (class/interface type)
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。 break 跳出最里层的循环,并且继续执行该循环下面的语句。
continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。 在 for 循环中,continue 语句使程序立即跳转到更新语句。 在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。
JDK1.8 新增LocalDate、LocalTime、LocalDateTime代替原先Date,SimpleDateFormat线程不安全,LocalDate、LocalTime、LocalDateTime线程安全
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map)。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是抽象类,最后是实现类,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等 集合框架体系如图所示
自定义类 需要判断对象在业务逻辑上是否相等,需要重写hashCode和equals, 在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。 在这种情况下,原生的equals方法就不能满足我们的需求了。在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回 同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。 所以这个时候我们需要重写equals方法,来满足我们的业务系统上的需求。那么为什么在重写equals方法的时候需要重写hashCode方法呢? 如果不重写hashCode的话,可能导致HashSet、HashMap不能正常的运作
finalize() 方法 Java 允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象。 例如,你可以使用 finalize() 来确保一个对象打开的文件被关闭了。 在 finalize() 方法里,你必须指定在对象销毁时候要执行的操作。 finalize() 一般格式是: protected void finalize() { // 在这里终结代码 } 关键字 protected 是一个限定符,它确保 finalize() 方法不会被该类以外的代码调用。 当然,Java 的内存回收可以由 JVM 来自动完成。如果你手动使用,则可以使用上面的方法。
Java中获取类对象的几种方式
通过Class类的forName()方法获取,括号中的内容是类的全名 Class class=Class.forName("com.day03.Student"); 通过类名.class获取 Class class=Student.class; 通过具体对象获取 Student student=new Student(); Class class=student.getClass();java.lang.Throwable是所有异常的根 java.lang.Error是错误信息 java.lang.Exception是异常信息
是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。
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或者更高,避免产生大量日志。
字节流 字符流 处理流用到了装饰者模式
