常用类
包装类:
包装类 和 基本数据类型 的转换:
装箱: 基本数据类型 -> 包装类型
拆箱: 包装类型 -> 基本数据类型
jdk5 以后 实现了自动装箱和自动拆箱
自动装箱 底层调用的是 包装类.valueOf( );
包装类 -> String
方法1: 对象 + “”;
方法2: 对象.toString();
方法3: String.valueOf(对象);
String -> 包装类
方法1: 包装类.parseXxxx(String对象);
方法2: new 包装类(String 对象);
练习:
String:
字符串的字符使用Unicode字符编码,一个字符(无论字母或者汉字)都占2个字节
常用构造器:
1. new String()
2. new String( String str);
3. new String(char[] a);
4. new String(char[] a, int startIndex, int count);
String 实现了serializable 接口, 即 String可以串行化, 可以网络传输
String 实现了comparable 接口, 即 String可以比较大小
String 是final 类, 不能被其它类继承
String 有属性 private final char value[]; 用于存放字符串内容; 注意! value[] 是final 的,所以value[] 的地址不能修改,不能指向新的数组,但是value数组里面的值是可以修改的!!
两种创建String对象的区别:
1. String str = “hsp";
2. String str2 = new String( "hsp" );
第一种:先在常量池中查找是否已经存在“hsp”数据空间,如果已经有,则直接指向;如果没有,则在常量池中创建一个,然后str指向它。 str最终指向的是常量池的空间地址
第二种:现在堆中创建空间,里面有一个value 属性,指向常量池中的”hsp“空间,如果常量池中已经存在”hsp“,则value直接指向; 如果还没有,则创建后,value再指向它
练习:
一定要注意到底是指向堆,还是指向常量池!
重点:!!
注意:
方法调用时,会开辟一个新栈,新栈的变量和main栈的变量指向不同!
String常用方法:
1. str.length();
2. str.equals(str2);
3. str.equalsIgnoreCase(str2);
4. str.indexOf(); //找不到返回-1
5. str.lastIndexOf();
5. str.substring(startIndex); //截取startIndex后面的字符
6. str.substring(startIndex, endIndex); // 截取startIndex到endIndex之间的字符, 前闭后开
7. str.replace(); // str是不会改变的, 返回的值是替换过后的
8. split("分隔符"); // 返回一个数组
9. toCharArray(); //转换成字符数组
10. str1.compareTo(str2);
11. str.format();
StringBuffer:
直接父类是 AbstractStringBuilder, 其父类中有一个 char[] value 数组,字符串内容存在这个数组中,但它不是final类型的,所以内容是存在堆中的。
StringBuffer是一个final 类,所以不能被继承
String vs StringBuffer:
1.String保存的是字符串常量, 里面的值是不能改的, 每次内容的更新,实际上都是更改地址,所以效率低
2.StringBuffer保存的是字符串变量, 里面的值是可以更改的,所以不用更改地址,所以效率更高
StringBuffer的char[] value数组,默认容量时16; 也可以根据构造器指定大小。 StringBuffer sb = new StringBuffer(100);
StringBuffer sb = new StringBuffer(String str); //通过这个构造器创建的sb对象,char[] value数组的容量是 str.length() + 16
String 转成 StringBuffer:
方法1: 使用构造器
StringBuffer sb = new StringBuffer(String str); //返回的是StringBuffer对象,对str本身没有影响
方法2: 使用append方法
StringBuffer sb = new StringBuffer();
sb = sb.append(str);
StringBuffer 转成 String:
方法1:
StringBuffer sb = new StringBuffer(“hspedu”);
String s = sb.toString();
方法2:
String str = new String(sb);
StringBuffer常用方法:
1. sb.insert(index, str);
2. sb.append(str);
3. sb.delete(start,end); //左闭右开
4. sb.replace(start, end, str);
5. sb.indexOf(str); // 找不到返回-1
6. sb.length();
注意:
sb.append(str); // 调用的是AbstractStringBuilder 的 appenNull方法, 它会把null转换成字符串添加到sb的数组中
new StringBuffer(str) //底层调用super(str.length() + 16) ,这里会造成空指针异常
StringBuilder:
此类提供了与StringBuffer兼容的API, 但不保证同步(StringBuilder 存在线程安全的问题)
如果是单线程的情况下,优先使用StringBuilder, 因为它比StringBuffer快
特点都和StringBuffer一样,唯独StringBuilder的方法没有做互斥处理,没有synchronized关键字,所以在单线程的情况下使用StringBuilder
String vs StringBuffer vs StringBuilder:
1. StringBuffer 和 StringBuilder 非常类似, 都是代表可变的字符序列, 而且方法也一样
2. String是不可变字符序列,效率低, 但复用率高(因为常量池内不会存在重复的字符串常量)
3. StringBuffer:可变字符序列, 效率较高(增删), 线程安全
4. StringBuilder:可变字符序列, 效率最高, 线程不安全
5. 如果需要对字符串做大量修改,不要使用String, 而要用StringBuffer,如果是单线程就用StringBuilder
总结:
1. 如果需要对字符串做大量修改,不要使用String, 而要用StringBuffer,如果是单线程就用StringBuilder
2. 如果不需要对字符串做修改, 被多个对象引用,则使用String,如 配置信息;
Math类:
1. Math.abs();
2. Math.pow(num, power); //返回第一个参数的第二个参数次方。
3. Math.ceil(); //向上取整
4. Math.floor(); //向下取整
5. Math.round(); //四舍五入
6. Math.sqrt(num); // 开方
7. Math.max( num1, num2); //返回两个参数最大的
8. Math.min( num1, num2);
9. Math.random(); //返回[0,1) 之间的数; 公式: (int) (a + Math.random() * (b-a+1) )
Arrays 类:
1. Arrays.toString(arr); //返回数组的字符串形式
2. Arrays.sort(arr); //注意: 使用此方法,会改变arr的本身
3. int index = Arrays.binarySearch(arr, num); // arr 必须是已经排序好的数组! 二分查找; 如果没找到,就返回 这个num 在arr中 本应该存在的位置 + 1, 然后取负数。
4. Integer[] newArr = Arrays.copyOf(arr, arr.length); //从arr数组中,拷贝arr.length个元素 到newArr中。
5. Arrays.fill( arr, num ); // 把arr中的元素,全都替换成num
6. boolean equal = Arrays.equals( arr1, arr2); //比较两个数组元素内容是否完全相同
7. List asList = Arrays.asList (1,10,22,56,77); //将一组数 转成 List集合, 运行类型是ArrayList
System 类:
1. System.exit(0); //0表示状态,正常状态
2. System.currentTimeMillens(); //距离1970-1-1的毫秒数
3.System.gc();
4. System.arraycopy( 源数组,源数组需要开始拷贝的下标,目标数组, 需要拷贝的元素个数 );
BigInteger:
BigInteger bi = new BigInteger("放一个数字的字符串");
BigInteger 不能直接加减乘除,需要使用对应的方法。且只能和BigInteger运算。
add, substract, multiply, divide
BigInteger bi2 = new BigInteger("100");
BigInteger res = bi.add( bi2 );
BigDecimal: 保存一个精度很高的小数
BigDecimal bd = new BigDecimal(放一个小数的字符串);
BigDecimal bd2 = new BigDecimal("1.1");
BigDecimal res = bd.add(bd2)
BigDecimal res2 = bd.divide(bd2,BigDecimal.ROUND_CEILING); //这里可能除不尽,会抛出异常,需要传入第二个参数表示 精度