八大基本数据类型
java的数据类型可以说很简洁,只有整型,浮点型,字符型,和布尔型四大种,八小种基本类型。
整型
byte:
-2^7 ~ 2^7-1,即-128 ~ 127。1字节。
short:-2^15 ~ 2^15-1,即-32768 ~ 32767。2字节。
int:
- int有符号:-2^31 ~ 2^31-1,即-2147483648 ~ 2147483647。4字节。Integer。
- int无符号:0~2^32-1。
long:-2^63 ~ 2^63-1,即-9223372036854774808 ~ 9223372036854774807。8字节。Long。末尾加L。(也可以不加L)
浮点型
float:4字节
**double:**8字节
字符型
**char:**2字节
布尔型
**boolean:**1字节
基本数据类型包装类
基本数据类型对应包装类
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
Character
Character静态方法(里面包含了对字符的一些处理):
- Character.isLetter(ch)判断一个字符是否为字母,当为字母时,则返回true,否则返回false
- Character.isDigit(ch)判断ch单字符是否是数字
- Character.toLowerCase(ch)将ch单字符转换为小写字母,如果里面有其他字符,原样输出。
- Character.toUpperCase(ch)将ch单字符转换为大写字母,如果里面有其他字符,原样输出。
- Character.isWhitespace(ch)判断ch单字符是否为字母
自动装箱和拆箱
类型最大最小值
最小值: Integer.MIN_VALUE = -231= -21 4748 3648
最大值:Integer.MAX_VALUE=231-1=21 4748 3647(21亿左右)
数组
数组定义与使用
定义
int[] array = new int[5];
Array的静态方法
Arrays类常用方法:
- 1.Arrays.toString():快速输出数组内容
- Arrays.toString(a)
- 2.Arrays.sort()方法:数组排序,默认升序排列
- Arrays.sort(数组名)
- Arrays.sort(数组名,起始下标,终止下标)
规则:起始下标 <= 数组 < 终止下标
例如:Arrays.sort(a,1,4)
排序:将下标 1, 2, 3 的数字排序
注意:
1. 数字代表着下标
2. 边界左闭右开
- Arrays.sort(数组名,起始下标,终止下标,排序规则)
源码:
public static <T> void sort(T[] a,int fromIndex, int toIndex, Comparator<? super T> c)
Comparator - 排序规则:默认为从小到大,如果想要倒序,需要传入Comparator参数,来改变排序规则
例如:将二维数组按照第一个元素倒序排列
int[][] values = new int[n][3];
for (int i = 0; i < n; i++) {
values[i][0] = aliceValues[i] + bobValues[i];
values[i][1] = aliceValues[i];
values[i][2] = bobValues[i];
}
Arrays.sort(values, (a, b) -> b[0] - a[0]);
可以看到,实现倒序的方法:
1. 使用Lambda表达式,实现Comparator函数式接口
2. 使用第二个参数值 - 第一个参数值
神奇的:
1. 返回的值类型,是第一个参数values一个二维数组
2. 而排序规则,是Lambda表达式中的参数来排序
- 3.Arrays.equals()方法:比较两个数组内容是否相等
- booleanisSame= Arrays.equals(a,b);
- 4.Arrays.binarySearch():在数组中查找元素
- int Arrays.binarySearch( Datatype[], Datatype key)
- 5.Arrays.copyOf():复制数组,并设置复制的大小
- arr2 = Arrays.copyOf(arr1, 10)
- 6.Arrays.fill(arr, -1):对数组进行数值填充(用-1将数组填充)
字符串
字符串常用方法
int length():返回字符串的长度
char charAt(int index):返回指定索引处的字符
boolean isEmpty():判断字符串是否为空
String toLowerCase():将字符串中的所有字符转换为小写
String toUpperCase():将字符串中的所有字符转换为大写
String trim():返回字符串的副本,去掉前导空白和尾部空白,中间的空白不会被去掉
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):忽略大小写,比较字符串的内容是否相同
String concat(String str):将指定字符串连接到此字符串的结尾,等价于用“+”
int compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回从beginIndex到末尾的子字符串
String substring(int beginIndex, int endIndex):返回从beginIndex到endIndex前一位的子字符串,不包括endIndex
boolean endsWith(String suffix): 判断字符串是否以指定的后缀结束
boolean startsWith(String prefix):判断字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):判断字符串在指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s):判断当前字符串中是否包含指定的字符串
int indexOf(String str):返回指定子字符串在当前字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回从指定的索引后,指定子字符串在当前字符串中第一次出现处的索引
int lastIndexOf(String str):返回指定子字符串在当前字符串中最后一次出现处的索引
int lastIndexOf(String str, int fromIndex):返回从指定的索引后,指定子字符串在当前字符串中最后一次出现处的索引
注:indexOf和lastIndexOf方法如果未查找到指定子字符串时,返回值都为-1。
String replace(char oldChar, char newChar):替换当前字符串中指定的子字符串
String[] split(String regex):根据指定的符号拆分当前字符串,然后返回一个String数组
字符串和整数转换
字符串转整数
三种方式:
new Integer(String s)
Integer.parseInt(String s)
Integer.valueOf(String s)
Integer.valueOf()和Integer.parseInt()的不同:
Integer.valueOf()和Integer.valueOf()两个方法的返回值类型不一样
Integer.valueOf()返回一个Integer类型的数据,是int的包装类
Integer.parseInt()返回一个int类型的数据。
如果使用int类型数据接受返回值,两者没有什么不同,但是如果使用Integer类型数据接受返回值,Integer.valueOf()会报警告。
int整数转字符串
- Integer.toString(int num)
- String.valueOf(i)
字符串与字符
字符串转字符:
s.charAt(i)
字符转字符串:
法1:String构造方法
char[] ch=new char(){'1','2','3'};
string str=new string(ch);
法2:Character
char ch = 'U';
String charToString = Character.toString(ch);
法3:使用String.valueOf()
char ch = 'U';
String valueOfchar = String.valueOf(ch);
法4:和字符串直接拼接
char ch = 'U';
String str = "" + ch;
字符串转字符数组:
char[] arr = s.toCharArray();
字符数组转字符串:
new String(arr)
字符与整数转化
- 整数x转字符a:char a =(char)(‘a’+x) – 整数转字符串,强转即可
- 字符a转整数x:int x = a - ‘a’
StringBuilder 和 StringBuffer
String 底层值char[]型常量,修改他,java底层会给他重新创建一个空间来存储修改值
而StringBuilder和StringBuffer,底层是char[]型,是变量,修改值,会在原来的空间直接修改
StringBuffer和StringBuilder中常用的方法:
StringBuffer append(xxx):拼接字符串
StringBuffer delete(int start,int end):删除指定范围的内容,左开右闭
StringBuffer replace(int start, int end, String str):替换指定范围的内容
StringBuffer insert(int offset, xxx):在指定位置插入指定的内容
StringBuffer reverse() :把当前字符序列逆转
public int indexOf(String str) : 返回指定子字符串在当前字符串中第一次出现处的索引
public String substring(int start,int end) :返回指定范围的子字符串
public int length() : 返回字符串的长度
public char charAt(int n ) : 获取指定索引处的字符
public void setCharAt(int n ,char ch) : 设置指定索引处的字符
setLength(int newLength) :设置长度
面试题:String、StringBuffer和StringBuilder的异同?
相同点:底层都是通过char数组实现的
不同点:
String对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空间来存储修改之后的对象;而StringBuffer和StringBuilder对象的值是可以被修改的;
StringBuffer几乎所有的方法都使用synchronized实现了同步,线程比较安全,在多线程系统中可以保证数据同步,但是效率比较低;而StringBuilder 没有实现同步,线程不安全,在多线程系统中不能使用 StringBuilder,但是效率比较高。
如果我们在实际开发过程中需要对字符串进行频繁的修改,不要使用String,否则会造成内存空间的浪费;当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用 StringBuilder。
运算符todo
Java运算符分为以下几种:
➤算术运算符:+,-,*,/,%,++,–
➤赋值运算符:=
➤扩展后的赋值运算符:+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=,>>>=
➤位运算符:&,|,~,^,<<,>>,>>>
➤比较运算符:>,>=,<,<=,==
➤逻辑运算符:&&,&,||,|,!,^
➤三目运算符:? :
-
&:按位与。当两位同时为1时才返回1。
-
|:按位或。只要有一位为1就返回1。
-
~:按位非。单目运算符,将操作数的每一位(包括符号位)全部取反。
-
^:按位异或。当两位不同时返回1,相同时返回0。
-
<<:左移运算符。
-
:右移运算符
-
:无符号右移运算符
三目运算符
(expression) ? if-true-statement : if-false-statement
三目运算符的语法规则是:先对逻辑表达式expression求值,如果expression返回true,则返回第二个操作数的值,否则返回第三个操作数的值。
示例:
if (aliceSum > bobSum) {
return 1;
} else if (aliceSum == bobSum) {
return 0;
} else {
return -1;
}
->
return aliceSum > bobSum ? 1 : aliceSum == bobSum ? 0 : -1;