/*
常用类 翻API帮助文档
*/
一、String类
1.String
- String对象 变量值 不可变
- JDK中用双引号括起来的字符串,都直接存储在 字符串常量池 中 // 字符串常量池在堆内存中 运行时常量池在方法区
// 因为字符串使用频率高,放在常量池 提高执行效率
- String s1 = "张三"; // s1 保存的是对象的内存地址
- 垃圾回收器不会释放常量
- "test01".equals(test02); //这样写可以避免空指针异常 ( "test01" 是一个字符串String对象 所以也可以调用方法
2.常用构造方法 // 帮助文档
- byte[] btye;
String s2 = new String(byte);
3.常用方法 // 帮助文档
// String类当中常用方法。
//1(掌握).char charAt(int index)
char c = "中国人".charAt(1); // "中国人"是一个字符串String对象。只要是对象就能“点.”
System.out.println(c); // 国
// 2(了解).int compareTo(String anotherString)
// 字符串之间比较大小不能直接使用 > < ,需要使用compareTo方法。
int result = "abc".compareTo("abc");
System.out.println(result); //0(等于0) 前后一致 10 - 10 = 0
int result2 = "abcd".compareTo("abce");
System.out.println(result2); //-1(小于0) 前小后大 8 - 9 = -1
int result3 = "abce".compareTo("abcd");
System.out.println(result3); // 1(大于0) 前大后小 9 - 8 = 1
// 拿着字符串第一个字母和后面字符串的第一个字母比较。能分胜负就不再比较了。
System.out.println("xyz".compareTo("yxz")); // -1
// 3(掌握).boolean contains(CharSequence s)
// 判断前面的字符串中是否包含后面的子字符串。
System.out.println("HelloWorld.java".contains(".java")); // true
System.out.println("http://www.baidu.com".contains("https://")); // false
// 4(掌握). boolean endsWith(String suffix)
// 判断当前字符串是否以某个子字符串结尾。
System.out.println("test.txt".endsWith(".java")); // false
System.out.println("test.txt".endsWith(".txt")); // true
System.out.println("fdsajklfhdkjlsahfjkdsahjklfdss".endsWith("ss")); // true
// 5(掌握).boolean equals(Object anObject)
// 比较两个字符串必须使用equals方法,不能使用“==”
// equals方法有没有调用compareTo方法? 老版本可以看一下。JDK13中并没有调用compareTo()方法。
// equals只能看出相等不相等。
// compareTo方法可以看出是否相等,并且同时还可以看出谁大谁小。
System.out.println("abc".equals("abc")); // true
// 6(掌握).boolean equalsIgnoreCase(String anotherString)
// 判断两个字符串是否相等,并且同时忽略大小写。
System.out.println("ABc".equalsIgnoreCase("abC")); // true
// 7(掌握).byte[] getBytes()
// 将字符串对象转换成字节数组
byte[] bytes = "abcdef".getBytes();
for(int i = 0; i < bytes.length; i++){
System.out.println(bytes[i]);
}
// 8(掌握).int indexOf(String str)
// 判断某个子字符串在当前字符串中第一次出现处的索引(下标)。
System.out.println("oraclejavac++.netc#phppythonjavaoraclec++".indexOf("java")); // 6
// 9(掌握).boolean isEmpty()
// 判断某个字符串是否为“空字符串”。底层源代码调用的应该是字符串的length()方法。
//String s = "";
String s = "a";
System.out.println(s.isEmpty());
// 10(掌握). int length()
// 面试题:判断数组长度和判断字符串长度不一样
// 判断数组长度是length属性,判断字符串长度是length()方法。
System.out.println("abc".length()); // 3
System.out.println("".length()); // 0
// 11(掌握).int lastIndexOf(String str)
// 判断某个子字符串在当前字符串中最后一次出现的索引(下标)
System.out.println("oraclejavac++javac#phpjavapython".lastIndexOf("java")); //22
// 12(掌握). String replace(CharSequence target, CharSequence replacement)
// 替换。
// String的父接口就是:CharSequence
String newString = "http://www.baidu.com".replace("http://", "https://");
System.out.println(newString); //https://www.baidu.com
// 把以下字符串中的“=”替换成“:”
String newString2 = "name=zhangsan&password=123&age=20".replace("=", ":");
System.out.println(newString2); //name:zhangsan&password:123&age:20
// 13(掌握).String[] split(String regex)
// 拆分字符串
String[] ymd = "1980-10-11".split("-"); //"1980-10-11"以"-"分隔符进行拆分。
for(int i = 0; i < ymd.length; i++){
System.out.println(ymd[i]);
}
String param = "name=zhangsan&password=123&age=20";
String[] params = param.split("&");
for(int i = 0; i <params.length; i++){
System.out.println(params[i]);
// 可以继续向下拆分,可以通过“=”拆分。
}
// 14(掌握)、boolean startsWith(String prefix)
// 判断某个字符串是否以某个子字符串开始。
System.out.println("http://www.baidu.com".startsWith("http")); // true
System.out.println("http://www.baidu.com".startsWith("https")); // false
// 15(掌握)、 String substring(int beginIndex) 参数是起始下标。
// 截取字符串
System.out.println("http://www.baidu.com".substring(7)); //www.baidu.com
// 16(掌握)、String substring(int beginIndex, int endIndex)
// beginIndex起始位置(包括)
// endIndex结束位置(不包括)
System.out.println("http://www.baidu.com".substring(7, 10)); //www
// 17(掌握)、char[] toCharArray()
// 将字符串转换成char数组
char[] chars = "我是中国人".toCharArray();
for(int i = 0; i < chars.length; i++){
System.out.println(chars[i]);
}
// 18(掌握)、String toLowerCase()
// 转换为小写。
System.out.println("ABCDefKXyz".toLowerCase());
// 19(掌握)、String toUpperCase();
System.out.println("ABCDefKXyz".toUpperCase());
// 20(掌握). String trim();
// 去除字符串前后空白
System.out.println(" hello world ".trim());
// 21(掌握). String中只有一个方法是静态的,不需要new对象
// 这个方法叫做valueOf
// 作用:将“非字符串”转换成“字符串”
//String s1 = String.valueOf(true);
//String s1 = String.valueOf(100);
//String s1 = String.valueOf(3.14);
// 这个静态的valueOf()方法,参数是一个对象的时候,会自动调用该对象的toString()方法吗?
String s1 = String.valueOf(new Customer());
//System.out.println(s1); // 没有重写toString()方法之前是对象内存地址 com.bjpowernode.javase.string.Customer@10f87f48
System.out.println(s1); //我是一个VIP客户!!!!
// 我们是不是可以研究一下println()方法的源代码了?
System.out.println(100);
System.out.println(3.14);
System.out.println(true);
Object obj = new Object();
// 通过源代码可以看出:为什么输出一个引用的时候,会调用toString()方法!!!!
// 本质上System.out.println()这个方法在输出任何数据的时候都是先转换成字符串,再输出。
System.out.println(obj);
System.out.println(new Customer());
}
}
class Customer {
// 重写toString()方法
@Override
public String toString() {
return "我是一个VIP客户!!!!";
}
}
4.StringBuffer //字符串拼接
- 底层是一个byte数组
- StringBuffer stringBuffer = new StringBuffer(100); //长度100的btye数组
stringBuffer.append //append追加 (底层是数组扩容 arrayCopy
- String 底层的byte数组被 final修饰 所以不可变
而 StringBuffer的 btye数组可变 所以可以追加
- 在创建StringBuffer的时候尽可能给定一个初始化容量 减少底层扩容次数
StringBuilder
- StringBuffer 方法中 有synchronized关键字修饰,表示多线程情况下运行安全
StringBuilder 中无 表示多线程情况下运行不安全
5.基本数据类型对应的包装类
- 属于 引用数据类型 父类时Object
- 调用doSome(Object obj)方法时候 方便传参
- 八种基本数据类型包装类
btye java.lang.Btye(父类Number)
short java.lang.Short(父类Number)
int java.lang.Integer(父类Number)
long java.lang.Long(父类Number)
float java.lang.Float(父类Number)
double java.lang.Double(父类Number)
boolean java.lang.Boolean(父类Object)
char java.lang.character(父类Object)
- 装箱 拆箱
//基本数据类型 ---> 引用数据类型 (装箱
Integer i = new Integer(123); //jdk9之后该构造方法过时
//引用数据类型 ---> 基本数据类型 (拆箱
float f = i.floatValue(); // Number抽象类里的拆箱方法
- Integer(int)
Integer(String)
- 通过访问包装类常量获取最大 最小值
Integer.MAX_VALUE
Integer.MIN_VALUE
- 自动装箱 自动拆箱 //方便编程
//自动装箱 int类型自动转换成Integer
Integer x = 100; // 等于 Integer x = new Integer(100)
//自动拆箱
int y = x;
*分析以下代码
Integer x = 128;
Integer y = 128;
System.out.println(x == y); // false (== 不会触发 自动拆箱
//因为java中为了提高开发效率,将[-128~ 127]之间所有的包装对象提前创建好,
放到方法去的“整数型常量池中”,不需要在new了,直接取,所以内存地址一致
// cache 缓存机制 (Integer 源码
Integer a = 127;
Integer b = 127;
System.out.println(a == b); //true
- Integer常用方法
// NumberFormatException 数字格式化异常
1. intValue()
2. static int parseInt(String s ) // String 转换成int
静态方法 传参String 返回int
3. static Integer valueOf(String s)
- String int Integer 互相转换的方法 ***
6. 对日期的处理
- 获取系统当前时间
java.util.Date
SimpleDateFormat // java.text 负责日期格式化
1. Date转换成String
Date nowtime = new Date()// new出Date对象
SimpleDateFormat sdf = new SimpleDateFormate("yyyy-MM-dd HH:mm:ss SSS") //设置格式 只有这个格式不能更改
其余随便
String nowTimeStr = sdf.format(nowtime)// format方法格式化 Date格式
2. String转换成Date
String time = "2008-08-08 08:08:08 888"
SimpleDateFormate sdf2 = new SimpleDateFormate(yyyy-MM-dd HH:mm:ss SS)//这个格式一定得和String中相同
Date dateTime = sdf2.parse(time) 否则有java.text.ParseException
3. 获取自1970.1.1日到现在的总毫秒数 统计方法执行时间
System.currentTimeMills(); //静态方法
4. 总结一下System方法
System.out //out是System的静态变量
System.out.println() //println 是PrintSteam类的方法
System.gc() //启动gc
System.currentTimeMills()
System.exit(0) //推出JVM
7. 数字格式化
DecimalFormat df = new DecimalFormate("###,###.##");
String s = df.formate(1234.56) // 1,234.56
DecimalFormat df2 = new DecimalFormate("###,###.0000"); //不够补0
String s = df.formate(1234.56) // 1,234.5600
8. BigDecimal 大数据 精度极高 java对象 引用数据类型 // SUN提供的一个类
- 财务中double是不够的
java.math.BigDecimal
求和需要调用方法 BigDecimal类中提供
9. 随机数 Random
Random random = new Random()
int num1 = random.nextInt() //随机产生int取值范围内的数字
int num2 = random.nexInt(101); // 表示随机取0~100 范围内的数字 不包括101
nexInt(101) 表示下一个是101 所以不包括101
*随机生成5个不同的数字,放在数组中
10. 枚举
- 一种引用数据类型
- 结果只有两种情况 用boolean类型
结果超过两种,可以一枚一枚列出来的可以用枚举,如颜色、四季
- enum Season{
SPINRG, SUMMER, AUTUMN, WINTER
}