一、包装类
1. 包装类分类
- 针对八种基本数据类型相应的引用类型 一 包装类
- 有了类的特点,就可以调用类中的方法。
2. 装箱 和 拆箱
演示 包装类 和 基本数据类型的相互转换,这里以int 和 Integer演示
- jdk5 前的 手动 装箱和拆箱方式,装箱: 基本类型->包装类型, 反之,拆箱
- idk5 以后(含idk5)的 自动 装箱和拆箱方式
- 自动装箱底层调用的是valueOf方法,比如Integer.valueOf()
- 其它包装类的用法类似
测试题小结:三元运算符是一个整体, : 前后都需要执行 ,经过拆箱后,int 自动类型提升为double
3.包装类型和String类型的相互转换
(案例演示,以Integer和String转换为例)
4. Integer类和Character类的常用方法
(用的时候再查,太多了)
5.Integer类面试题
-
Integer创造机制
二、String类
1. String类的理解
-
String 对象用于保存字符串,也就是一组字符序列
-
字符串常量对象是用双引号括起的字符序列。
(例如:"你好”、“12.97”、"boy"等) -
字符串的字符使用Unicode字符编码一个字符(不区分字母还是汉字)占两个字节
-
String类(有很多构造器)较常用构造器如下:
String s1 = new String(); //
Strings2 = new String(String original);
Strings3 = new String(charll a);
Strings4 = new String(charll a,int startlndex,int count)
Strigs5= new String(byte[ ] b) -
String 类实现了
接口 Serializable【string 可以串行化:可以在网络传输】
接口 Comparable【string 对象可以比较大小】
-
String 有属性 private final char value []; 用于存放字符串内容
-
一定要注意: value 是一个final类型,不可以修改
(这里final修饰的是引用类型的数组value,对于引用类型来说 ,final修饰的是地址,所以地址是不可以改变的,因为改变里面的值不会影响地址,所以可以更改里面的值)
2.创建String对象 的 两种方式
(1) 方式一:直接赋值 String s=“hsp”
方式一:先从常量池查看是否有"hsp"数据空间,如果有,直接指向;如果。1.没有则重新创建,然后指向。s最终指向的是常量池的空间地址
(2) 方式二:调用构造器 String s2 = new String("hsp”);
方式二:先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间如果常量池没有"hsp",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址
3.String测试题
1.理解b.intern() --> 返回常量池的地址
2.p1.name==“hspedu”,因为 hspedu 是常量所以返回的是池中的地址
3. String对象特征
- 字符串内容不可变
- 编译器会优化,如果创建两个对象(hello和helloabc),hello就没人用了
- c=a+b!!!!!!
如图
小结4.重要!!!change栈执行完 会销毁,输出ex.str 和ex.ch 是通过main方法
4.String类 的 常用方法
三、StringBuffer 类
1.基本介绍
- java.StringBuffer代表可变的字待序列,可以对字符串内容进行增删
- 很多方法与String相同,但StringBuffer是可变长度的
- StringBuffer是一个容器,
2.StringBuffer 类细节
- StringBuffer 的直接父类 是 AbstractstringBuilder
- StringBuffer 实现了 Serializable,即stringBuffer的对象可以串行化
- 在父类中 AbstractstringBuilder 有属性 char[] value,不是final11该value 数组存放字符串内容,引出存放在堆中的
- StringBuffer 是一个 final类,不能被继承
- 因为StringBuffer 字符内容是存在 char[] value,所有在变化(增加/删除不用每次都更换地址(即不是每次创建新对象),所以效率高于 String
3. String Vs stringBuffer
- String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低!/private final char valuel];
- StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率较高
- //char[ ] value; // 这个放在堆
4. StringBuffer构造器 使用
3个常用构造器
5.String和StringBuffer相互转换
6.StringBuffer常见方法
- 增 append
- 删 delete(start,end)
- 改 replace(start,end,string) //将start----end 间的内容替换掉,不含end
- 查 indexOf //查找子串在字符串第1次出现的索引,如果找不到返回-1
- 插 insert
- 获取长度 length
四、StringBuilder类
1.基本介绍
- 一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步(StringBuilder 不是线程安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类因为在大多数实现中,它比 StringBuffer 要快
- 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法以接受任意类型的数据。
2.StringBuilder常用方法
StringBuilder 和 StringBuffer 均代表可变的字符序列,方法是一样的,所以使用和StringBuffer一样,看老师演示.[参考StringBuffer].
3.使用细节
- StringBuilder 继承 AbstractStringBuilder 类
- 实现了 Serializable,说明StringBuilder对象是可以串行化
(对象可以网络传输,可以保存到文件) - StringBuilder 是final类,不能被继承
- StringBuilder 对象字符序列仍然是存放在其父类 AbstractstringBuilder的 char[ ] value;因此,字符序列是堆中
- StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,因此在单线程的情况下使用StringBuilder
五、 String、StringBuffer 和StringBuilder的比较
- StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法也一样
- String: 不可变字符序列,效率低,但是复用率高
- StringBuffer:可变字符序列、==效率较高(增删)、线程安全, ==看源码
- StringBuilder:可变字符序列、效率最高、线程不安全
- String使用注意说明:
string s=“a”;//创建了一个字符串s+=“b”😕/实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能
【结论:如果我们对String 做大量修改,不要使用String】
六、String、StringBuffer 和StringBuilder的选择
使用的原则,结论:
- 如果字符串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder
- 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
- 如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
- 如果我们字符串很少修改,被多个对象引用,使用String,(比如配置信息等)
【StringBuilder 的方法使用和 StringBuffer 一样】
【效率:StringBuilder >StringBuffer > String】
七、Math 类
1.Math类常见方法
- abs 绝对值
- pow 求幂
- ceil 向上取整
- floor 向下取整
- round 四舍五入
- sqrt 求开方
- random 求随机数
//思考:请写出获取 a-b之间的一个随机整数,a,b均为整数?2-7 - max 求两个数的最大值
- min 求两个数的最小值
八、Arrays 类
Arrays 类 常见方法
1. toString 返回数组的字符串形式
Arrays.toString(arr)
2. sort 排序(自然排序 和 定制排序)
Integer arr[]= {1,-1,7,0,89};
3. binarySearch 通过二分搜索法进行查找,要求必须排好序
int index = Arrays.binarySearch(arr, 3);
(若数组中不存在该元素,就返回return -(low+1);)
4. copyOf 数组元素的复制
Integer[] new Arr = Arrays.copyOf(arr, arr.length);
4.1 从 arr 数组中,拷贝 arr.length个元素到 newArr数组中
4.2 如果拷贝的长度 > arr.length 就在新数组的后面 增加 null
4.3 如果拷贝长度**<0就 抛出异常** NegativeArraySizeException
4.4 该方法的底层使用的是 System.arraycopy()
5. fi 数组元素的填充
Integer[l num = new Integer[]{9,3,2};
Arrays.fill(num, 99);
6. equals 比较两个数组元素内容是否完全一致
boolean equals = Arrays.equals(arr, arr2)
7. asList 将一组值,转换成list
List asList = Arrays.asList(2,3,4,5,6,1);
System.out.println(“asList=” + asList);
- asList方法,会将(2,3,4,5,6,1)数据转成一个List集合
- 返回的 asList 编译类型 List(接口)
- asList 运行类型 java.util.Arrays#ArrayList,
是Arrays类的静态内部类 private static class ArrayList extends AbstractListimplements RandomAccess,java.io.Serializable
九、System 类
System类 常见方法
-
exit 退出当前程序
-
arraycopy:复制数组元素,比较适合底层调用,一般使用Arrays.copyOf完成复制数组
int[l src={1,2,3};
int[l dest = new int[3];
System.arraycopy(src, 0, dest, 0, 3};
-
currentTimeMillens:返回当前时间距离1970-1-1 的毫秒数
-
gc: 运行垃圾回收机制 System.gc();
十、BigInteger和BigDecimal介绍
1.应用场景:
- Biglnteger适合保存比较大的整型(long不够用时)
- BigDecimal适合保存精度更高的浮点型(小数)
2.常见方法
(进行 + - / *,需要使用对应的方法不能直接 + - / *)
- add 加
- subtract减
- multiply乘
- divide除
(数字需要" "包裹)