39. 数组Array
- 数组因为是引用数据类型,所以数组对象存放堆中。
- 数组一旦创建,在Java中规定数组长度不可变。
- .length获取数组中元素。
- 数组中元素类型统一。
- 数组中元素内存地址是连续的。
- 所有的数组都是拿数组首元素的内存地址作为这个数组对象的地址。
- 数组这种存储结构的优缺点:优点是查询效率高,缺点是增删元素效率低,且很难在内存空间中找到一个连续的大空间,因此数组无法存储大数据量的数据。
- 定义一个一维数组
int[] array1;
- 初始化一维数组
int[] array2 = {1,2,3,4}; //静态初始化
int[] array3 = new int[4]; //动态初始化,长度为4,每个元素默认值为0
new int[]{1,2,3,4};
- main方法的
main(String[] args)
有什么用?用来接收用户输入的参数。 - 一维数组扩容:先新建一个大容量的数组,然后将小容量数组中的元素一个个拷进大数组。
System.arraycopy()
- 二维数组是一个特殊的一维数组。
- 初始化二维数组
int[][] array1 = {{1,2},{4,5,6,6,6},{1,2,3}}; //静态初始化
int[][] array2 = new int[3][4]; //动态初始化,三行四列
- Arrays工具类
排序:Arrays.sort(数组);
二分查找:Arrays.binarySearch(有序数组,目标值);
【工具类中的方法一般都是静态的,通过类名直接调用就行了。】
常用类:
40. String类
- JDK规定,双引号括起来的字符串是不可变的,直接存储在方法区的字符串常量池中。
String name变量中保存的是字符串对象"张三"在方法区的字符串常量池中的内存地址。
面试题:
- String.valueOf(xxx) 将xxx转为字符串
- 修改字符串StringBuffer类、StringBuilder类
- StringBuilder和 StringBuffer之间的最大不同在于 StringBuilder的方法不是线程安全的(不能同步访问)。
41. 八种基本数据类型对应的包装类
装箱:基本数据类型转换成引用数据类型;
Integer a = new Integer(123);
拆箱:引用数据类型转换成基本数据类型。
float b = a.floatValue();
int c = a.intValue();
JDK1.5后支持自动装箱和自动拆箱
Integer i = 100; //自动装箱
int j = i; //自动拆箱
42. BigDecimal类
多用于财务软件
BigDecimal bd1 = new BigDecimal(100);
BigDecimal bd2 = new BigDecimal(100);
BigDecimal bd3 = bd1.add(bd2);
43. 随机数
Random random = new Random();
int a = random.nextInt(101); //产生100以内的随机数
44. 枚举enum
枚举也是一种引用数据类型,枚举中的每一个数值可以看作常量。
45. 异常
- 异常在java中以类和对象形式存在。
- 异常有编译时异常和运行时异常,都是发生在运行阶段。区别在于 编译时异常必须在程序编写时预先处理,否则编译器报错。
- 所有的异常都发生在运行阶段,因为只有程序运行阶段才可以new对象,而异常的发生就是new异常对象。
- 编译时异常和运行时异常的区别:
a. 编译时异常发生概率比较高;
b. 编译时异常必须在程序编写时预先处理,否则编译器报错。 - 假设编译时异常和运行时异常都在程序编写时预先处理,那么程序确实是绝对安全的,到处都是处理异常的代码,但是程序员会很累。
- 例1:
- 例2:
为什么报错?
因为doSome()方法声明位置上使用了:throws ClassNotFoundException,而ClassNotFoundException继承了Exception类,是编译时异常,必须编写代码时处理,没有处理就会报错。
怎么处理?两种处理方式:
上抛类似于推卸责任,继续把异常传递给调用者。(异常被上抛后,后续代码不执行了。)
try…catch…捕获等于把异常拦下来了,异常真正的解决了。一般main方法中的异常建议使用try…catch…捕获。(try语句块中如果某行出现异常,该行后面的代码不会执行,try…catch…捕获异常之后,try…catch…外面的后续代码继续执行。)catch后面的小括号可以写具体的异常类型,也可以是该异常类型的父类型;catch可以写多个;catch写多个的时候,从上到下必须从小到大的写。
- finally子句中的语句一定会执行。
- 自定义异常
46. final、finally和finalize?
final是一个关键字,表示最终的,不变的。
finally在异常处理机制中与try联用,finally中的代码一定会执行。
finalize()是Object类中的一个方法,垃圾回收器。