【Java】基本知识点:数据类型、Math、Enum、String、BigInteger、数组
类定义的要求
public class 类名称 {}:
- 类名称必须与文件名称保持一致。
- 一个 .java文件里面只允许有一个public class;
class 类名称 {}:
- 类名称可以与文件名称不一致。但是编译后的.class名称是class定义的类名称,要求解析的是生成的.class文件名称。
- 在一个 .java文件里面可以有多个class类,并且编译后会形成不同的 .class文件。
注:
- 一般而言,一个 .java文件里面就定义一个public class文件就够了。
- 类的名称每一个单词首字母必须大写。
数据类型
整形
在C/C++中,int、long等类型的大小与平台有关。不同位数的处理器对应的大小不一致。而Java不会,Java的数据大小是固定的。
并且Java没有无符号(unsigned)数
浮点类型
double的精度要比float的高,一般也常用double。
浮点数值不适合用于无法接受舍入误差的金融计算中。例如:System.out.println(2.0-1.1)将打印0.8999999999999999,而不是0.9。这种舍入误差的主要原因是浮点数值采用的二进制系统无法精确地表示分数1/10。
char类型
Java中使用的字符集为Unicode,这会导致一些Unicode字符需要两个char。(关于Unicode可以参考另一篇博文)所以使用Java并不建议使用char类型,更多得我们使用string
boolean类型
true和false,在Java中不允许整形和布尔类型的互换。
变量与常量
变量:在Java中变量的声明尽可能靠近变量第一次使用的地方。
常量:在Java中常量使用关键字final。常量就是被赋值后,不能再更改了,并且习惯性常量的变量名全部大写。
数学函数Math
平方根:Math.sqrt(x);
幂运算:Math.pow(x,y);
除余:Math.floorMod(x,y);该方法不会导致负数结果,当然如果y为负数,那结果任然是负数,但这种不常见。
- 一般的除余为 x%y,但如果x为负数,会导致结果可能是负数。
- 例:-7 % 2 = -1。如果想余数总是>=0,那么我们一般这么写 ((-7 % 2) + 2) % 2 = 1;会显得很麻烦。
三角函数:Math.sin;Math.cos;Math.tan;
指数:Wath.exp;Math.log;Math.log10;
圆周率与e常量:Math.PI;Math.E;
Math类下还有很多方法,如果用到可以百度查一下。
枚举enum
例子:enum Size{SMALL,MEDIUM,LARCE};
声明:Size s = Size.SMALL;
字符串String
拼接
//使用 + 拼接
String expletive="Expletive";
String PC13="deleted";
String message=expletive + PC13;//如果其中有数字那么会将数字转为String再拼接
//如果是多个字符串拼接还可以使用join
String a = "a";
String b = "b";
String c = String.join(a,b,"c","de");
注:Java的String并不是C++里的char[]而是char*
检验相等
s.equals(t);//检验s与t是否相等
s.equalsIgnoreCase(t);//检验s与t是否相等,而且不区分大小写
注:绝对不能使用 == 判断两个字符串是否相等,因为String是类,==会判断两者地址是否一致。
分析:
String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2);//true 为啥?
实际上,“hello”是一个匿名对象,Java底层提供专门的字符串池。如果池里有“hello”那么下一个也会指向同一个,从而减少对象的产生。
String str1 = "hello";
String str2 = new String("hello");//这种构造方法会开辟两次内存,第一次“hello”开辟匿名对象,第二次再堆上构造“hello”。之前内个就成了垃圾空间。
System.out.println(str1 == str2);//false
其实对于常量池分为了静态常量池和动态常量池。
空串与null串
“”就是长度为0的空串。String n = null;表示目前没有任何对象与该变量关联。
null串 = 空串。
String 常用API
int compareTo(String other);
按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0。
new String(int[]codePoints,int offset,int count);
用数组中从offset开始的count个码点构造一个字符串。
boolean equals(Object other);
如果字符串与other相等,返回true。
boolean equalsIgnoreCase(String other);
如果字符串与other相等(忽略大小写),返回true。
boolean startswith(String prefix);
boolean endswith(String suffix);
如果字符串以suffix开头或结尾,则返回true。
int indexof(String str);
int indexof(String str,int fromIndex);
int indexof(int cp);
int indexof(int cp,int fromIndex);
返回与字符串str或代码点cp匹配的第一个子串的开始位置。这个位置从索引0或fromIndex开始计算。如果在原始串中不存在str,返回-1。
int lastIndex0f(String str);
int lastIndexof(String str,int fromIndex);
int 1astindexof(int cp);
int lastindexof(int cp,int fromIndex);
返回与字符串str或代码点cp匹配的最后一个子串的开始位置。这个位置从原始串尾端或fromlndex开始计算。
int 1ength();
返回字符串的长度。
int codePointCount(int startIndex,int endIndex);
返回 startlndex和endlndex-1之间的代码点数量。没有配成对的代用字符将计入代码点。
String replace(Charsequence ol dstring,CharSequence newstring);
返回一个新字符串。这个字符串用newString代替原始字符串中所有的oldString。可以用String 或StringBuilder对象作为CharSequence参数。
String substring(int beginIndex)
String substring(int beginIndex,int endIndex)
返回一个新字符串。这个字符串包含原始字符串中从beginlndex到串尾或endlndex-1的所有代码单元。
String tolowerCase();
String toupperCase();
返回一个新字符串。这个字符串将原始字符串中的大写字母改为小写,或者将原始字符串中的所有小写字母改成了大写字母。
String trim();
返回一个新字符串。这个字符串将删除了原始字符串头部和尾部的空格。
String join(CharSequence delimiter,Charsequence...elements);
返回一个新字符串,用给定的定界符连接所有元素。
构建字符串
采用字符串连接的方式构建字符串,每次都会构建新的String对象,及耗费空间也耗费时间,所以一般使用StringBuilder,它不会重新构建对象。
StringBuilder builder = new StringBuilder();
builder.append(sh);//在builder后追加字符ch
builder.append(str);//在builder后追加字符串str
String completeString = builder.toString();//将builder转为String类型
int length();
返回构建器或缓冲器中的代码单元数量。
StringBuilder appendCodePoint(int cp);
追加一个代码点,并将其转换为一个或两个代码单元并返回this。
void setCharAt(int i,char c);
将第i个代码单元设置为c。
StringBuilder insert(int offset,String str);
在offset位置插入一个字符串并返回this。
StringBuilder insert(int offset,Char c);
在offset位置插入一个代码单元并返回this。
StringBuilder delete(int startIndex,int endIndex);
删除偏移量从startlndex到endlndex-1的代码单元并返回this。
String toString();
返回一个与构建器或缓冲器内容相同的字符串。
注:代码单元与代码点
在C++中char的大小为1个字节8位,而在Java中char最开始是16位,后来发现16位依旧不够用,使用Unicode对其进行了扩充。
一个char也就是16位表示一个代码单元,有的Unicode字符是一个代码单元,有的是两个。然而一个Unicode字符就是一个代码点。
输入输出
输出:System.out.println();
输入:
Scanner in = new Scanner(System.in);//先构造Scanner对象
String str = in.nextLine();//获取输入的一行
String word = in.next();//获取一个单词,以空白符为分隔符
int num = in.nextInt();//获取一个整数
double num = in.nextDouble();//获取一个浮点数
boolean hasNext();//检测输入中是否还有其他单词。
boolean hasNextInt();//检测是否还有表示整数的下一个字符序列。
boolean hasNextDouble();//检测是否还有表示浮点数的下一个字符序列。
注:Scanner类定义在java.util包中,所以最开始需要使用import java.util.*导包。
块作用域
在Java里不能在嵌套块中声明同名变量。
public static void main(String[] args)
{
int n;
{
int n;//在C++中可以,Java中不行。
}
}
switch
Java中的switch与C++中的一致。都是遇到break才停止。
不过对于case语句,C++仅支持整形和枚举。但Java SE7后支持char,byte,int,enum,String
break
在Java中除了简单的使用break外,还有一种带标签的break,这点了解即可,用的不多。
public static void main(String[] args) {
round://这里
for(int i = 0;i < 10;i++){
for(int j = 0;j < 5;j++){
System.out.println(i +" "+ j);
if(i == 3){
break round;
}
}
}
}
大数值
在java.math包中的两个很有用的类:BigInteger和BigDecimal。前者实现了任意精度的整数运算,后者实现了任意精度的浮点数运算。
BigInteger a = BigInteger.valueOf(100);
可以将普通的数值转换为大数值。
BigInteger add(BigInteger other);//和
BigInteger subtract(BigInteger other);//差
BigInteger multiply(BigInteger other);//积
BigInteger divide(BigInteger other);//商
BigInteger mod(BigInteger other);//余数
int compareTo(BigInteger other)
如果这个大整数与另一个大整数other相等,返回0;如果这个大整数小于另一个大整数other,返回负数;否则,返回正数。
static BigDecimal valueOf(long x)
static BigDecimal valueOf(long x,int scale)
返回值为x或x/10^scale的一个大实数。
BigDecimal add(BigDecimal other);//和
BigDecimal subtract(BigDecimal other);//差
BigDecimal multiply(BigDecimal other);//积
BigDecimal divide(BigDecimal other RoundingMode mode)//商
要想计算商,必须给出舍入方式(rounding mode)。RoundingMode.HALF_UP是四舍五入。有关其他的舍入方式请参看API文档。
int compareTo(BigDecimal other)
如果这个大实数与另一个大实数相等,返回0;如果这个大实数小于另一个大实数,返回负数;否则,返回正数。
数组
在Java中创建数组:int[] a = new int[100];当然int a[]也可以但不建议。
Java中允许创建长度为0的数组。new int[0];
for each循环:
for(int element : a)
System.out.println(element);
数组拷贝
int[] a = b;
此时两个变量将引用同一个数组。也就是改变a[2]那么b[2]也会被改变。
int[] a = Arrays.copyOf(b,b.length);
使用该方法可以新创数组再将 b 的前 b.length 拷贝到 a。
数组排序
int[] a = new int[100];
Arrays.sort(a);//排序
java.util.Arrays:
static String toString(type[] a)
返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔。
static type copyOf(type[]a,int 1ength)
static type copyOfRange(type[]a,int start,int end)
返回与a类型相同的一个数组,其长度为length或者end-start,数组元素为a的值。
static void sort(type[]a)
采用优化的快速排序算法对数组进行排序。
static int binarySearch(type[]a,type v)
static int binarySearch(type[]a,int start,int end,type v)
采用二分搜索算法查找值v。如果查找成功,则返回相应的下标值;否则,返回一个负数值。
static void fill(type[]a,type v)
将数组的所有数据元素值设置为v。
static boolean equals(type[]a,type[]b)
如果两个数组大小相同,并且下标相同的元素都对应相等,返回true。
参数:type为int、long、short、char、byte、boolean、float或double。
多维数组
再Java里可以int[][] a = new[3][3];创建多维数组
使用for each遍历二维数组
for(int[] row : a)
for(int val : row)
System.out.println(val);
一维数组的快速打印可以使用Arrays.toString(a)。二维数组则可以使用Arrays.deepToString(a);