当前位置:网站首页 > Java基础 > 正文

java基础数值类型



1.JDK和JRE的区别

JRE是Java Runtime Environment,JAVA程序的运行环境。

JDK是Java Development Kit,JAVA的开发工具包,内置了JRE,同时含有JAVA程序的编译器javac、JAVA程序的调试和分析工具等额外工具。

2.==和equals

宽泛来说,==是引用比较,比较的是内存地址,而equals是值比较,比较的是对象的值。equals默认其实也是引用比较,是由于重写了equals方法才做到了值比较。

注意上面的宽泛说法,因为有一些特殊情况:

  • ==对于基础类型来说是值比较
  • 对于基础类型封装类对象,比如Long,Integer,在-128~ 127之间==也是值比较

(因为Integer,Long包装类在自动装箱时如果值在 -128~ 127之间时会共享缓存值 )

  • 包装类的 ==运算在遇到算术运算符会自动拆箱
  • 包装类的 equals 方法先会判断比较的类型是否 instanceof包装类

3.equals和hashCode

equals最典型的就是比较对象值。

hashCode常常用来在散列存储中确定对象位置的,提高查找效率。

Java规范:如果两个对象equals相同,那么它们的hashCode值一定要相同。为了实行这个规范重写equals方法,一定要重写hashCode方法。但是hashCode相同只是会将对象存放在同一个地方,但并不意味着equals一定相同。

类似set这样的散列集合,为了效率是先比较两者的hashCode再比较equals,所以为什么有上面的前提规范,并且需要重写equals必须重写hashCode也是因为,如果逻辑上两个对象相等,由于hashCode不相同的话,会被当做不同对象,也会影响效率。

4.重写和重载

重写是重写父类的方法体(不改变方法返回类型[可以是子类]、参数、名称);重载是同一个方法名(不同的返回值、参数),是类多态性的提现。

5.static和final

static常被用来修饰变量、方法、代码块,static修饰的代码只会在类加载时候初始化或者被执行一次。static可以被修改,类似全局变量。

final常被用来修饰变量、方法、类,被修饰的类不能被继承,方法不能被重写,变量不能被更改引用,但是变量的值可以被修改。final变量的初始化要么在定义时要么在构造函数里。

6.String a = "a"和String a = new String("a")

前者是把"a"这个值赋值给a变量,而后者是先构造了一个新的值为"a"的对象,然后把这个新对象引用赋值给a。

7.Math.round(n)

round是一个四舍五入方法,规则是加0.5后取整,而不是按照数的绝对值进行四舍五入的。

8.finally和return

finally语句块会执行,但是finally中对try中return变量的操作是不生效的

try和finally都包含return,return 值会以 finally 语句块 return 值为准

9.replace和replaceAll

replace是字符/字符串的替换,而replaceAll是基于正则表达式的替换。

10.finally语句块一定会执行?

不一定,在try-catch语句之前就发生异常导致程序中断或者退出。

11.String是基础类型嘛?

不是,Java 中 8 种基础的数据类型:byte、short、char、int、long、float、double、boolean

12.JAVA常用的字符串操作类有哪些?

String : final 修饰,String 类的方法都是返回 new String。即对 String 对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。

StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。

StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以 new StringBuilder 对象,调用 StringBuilder 对象的 append()、replace()、delete() 等方法修改字符串。

String对象每次的修改操作都是产生一个新的String对象,StringBuilder和StringBuffer都是操作一个对象,效率高。但是一般建议使用StringBuilder有速度优势,如果有线程安全问题,那么建议使用线程安全的StringBuffer。

13.字符串反转实现

使用 StringBuilder 或 StringBuffer 的 reverse 方法

new StringBuilder(str).reverse().toString()

14.String的常用方法

equals:字符串是否相同

indexOf:目标字符或字符串在源字符串中位置下标

valueOf:其他类型转字符串

isEmpty:字符串长度是否为0

length:字符串字符数

replaceAll:带正则字符串替换

split:以某正则表达式分割字符串

substring:截取字符串

toLowerCase:字符串转小写

15.普通类和抽象类

抽象类不能被实例化,只有声明方法(但不是必须要有抽象方法),无需实现(但不是不能实现)。eg:

 

抽象类不能用static、private、final修饰类,非抽象子类必须实现方法。

16.接口和抽象类

抽象类可以有成员变量,非抽象方法和构造方法,接口方法只能用public修饰。

17.访问权限修饰符

java如何把File文件转成字符串 file转string java_字符串

18.Java位运算符

eg:3<<4=48(将一个数左移n位,就相当于乘以了2的n次方)

19.Javap

javap 是 Java class文件分解器,可以反编译,也可以查看 java 编译器生成的字节码等。

20.try-catch-finally哪个部分可以省略?

catch 和 finally 语句块可以省略其中一个

21.throw和throws

throw可以在方法体内由程序员自行抛出错误。

throws不能单独使用,需要更在定义的方法参数后面,表示由方法的调用者进行处理。

22.常见的异常类有哪些

异常可以分为checked exception和unchecked exception。

具体异常类的有:

空指针异常类:NullPointerException

集合下标越界异常:IndexOutOfBoundsException

类型强制转换异常:ClassCastException

输入输出异常:IOException

23.反射

反射就是在运行时获取类的相关信息(属性、方法、注解...),并且可以调用类的方法。

反射使用不好,对性能影响比较,一般项目中很少直接使用。

反射主要用于底层的框架中,Spring 中就大量使用了反射,比如:

  • 用 IoC 来注入和组装 bean
  • 动态代理、面向切面、bean 对象中的方法替换与增强,也使用了反射
  • 定义的注解,也是通过反射查找

24.代理

简而言之,代理就是代理目标类去执行它的方法,在前后过程中可以加入自己的业务逻辑。

代理分为静态代理和动态代理,静态代理就是通过手工编码的方式实现代理,动态代理就是通过反射等手段省去手动创建代理类的过程。

最常用方便的实现就是通过spring aop+注解实现

25.序列化和反序列化

序列化就是将对象转换成字节流的过程;反序列化就是将字节流转换成对象的过程。

(网络是以字节的形式传输数据的。声明为 static 和 transient 的成员变量,不能被序列化。static 成员变量是描述类级别的属性,transient 表示临时数据)

26.对象克隆的使用场景

传递对象引用,但又不想对象被修改。

eg:

方法需要 return 引用类型,但又不希望自己持有引用类型的对象被修改。

程序之间方法的调用时参数的传递。有些场景为了保证引用类型的参数不被其他方法修改,可以使用克隆后的值作为参数传递。

27.深拷贝和浅拷贝

同类对象有时候需要拷贝值,对于基本数据类型,两者都是赋值操作,但是如果属性是引用类型,浅拷贝只是引用地址赋值,如果引用的值改变,则所有关联该引用的对象都会受到影响,深拷贝就是拷贝时,引用类型重新构建对象赋值。

28.&和&&

&逻辑与,两边表达式都会参与计算;&&短路与,左边为false的情况,右边就不会进行计算。

&同时是整数的位运算符

29.数组特征

在内存中是一块连续的空间,长度是确定的,元素类型也只能是同一种类型。

30.this和super

this是对象内部指代自身的引用,super是当前对象的直接父类对象的引用。

31.对象的构造方法

先是调用父类的构造方法,再执行自己构造函数里的相关内容。

32.向上转型和向下转型

父类引用可以指向子类对象,子类引用不能指向父类对象。

把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型

把指向子类对象的父类引用赋给子类引用叫向下转型,要强制转型

向上转型会丢失子类特有的方法,但是子类overriding父类的方法,子类方法是有效的

33.instanceof

instanceof 运算符是用来在运行时判断对象是否是指定类及其父类的一个实例。

比较的是对象,不能比较基本类型

34.Java的垃圾回收机制

Java 语言不需要程序员直接控制内存回收,由 JVM 在后台自动回收不再使用的内存,提高性能。

35.为什么要有包装类

基本数据类型过于java基础数值类型简单,不支持泛型,不符合面向对象思维,包装类提供了更多的方法,方便使用。

36.java.sql.Date和java.util.Date的区别

前者被设计作为数据库Date类型相对应的一个时间类型,特定在sql语句中使用的,继承自后者。

37.面向对象的特性

抽象性:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。

继承性:指子类拥有父类的全部特征和行为,这是类之间的一种关系。Java 只支持单继承。

封装性:封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。封装的目的在于保护信息。

多态性:多态性体现在父类的属性和方法被子类继承后或接口被实现类实现后,可以具有不同的属性或表现方式。

38.内存泄漏和内存溢出

内存溢出(out of memory):指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory。

内存泄露(memory leak):指程序在申请内存后,无法释放已申请的内存空间,内存泄露堆积会导致内存被占光。

memory leak 最终会导致 out of memory。

39.对象创建方式

用 new 语句创建对象

运用反射,调用 java.lang.Class 或 java.lang.reflect.Constructor 类的 newInstance() 方法

调用对象的 clone() 方法

运用反序列化手段,调用 java.io.ObjectInputStream 对象的 readObject() 方法(不会调用构造函数)

40.存在i+1<i的数吗?

Integer.MAX_VALUE

41.可序列化对象为什么要定义serialversionUID值?

简单来说,JAVA序列化的机制是通过判断类的serialVersionUID来验证的版本一致的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID于本地相应实体类的serialVersionUID进行比较。如果相同说明是一致的,可以进行反序列化,否则会出现反序列化版本一致的异常,即是InvalidCastException。

42.getDeclaredFields()和getFields()

getDeclaredFields(): 获取所有本类自己声明的属性, 不能获取父类和实现的接口中的属性

getFields(): 只能获取所有 public 声明的属性, 包括获取父类和实现的接口中的属性

43.byte表示的数值范围

-128 - 127

44.String可以被继承吗?

String 类在 JDK 中被广泛使用,为了保证正确性、安全性,String 类是用 final 修饰,不能被继承,方法不可以被重写。

45.String s="a"+"b"+"c"+"d";创建了几个对象?

1个。Java 编译器对字符串常量直接相加的表达式进行优化,不等到运行期去进行加法运算,在编译时就去掉了加号,直接将其编译成一个这些常量相连的结果。

46.类的实例化方法调用顺序

类加载器实例化时进行的操作步骤:加载 -> 连接 -> 初始化

  1. 代码书写顺序加载父类静态变量和父类静态代码块
  2. 代码书写顺序加载子类静态变量和子类静态代码块
  3. 父类非静态变量(父类实例成员变量)
  4. 父类构造函数
  5. 子类非静态变量(子类实例成员变量)
  6. 子类构造函数

47.泛型

泛型是把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊类型。

利用这种特性,我们可以做一些比较灵活的事情。

48.sleep()和wait()有什么区别

sleep() 是 Thread 类的静态本地方法;wait() 是Object类的成员本地方法

sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常Exception in thread "Thread-0" java.lang.IllegalMonitorStateException

版权声明


相关文章:

  • java编写插件需要基础吗2024-10-22 16:58:00
  • java script 基础教程2024-10-22 16:58:00
  • java声明基础器变量2024-10-22 16:58:00
  • java基础语法自动类型转换2024-10-22 16:58:00
  • java集合类基础教程2024-10-22 16:58:00
  • Java基础应用与实战2024-10-22 16:58:00
  • java基础教程笔记2024-10-22 16:58:00
  • java基础入门看了2024-10-22 16:58:00
  • 计算机编程基础java2024-10-22 16:58:00
  • 0基础怎么自学java2024-10-22 16:58:00