封装类
所有的基本类型,都有对应的类类型,如int->Integer,这种类就叫做封装类
转换如下
1
2
3
4
5
6
7
8
9public class TestNumber {
public static void main(String[] args) {
int i = 5;
//把一个基本类型的变量,转换为Integer对象
Integer it = new Integer(i);
//把一个Integer对象,转换为一个基本类型的int
int i2 = it.intValue();
}
}
Number类
- 封装类和基本类型的转换
1 | public class TestNumber { |
自动拆箱(通过=自动转换)
1
2
3
4
5
6
7
8
9
10public class TestNumber {
public static void main(String[] args) {
int i = 5;
Integer it = new Integer(i);
//封装类型转换成基本类型
int i2 = it.intValue();
//自动转换就叫拆箱
int i3 = it;
}
}int的最大值可以通过封装类获取
1
2
3
4
5
6
7
8public class TestNumber {
public static void main(String[] args) {
//int的最大值
System.out.println(Integer.MAX_VALUE);
//int的最小值
System.out.println(Integer.MIN_VALUE);
}
}
字符串转换
数字转字符串
1
2
3
4
5
6
7
8
9
10public class TestNumber {
public static void main(String[] args) {
int i = 5;
//方法1
String str = String.valueOf(i);
//方法2
Integer it = i;
String str2 = it.toString();
}
}字符串转数字
1
2
3
4
5
6
7public class TestNumber {
public static void main(String[] args) {
String str = "999";
int i= Integer.parseInt(str);
System.out.println(i);
}
}
数学方法
四舍五入, 随机数,开方,次方,π,自然常数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23public class TestNumber {
public static void main(String[] args) {
float f1 = 5.4f;
float f2 = 5.5f;
//5.4四舍五入即5
System.out.println(Math.round(f1));
//5.5四舍五入即6
System.out.println(Math.round(f2));
//得到一个0-1之间的随机浮点数(取不到1)
System.out.println(Math.random());
//得到一个0-10之间的随机整数 (取不到10)
System.out.println((int)( Math.random()*10));
//开方
System.out.println(Math.sqrt(9));
//次方(2的4次方)
System.out.println(Math.pow(2,4));
//π
System.out.println(Math.PI);
//自然常数
System.out.println(Math.E);
}
}
格式化输出
1 | - System.out.printf("%s%s%n",a,a); //%n表示换行 |
换行符
在不同的操作系统,换行符是不一样的
(1)在DOS和Windows中,每行结尾是 “\r\n”;
(2)Linux系统里,每行结尾只有 “\n”;
(3)Mac系统里,每行结尾是只有 “\r”。
- 为了使同一个java程序的换行符在所有的操作系统中都有一样的表现,使用%n即可以做到平台无关的换行。
总长度,左对齐,补0,千位分隔符,小数点位数,本地化表达
1 | public class TestNumber { |
字符
- char的对应封装类时Character
- 一个中文字也可以算一个字符 char a = ‘哈’;
- 不能够直接把一个字符转换成字符串 String a = ‘1’;
字符串
String的创建
- 每当有一个字面值出现的时候,虚拟机就会创建一个字符串
- 调用String的构造方法创建一个字符串对象
- 通过+进行字符串拼接也会创建新的字符串对象
1
2
3
4
5
6
7
8
9
10public class TestString {
public static void main(String[] args) {
String garen ="盖伦"; //字面值,虚拟机碰到字面值就会创建一个字符串对象
String teemo = new String("提莫"); //创建了两个字符串对象
char[] cs = new char[]{'崔','斯','特'};
String hero = new String(cs);// 通过字符数组创建一个字符串对象
String hero3 = garen + teemo;// 通过+加号进行字符串拼接
}
}String是final类的,所以不能被继承
String是immutable(不可改变)的,即创建好了之后里面的内容永远不能改变
String的常用方法
charAt(position):获取指定下标的字符
toCharArray():获取对应的字符数组
substring():截取子字符串
- 单参数表示截取该下标之后的字符串
- 双参数表示截取区间字符串,左闭右开
split():根据分隔符进行分割,得到一个字符串数组
trim():去掉首尾空格
toLowerCase() / toUpperCase():全部变成小写/大写
indexOf():返回字符串参数第一次出现的位置
contains():是否包含参数表示的字符串
replaceAll() / replaceFirst():替换所有/第一个字符串为arg2
==:是否是同一个对象(不仅要字符串内容一样)
特例:
1
2
3
4
5
6
7
8
9
10public class TestString {
public static void main(String[] args) {
String str1 = "the light";
String str3 = "the light";
System.out.println( str1 == str3);
}
}
/*一般说来,编译器每碰到一个字符串的字面值,就会创建一个新的对象
所以在第6行会创建了一个新的字符串"the light"
但是在第7行,编译器发现已经存在现成的"the light",那么就直接拿来使用,而没有进行重复创建*/
equals():内容是否相同
startsWith() / endsWith:是否以子字符串参数开始或结束
StringBuilder、StringBuffer
- String、Stringbuilder、Stringbuffer
String不可变的好处:提高字符串池的效率和安全性,在拷贝对象内容时只要复制它的地址,效率高
为什么StringBuffer可以变长?
和String内部是一个字符数组一样,StringBuffer也维护了一个字符数组。 但是,这个字符数组,留有冗余长度,可以动态变化。如在对Stringbuilder的操作过程中若长度超过了数组长度的限制,则会将原内容拷贝到一个新数组中,最后让内部的字符数组指向这个新数组
StringBuilder是线程不安全的,Stringbuffer是线程安全的,其他的使用方法和结果基本没有差别
如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;如果要保证线程安全,自然是StringBuffer。
- StringBuilder常用方法
- append():在字符串末尾追加指定字符串
- delete():删除两个下标参数间的字符串,左闭右开
- insert():在指定下标处插入指定字符串
- reverse():对字符串进行反转