java基础知识-自我总结
程序员文章站
2022-06-30 20:48:14
...
1、java基础数据类型
java基础数据类型包括 : byte short int long float double char boolean
二进制位数如下 : 8 16 32 64 16 32 16 1
与之对应的包装类为: Byte Short Integer Long Float Double Character Boolean
2、java的自动装箱拆箱机制
在java1.5以后,java提供了自动装箱拆箱机制,可以将基本数据类型与包装类互相转换
例如:
Integer i =100;//自动装箱,编译器执行Integer.valueof(100);
int j = i; //自动拆箱,编译器执行i.intValue()
3、== 与 equals的作用于区别
== :比较的是两个对象的引用是否相同,或比较基本数据类型是否相等
euqals:比价的是两个对象的内容是否相同,常用来比较字符串对象
经验:Integer值的范围在-128~127之间,可以直接在缓存中读取,超出范围则会创建新的对象
例:int i=127;int j=200;syso(i==j);输出:false;
3、关键字final
- 修饰变量时,用以定义常量;
- 修饰方法时,方法不能被重写(Override);
- 修饰类时,类不能被继承。
4、数组
3种创建方式:
int[] arr1 = {1,2,3,4}; //正确
int[] arr2 = new int[4]; //正确
int[] arr3 = new int[]{1,2,3,4}; //正确
int[] arr4 = new int[4]{1,2,3,4};s //错误,编译不通过
数组具【length属性】
数组常发生数组越界异常---ArrayIndexOutOfBoundsException
5、字符串
创建方式:
1.String a = "abc";//先将"ss"存储在字符串常量池中,再返回引用
2.String a = new String("a");////创建新对象,使用的"ss"已经在池中
String s3="Prog"+"gramming"; //创建3个对象,均存储在池中
字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价。JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化。为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池。如果字符串已经存在池中,就返回池中的实例引用。如果字符串不在池中,就会实例化一个字符串并放到池中。Java能够进行这样的优化是因为字符串是不可变的,可以不用担心数据冲突进行共享。
小题
1.String str1 = "str";
2.String str2 = "ing";
3.String str3 = "str" + "ing";
4.String str4 = str1 + str2;
5.System.out.println(str3 == str4);
6.String str5 = "string";
7.System.out.println(str3 == str5);
结果是false,true。后一个结果应该很好理解,因为第3行代码执行时已经将”string”存储在常量池中,第6行代码返回的是常量池中同一字符串”string”的引用,所以结果为true。前一个结果可能有点疑惑,后来把这段代码编译反汇编后发现执行第3行代码时是直接生成的String对象,内容为”string”;而执行第四行代码时是借助new StringBuilder().append(“str”).append(“ing”).toString(),关键在于StringBuilder中定义的toString()方法,返回的是一个重新创建的String对象,并没有存在池中,所以前一个结果为false。
//StringBuilder.toString()源代码
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
StringBuilder/StringBuffer
StringBuilder线程不安全,但效率高;
StringBuffer线程安全,但效率低。
线程安全:某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成
List
特点是有序并且按线性方式存储,可以根据元素的下标进行精准的控制。
ArrayList是顺序表的体现,底层用数组实现。
数组在线性表中的分类属于顺序表,即:顺序表中的数据元素存储是连续的,内存划分的区域也是连续的。
LinkedList是链表的体现,使用双向链表实现。(链表的三种形式:单向链表、双向链表、循环链表)
链表在物理存储上通常是非连续、非顺序的方式存储的,但是数据元素的逻辑顺序是连续的,实现方式是通过链表中的引用来实现。
Stack是Vector的子类,而Vector实现了List<E>接口;是栈结构的代表。
栈和队列是特殊的线性表,或者说是受到限制的线性表,其限制是仅允许在线性表的尾部进行添加和删除操作,这一端被称为栈顶,另一端称为栈底。