常用类

Day16_数组

 

 

包装类:

Day16_包装类_02

 

 

Day16_字符串_03

 

 

 

Day16_数组_04

 

 

 

Day16_字符串_05

 

 

 

包装类 和 基本数据类型 的转换:

装箱: 基本数据类型 -> 包装类型

拆箱: 包装类型 -> 基本数据类型

jdk5 以后 实现了自动装箱和自动拆箱

 

自动装箱 底层调用的是 包装类.valueOf( );

 

 

Day16_常量池_06

 

 

Day16_构造器_07

 

 

Day16_常量池_08

 

 

包装类  ->  String

方法1: 对象 + “”;

方法2: 对象.toString();

方法3: String.valueOf(对象);

 

String -> 包装类

方法1: 包装类.parseXxxx(String对象);

方法2: new 包装类(String 对象);

 

练习:

Day16_常量池_09

 

 

 

 Day16_字符串_10

 

 

 

 

String:

字符串的字符使用Unicode字符编码,一个字符(无论字母或者汉字)都占2个字节

Day16_常量池_11

 

 

常用构造器:

  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数组里面的值是可以修改的!!

Day16_字符串_12

 

 

 

两种创建String对象的区别:

1. String str = “hsp";

2. String str2 = new String( "hsp" );

第一种:先在常量池中查找是否已经存在“hsp”数据空间,如果已经有,则直接指向;如果没有,则在常量池中创建一个,然后str指向它。 str最终指向的是常量池的空间地址

第二种:现在堆中创建空间,里面有一个value 属性,指向常量池中的”hsp“空间,如果常量池中已经存在”hsp“,则value直接指向; 如果还没有,则创建后,value再指向它

 

Day16_常量池_13

 

 

练习:

一定要注意到底是指向堆,还是指向常量池! 

 

 

 

Day16_数组_14

 

 

Day16_常量池_15 

Day16_构造器_16

 

 

 重点:!!

 

 注意:

方法调用时,会开辟一个新栈,新栈的变量和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);   //这里可能除不尽,会抛出异常,需要传入第二个参数表示 精度