Java基础一 基本数据类型

1 Java程序的基本结构

1 Java应用程序基本结构如下:

 public class ClassName {
    public static void main(String[] args)
    {
        program statments
    }
}

2 关键字class表明Java程序中的全部内容都包含在类中,源代码的文件名与公共类的名字相同,并用 .java作为扩展名。根据Java语言规范,main方法必须声明为public。

3 Java中的所有函数都属于某个类的方法,因此Java中的main方法必须有一个外壳类,Java中的main方法必须是静态的,与C++一样,关键字void表示这个方法没有返回值,所不同的是main方法没有为操作系统返回“退出代码”。如果main方法正常退出,那么Java应用程序的退出代码为0,表示成功地运行了程序。如果希望在程序终止时返回其他的代码,那就需要调用System.exit方法。

4 对于一个方法,即使没有参数也需要使用括号,例如不带参数的System.out.println()打印一个空行。

2 数据类型

1 在Java中,整型的范围与运行Java代码的机器无关,长整型数值有一个后缀L或l(如4000000L)。十六进制数值有一个前缀0x或0X(如0XCAFA)。八进制有一个前缀0,例如010对应八进制中的8,八进制法比较容易混淆,所以最好不要使用八进制常数。从Java7开始,加上前缀0b或0B就可以写二进制数,例如0b1001就是9,同样从Java7开始,还可以为数字字面量加上下划线,如用1—000—000表示100万,这些下划线只是让程序更加易读。

2 Java中没有任何无符号(unsigned)形式的int,long,short或byte类型。

3 int类型4字节,long类型8字节。float类型的数值后面有一个后缀F或f(例如3.14f)。没有后缀F的浮点数值(如3.14)默认为double类型,当然,也可以在后面添加后缀D或d(如3.14D)。

4 可以用十六进制表示浮点数值。例如,0.125可以表示成0x1.0p-3。在十六进制表示法中,可以使用p表示指数,而不是e,注意尾数采用十六进制,指数采用十进制,指数的基数是2,而不是10。

5 有三个用于表示溢出和出错情况的三个特殊的浮点值,正无穷大,负无穷大,NaN(不是一个数字),例如一个正整数除以0的结果为正无穷大,计算0/0的结果为NaN。常量Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY和Double.NaN(以及相应的float类型的常量)分别表示这三个特殊的值,需要特殊说明的是,不能用if(x==Double.NaN)来判断一个特定值是否等于Double.NaN,因为所有的“非数值”都认为是不相同的,所以结果永远是false,可以通过if(Double.isNaN(x))

6 浮点数值不适用于无法接受舍入误差的金融计算中,例如,命令System.out.println(2.0-1.1)将打印出0.89999999999,而不是0.9.这种舍入误差的主要原因是浮点数字采用二进制系统表示,而在二进制系统中无法精确的表示分数1/10.这就好像十进制数无法精确的表示1/3一样。如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类。

7 尽管$是一个合法的Java字符,但不要在自己的代码中使用这个字符,它只用在Java编译器或其他工具生成的名字中。

8 在Java中,不区分变量的声明与定义,利用final关键字指示常量,关键字final表示这个变量只被赋值一次。一旦被赋值后,就不能再更改了,习惯上,常量名使用全大写。

9 在Java中,经常希望某个常量可以在一个类中的多个方法使用,通常将这些类常量称为类常量。可以使用关键字static final设置一个类常量。需要注意,类常量的定义位于main方法的外部,因此,在同一类的其他方法中也可以使用这个常量。而且,如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。

10 const是Java保留的关键字,但目前并没有使用。在Java中,必须使用final定义常量。

3 运算符

1 在Java中,使用算术运算符+,-,*,/表示加减乘除运算。当参与运算/的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。整数的求余操作(有时称为取模)用%表示,例如15/2等于7,15%2等于1,15.0/2等于7.5。需要注意,整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果。

2 当进行隐式类型转换时,会先将两个操作数转化为同一种类型,然后进行计算。转化规则为:如果两个操作数有一个为double类型,另一个操作数就会转换为double类型。否则,如果其中一个是float类型,另一个操作数就会转换为float类型,否则如果其中一个是long类型,另一个操作数就会转为long类型。否则两个操作数就会转换为int类型。

3 强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟转换的变量名。譬如 double x=9.997, int nx=(int)x;这样nx的值为9.强制类型转换通过截断小数部分将浮点数转换为整型。如果想对浮点数进行舍入运算,以便得到最接近的整数,就需要使用Math.round方法: double x=9.997; int nx=(int) Math.round(x);现在变量nx的值为10,当调用round方法返回的结果为long类型,由于存在信息丢失的可能性,所以只有使用显式的强制类型转换才能够将long类型转换为int类型。

4 不要在boolean类型与任何数值类型之间进行强制类型转换,这样可以防止发生错误。只有在极少数的情况下才需要将布尔类型转化为数值类型,这时可以使用条件表达式b?1:0。

5 如果运算符得到一个值,其类型与左侧操作数的类型不同,就会发生强制类型转换。例如,如果x是一个int,则以下语句x+=3.5;是合法的,将把x设置为(int)(x+3.5)。

4 字符串

1 Java语言允许使用+号连接(拼接)两个字符串。当将一个字符串与一个非字符串的值进行拼接时,后者被转换为字符串,任何一个Java对象都可以转换成字符串。

2 如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态join方法:String all=String.join("/","S","M","L","XL");

3 由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如同数字3永远是数字3一样,字符串不能修改其中任何一个字符,不过可以修改字符串变量,让它引用另一个字符。譬如String new_str=old_str.substring(0,3)+"pl!";

4 可以使用equals方法检测两个字符串是否相等。s.equals(t),s可以是字符串字面量也可以是字符串变量。不能用==来检测两个字符串是否相等,这个运算符只能够确定两个字符串是否放置在同一位置上。如果虚拟机始终将相同的字符串共享,就可以使用==运算符检测是否相等。但实际上只有字符串常量是共享的。而+或substring等操作产生的结果并不是共享的,因此不能用==运算符测试字符串的相等性,以免在程序中出现糟糕的bug。从表面上看,这种bug很像随机产生的间歇性错误。

5 可以用if(str.length()==0)或if(str.equals("")),不过String 变量还可以存一个特殊的值,名为null。if(str==null) 。有时要检查一个字符串既不是null也不为空串,if(str!=null && str.length()!=0)

6 常用的字符串API int compareTo(String other) 按照字典顺序,如果位于字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0.

boolean equals(Object other)如果字符串与other相等,返回true。

boolean equalsIgnoreCase(String other) 如果字符串与other相等(忽略大小写),返回true.

int length() 返回字符串的长度。

String substring(int beginIndex)

String  substring(int beginIndex,int endIndex)返回一个新字符串。这个字符串包含原始字符串中从beginIndex到串尾endIndex-1的所有代码单元。

String toLowerCase()

String toUpperCase() 返回一个新字符串。这个字符串将原始字符串中的大写字母改为小写,或者将原始字符串中的所有小写字母改成了大写字母。

String trim() 返回一个新字符串。这个字符串删除了原始字符串头部和尾部的空格。

String join(CharSequence delimiter,CharSequence... elements) 8返回一个新字符串,用给定的定界符连接所有元素。

7 有时需要由较短的字符串构建字符串,例如,按键或来自文件中的单词。采用字符串连接的方式达到此目的的效率比较低。每次连接字符串,都会构建一个新的String对象,既耗时又浪费空间,使用StringBuilder类可以避免这个问题。如果需要用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行,首先构建一个空的字符串构建器:StringBuilder builder = new StringBuilder();  当每次需要添加一部分内容时,就调用append方法。builder.append(ch);builder.append(str);在需要构建字符串时就调用toString方法,将可以得到一个String对象,其中包含了构建器中的字符序列。 String completedString=builder.toString();

8 StringBuilder( )  构造一个空的字符串构建器

int length()  返回构建器或缓冲器中的代码单元数量。

StringBuilder append(String str)  追加一个字符串并返回this

StringBuilder insert(int offset,String str)  在offset位置插入一个字符串并返回this。

StringBuilder delete(int startIndex,int endIndex)  删除偏移量从startIndex到endIndex-1的代码单元并返回this。

String toString()  返回一个与构建器或缓冲器内容相同的字符串。

5 输入输出

1 要想通过控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in关联。Scanner in = new Scanner(System.in);常用的API有:

Scanner(InputStream in) 用给定的输入流创建一个Scanner对象。

String nextLine()  读取输入的下一行内容。

String next()  读取输入的下一个单词(以空格作为分隔符)

double nextDouble()  读取并转换下一个表示整数或浮点数的字符序列。

boolean hasNext()   检测输入中是否还有其他单词

boolean hasNextDouble()  检测是否还有表示整数或浮点数的下一个字符序列。

2 格式化输出类似C语言库printf的用法,但还有其他格式化输出,用到的时候再看。

3 想要对文件进行读取,就需要用File对象构造一个Scanner对象,Scanner in = new Scanner(Paths.get("myfile.txt"),''UTF-8");

如果文件中包含反斜杠符号,就要在每个反斜杠之前再加一个额外的反斜杠:“c:\\mydirectory\\myfile.txt”。

4 要想写入文件,就需要构造一个PrintWriter对象。在构造器中,只需提供文件名: PrintWriter out = new PrintWriter("myfile.txt","UTF-8"),如果文件不存在,创建该文件。可以像输出到System.out一样使用print,println以及printf命令。

6 控制流程

1 在C++中,可以在嵌套的块中重定义一个变量。在内层定义的变量会覆盖在外层定义的变量。这样有可能导致程序设计错误,因此在Java中不允许这样做。

2 在switch case语句中,case的标签可以是:类型为char,byte,short,int的常量表达式,枚举常量,从Java SE7开始,case标签可以是字符串字面量。

3 与C++不同,Java还提供了一种带标签的break语句,用于跳出多重循环的嵌套语句。有时候在嵌套很深的循环语句中会发生一些不可预料的事情,此时可能更有希望跳到嵌套的所有循环语句之外。通过添加一些额外的条件判断实现各层循环的检测很不方便。

Scanner in = new Scanner(System.in);
int n;
read_data:
while(){
    for(){
        if(n<0)
            break read_data;
        }
        }
//this statment is executed immediately after the labeled break

通过执行带标签的break跳转到带标签的语句块末尾。

7 大数值

1 如果基本的整数和浮点数精度都不能满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。使用静态的valueOf方法可以将普通的数值转换为大数值: BigInteger a = BigInteger.valueOf(100);

2 与C++不同,Java没有提供运算符重载功能。程序员无法定义+和*运算符,使其应用于BigInteger类的add和multiply运算。Java语言的设计者确实为字符串的连接重载了+运算符,但没有重载其他运算符,也没有给Java程序员在自己的类中重载运算符的机会。常用的API有:

BigInteger add(BigInteger other)

BigInteger subtract(BigInteger other)

BigInteger multiply(BigInteger other)

BigInteger divide(BigInteger other)

BigInteger mod(BigInteger oyher)

返回这个大整数和另一个大整数other的和,差,积,商以及余数。

int compareTo(BigInteger other)  如果这个大整数与另一个大整数other相等,返回0;如果这个大整数小于另一个大整数other,返回负数;否则,返回正数。

static BigInteger valueOf(long x) 返回值等于x的大整数

BigDecimal add(BigDecimal other)

BigDecimal subtract(BigDecimal other)

BigDecimal multiply(BigDecimal other)

BigDecimal divide(BigDecimal other RoundingMode mode)

返回这个大实数与另一个大实数other的和,差,积,商。要想计算商,必须给出舍入方式,RoundingMode.HALF_UP即四舍五入。

int compareTo(BigDecimal other)  如果这个大实数与另一个大实数相等,返回0;如果这个大实数小于另一个大实数,返回负数;否则返回正数。

static BigDecimal valueOf(long x)

static BigDecimal valueOf(long x,int scale)返回值为x或x/(10的scale次)的一个大实数。

8 数组

1 创建一个数字数组时,所有的元素都初始化为0。boolean数组的元素会初始化为false。对象数组的元素则初始化为一个特殊值null,这表示这些元素未存放任何对象。

2 要想获得数组中的元素个数,可以使用array.length。

3 for each循环for(variable:collection) statment定义一个变量用于暂存集合中的另一个元素,并执行相应的语句。collection这一集合表达式必须是一个数组或者一个实现了Iterable接口的类对象。 例如 for(int element:a)  System.out.println(element);for each循环语句不必为下标的初始值和终止值而操心。

4 在Java中,提供了一种创建数组对象并同时赋予初始值的简化书写形式。如int[] smallPrimes={2,3,5,7},甚至还可以初始化一个匿名数组new int[]{1,3,2,4}.这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数。使用这种语法形式可以在不创建新变量的情况下重新初始化一个数组。如smallPrimes = new int[]{1,3,43,23};

5 在Java中允许数组长度为0,在编写一个结果为数组的方法时,如果碰巧结果为空,则这种语法形式非常有用。注意,数组长度为0与null不同。

6 在Java中,允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组。如果希望将一个数组的所有值拷贝到另一个新数组中去,就要使用Arrays类的copyOf方法。  int[] newArray=Arrays.copyOf(oldArray,oldArray.length);第二个参数是新数组的长度,这个方法通常用来增加数组的大小:newArray=Arrays.copyOf(oldArray,2*oldArray.length);如果数组元素是数值型,那么多余的数组就被赋值0,如果数组元素是布尔型,则将赋值false。相反,如果长度小于原始数组的长度,则只拷贝最前面的数据元素。

7 常用API  static String toString(type[] a)  返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔。参数a类型为int,long,short,char,byte,boolean,float或double数组。

static type copyOf(type[] a,int length)

static type copyOfRange(type[] a,int start,int end)  返回与a类型相同的一个数组,其长度为length或者end-start,数组元素为a的值,参数a类型为int,long,short,char,byte,boolean,float或double数组。其他类似python。length 拷贝的数据元素长度。如果length值大于a.length,结果为0或false,否则,数组中只有前面length个数据元素的拷贝值。

static void sort(type[] a) 采用优化的快排进行排序。

static int binarySearch(type[] a,type v)

static int binarySearch(type[] a,int start,int end,type v)采用二分搜索算法查找值v。如果查找成功,则返回相应的下标值;否则,返回一个负数r。

static void fill(type[] a,type v)   将数组的所有数据元素值设置为v。

static boolean equals(type[] a,type[] b)  如果两个数组大小相同,并且下标相同的元素都对应相等,返回true。

8 for each循环语句不能自动处理二维数组的每一个元素。它是按照行,也就是一维数组处理的。要想访问二维数组a的所有元素,需要使用另个嵌套的循环:

for(double[] row:a)

    for(double value:row)

           do something with value

猜你喜欢

转载自blog.csdn.net/leon_lavie/article/details/82813066