一、基本数据类型
java是强类型语言,共有8种基本数据类型:4种整型、2种浮点型、char字符型和boolean型。
整型
类型 | 长度 | 取值范围 |
---|---|---|
byte | 1字节 | -128~127 |
short | 2字节 | -32768-32767 |
int | 4字节 | -2^31-1~2^31-1 |
long | 8字节 | -2^63-1~2^63-1 |
整型的范围与运行java代码的机器无关,这一点和C、C++不同,保证了代码在不同的平台之间的可移植型。
int最为常用,char和short主要用于特定场合,比如底层处理文件、处理需要占用大量存储空间的数组。要表示的数据超过int类型的范围时使用长整型int.
浮点类型
浮点类型用于表示java中的有小数部分的数值。
类型 | 长度 | 取值范围 |
---|---|---|
float | 4字节 | 大约±3.402 823 47E+38F(有效位为6~7位) |
double | 8字节 | 大约±1.79769313486231570E+308(有效位为15位) |
float精度很难满足需求,一般使用double类型.
char类型
char类型用来表示单个字符,比如’A’.”A”表示长度为1包含一个字符A的字符串。
boolean
boolean类型有2个值:true和false,布尔类型不能和整型值进行相互转换。
变量
变量命名规则:以大小写字母、下划线、开始,后面跟字母或数字。java中的字母范围包括’a-z’、’A-Z’、下划线(_)、美元符等。不能讲java关键字设置为变量名。
常量
java中使用final关键字指示常量:
final double HEIGHT = 100;
final关键字表示变量只能被赋值一次, 一旦被赋值以后就不可以被修改。
类常量
类常量可以被一个类中的多个方法使用,使用关键字static final修饰,类常量定义在main函数的外部。如果使用public static final,即一个类常量被声明为public,那么其他类多方法也可以使用这个常量。
数学函数与常量
Math类包含了多种数学函数。
函数 | 功能 |
---|---|
abs(a) | 求绝对值 |
sqrt(a) | 求根 |
pow(a,b) | a的b次方 |
max(a,b) | 返回两个数中最大值 |
min(a,b) | 返回两个数中最小值 |
floor(a) | 向下取整 |
round(b) | 向上取整 |
sin() | 正弦 |
cos() | 余弦 |
tan() | 正切 |
atan() | 余切 |
二、元算符
算术运算符
java中使用+、-、*、/ 表示加、减、乘、除四种运算,%表示求余操作。当参与/运算的两个数都是整数时表示整数除法,否则表示浮点除法。15/7=2,15%2=1,15/2.0=7.5.
简化的二元算术运算符号:
- +=
x+=4,等价于x=x+4 - -=
x-=4等价于x=x-4 - *=
x*=2等价于x=x*2 - /=
x/=2等价于x=x/2
自增、自减运算符
前缀形式自增:++n
后缀形式自增:n++
int a=6;
int b=6;
int m=++a //m=7,a=7
int n=b++ // n=b,b=7
前缀形式运算时n先加1后运算,后缀形式运算时n先运算后加1.
关系运算符
运算符 | 功能 |
---|---|
== | 检测等号两边值是否相等 |
!= | 检测等号两边值是否不相等 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
逻辑运算符
&&表示逻辑与,A&&B当且仅当A和B都为真是A&&B为真,A||B只要A或B有一个为真时A||B为真.&&与||按照短路方式求值,如果第一个操作数已经可以确定表达式的结果,就不再计算第二个操作数。
x!=0 && 1/x>x+y
位运算符
四种位运算符:
- & 与
以29为例,29的二进制表示为(11101),16 的二进制表示为(10000),与运算后29&16的结果为16(1 0000)
System.out.println(29&16); //16
- | 或
- ^ 异或
- ~ 非
- << 左移
左移和十进制小数点移动类似,小数点左移一位放大10倍,在计算机中左移一位扩大2倍。左移n位扩大2的n次方倍. - >> 右移
右移与左移正好相反。
int a=16;
System.out.println(a>>2); //a=4
System.out.println(a<<2); //a=64
字符串
字符串不是java基本的数据类型,而是java标准库中的一个String类,每个用双引号引起来的字符串就是String类的一个实例。如:String name="Tonny"
。
1.字符串的构造
第一种方式:
String name="Tonny"
第二种方式:
String name=new String("Tonny");
第三种方式:
byte[] arr = {65, 66, 67, 68};
String s = new String(arr); //s=ABCD
第四种方式:
byte[] arr = {65, 66, 67, 68,69};
String s = new String(arr, 1, 4); //s=BCDE
2.子串
使用substring可以从一个较大的字符串中提取一个子串。比如:
String greeting="HelloWorld!";
System.out.println(greeting.substring(2));//llo World!
System.out.println(greeting.subSequence(2, 6));//lloW
substring() 接受一个参数时,参数为子串开始位置,字符串从0开始计算位置。
substring()接收2个参数时分别为开始位置和结束位置,截取的字符串包含开始位置不包含结束位置。
3.拼接
使用”+”可以拼接2个字符串。例如;
String str1="Hello";
String str2="World!";
String str3=str1+str2;
System.out.println(str3);//HelloWorld
一个字符串和和一个非字符串进行拼接时,后者被转换为字符串类型。在java中任何一个字符串对象都可以转换为字符串。
4. 不可变字符
java中没有修改字符串的方法,java使用拼接再赋值的方式来实现字符串的修改。原来的字符串仍然存在,只是变量指向了新的字符串而已。hello永远是包含h、e、l、l、o的代码单元序列。
5.检查字符串是否相等
这个问题经常出现在各种笔试、面试题中。字符串的equals方法用来检查2个字符串的值是否相等,==比较的是2个字符串的地址是否相同,即是否指向的是同一个字符串。使用substring、+截取或者拼接的字符串虽然内容一样,但是地址不一样。
String a="ucas";
String b=a.substring(0,3)+"s";
System.out.println("ucas".equals(a));//true
System.out.println(a.equals(b)); //true
System.out.println(a==b); //false
6.空串与Null串
空串是一个String 对象,内容为空,长度为0。null表示没有对象和它关联。判断一个字符串对象是不是为空串:
if(str.length==0)
或者
if(str.equals(""))
检查一个对象既不为null也不为空:
if(str!=null&&str.length!=0)
7.字符串Api
- boolean endwith()判断字符串后缀
- equalIgnoreCase()忽略大小写比较
- int indexOf() 子串首次出现位置
- int lastIndexOf() 返回字符串最后一次出现位置
- int length() 返回字符串长度
- boolean startWith(prefix)判断字符串是否以prefix开头
- String toLowerCase 转为小写
- String toUpperCase 转为大写
- String trim()删除尾部空格
8.字符串的本质
地址比较:
字符串”abc”在常量池中,s1和s2指向的是同一个对象,因此不论是比较地址还是比较值结果都是一样的。
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
再看下面的例子:
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
这时,s1指向的是字符串常量池中的”abc”,s2是字符串对象,位于堆内存中,因此s1和s2的地址不一样,不是同一个对象,字符串值一样。
9 字符串切分
String str1 = "abc,def,hig";
String[] strArr = str1.split(",");
for(String str:strArr){
System.out.println(str);
}
打印结果:
abc
def
hig
特殊的字符需要转义,比如,.本身是正则表达式中的占位符,使用\转成英文实心句号:
String str1 = "abc.def.hig";
String[] strArr = str1.split("\\.");
10.字符串转字符数组
String s = "ab你好";
char[] cArr = s.toCharArray();
for (char c : cArr) {
System.out.println(c);
}
打印结果:
a
b
你
好
11.字符串按字典顺序排序
使用TreeSet:
String[] strArr = {"recursive", "raw", "platform", "rank", "register", "symbol"};
TreeSet treeSet = new TreeSet<>();
for (String str : strArr) {
treeSet.add(str);
}
System.out.println(treeSet);
12.按字典顺序逆序排序
逆序排序只需要在TreeSet实现Comparator接口,重写compare()方法:
String[] strArr = {"recursive", "raw", "platform", "rank", "register", "symbol"};
TreeSet treeSet = new TreeSet<>(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return o2.toString().compareTo(o1.toString());
}
});
for (String str : strArr) {
treeSet.add(str);
}
System.out.println(treeSet);
结果:
[symbol, register, recursive, raw, rank, platform]
13.StringBuffer和StringBuilder
StringBuffer是字符串缓冲区, 线程安全,单线程操作单时候也要不停的判断锁,后来独立出来一个StringBuilder,线程不安全,但是速度快。