Java小白学习笔记2——基本的语法

其实绝大部分内容和C++是很像的,区别在Java多了一些特性。

由于目前(竞赛层次)上用到的Java语言特性并不算多,所以一些细节问题在研究过后就没再深究。我的态度是和学习STL一样,基于实用主义,不求甚解。


基本的输入输出

Java语言是面向对象的程序设计语言,Java程序的基本组成单元是类,类体中又包括属性和方法两部分,每一个应用程序都必须包含一个main()方法,含有main方法的类被称为主类。main方法的写法一般是固定的。

一般来说各大OJ上用java交题时,类名限定使用Main这个名字。

撇开import不谈,Java程序最外面的框架应该是:

1
2
3
public class Main {
//...
}

这里有了一个叫Main的主类,这个主类里面还要有一个叫main()的主方法。诶,不要以为这俩是一样的,Java对大小写敏感,这俩其实不是一回事。刚才说到main方法一般写法是固定的,这里给出写法:

1
2
3
public static void main(String[] args) {
//...
}

这里public修饰权限,static确定是静态还是非静态(关于这个关键字我折腾了一个下午,最后决定不求甚解,不过可以明确的是这个static和C/C++里面的static是不一样的),main的返回值是void类型。String args[]是一个字符串类型的数组,它是main()方法的参数。和C/C++一样,main()方法是程序开始执行的位置。

关于那个static,目前知道的是,如果要在main()方法外面定义变量时,变量都需要加上static修饰才能使用,但是在main()方法里面定义的变量则不能写static,否则会产生错误。原因暂时没搞明白。

(插播一句,C语言和C++语言里根本就没有void main这种写法,请读者务必注意)

之后的内容就和C++基本一致了。Java中可以使用import导入类库,作用和C/C++中的#include比较相似。

这里说一下与C/C++的相异之处。

布尔类型写成boolean而不是bool。

声明常量使用的是final修饰符而不是const。例:final double PI = 3.14;此外,当定义的final“变量”(其实是常量)属于成员变量时,必须在定义时就设定它的初值,否则会产生错误。

位运算多了一个>>>,这个叫无符号右移。

Java支持无端就弄出来个花括号括起来的语句块,它为变量限定了作用域。比如说:

1
2
3
4
5
6
7
8
9
10
11
public class Test {
public static void main() {
int x = 20; {
int y = 40;
System.out.println(y);
}
System.out.println(x);
//System.out.println(y);
//这样写会出错
}
}

Java为for循环提供了一个新的可能性。即使用一个变量在一个对象里进行遍历。这种语句叫做foreach语句,但是写法上并不是写foreach,foreach不是Java的关键字,实际使用的还是for。这个例子我随着后面对数组的运用一块举出。

此外,使用break语句跳出循环时也可以指定跳出哪层循环。比如现在有一个两层或者三层循环,我想让满足某个情况时直接跳出整个循环,而不是返回上一层,那就可以在最外层循环上打一个标签,然后break时后加标签即可。

1
2
3
4
标签名:循环体 {
if (conditions)
break 标签名;
}

continue用法和break一致。

最后再来说一下输出。输出语句教材上讲的不多,笔者从网上找到了相应控制台输入输出的格式。

Scanner in = new Scanner(System.in);
in.close();

这两行语句我目前还暂时搞不清楚具体的工作原理,但是写了它之后就可以进行输入输出了。第二句看起来像是关闭某个东西。

写法上和当时用快读的时代差不多,比如说有一个int型变量n,那读入就写成n = nextInt();读字符串就是str = nextLine();(一读读一整行)读单个字符可以用char c=(char)System.in.read();

输出用的System.out.print()还有System.out.println(),后者会在输出最后加一个换行。函数内部写法和py很像,支持各种类型相加。

Java字符串

Java的基本类型不包括String类型。String不可以写成string。字符串初始化可以直接用引用常量形式,比如String s = “2333”;未经初始化而使用字符串编译器会报错。

此外,Java还支持使用char数组对String进行初始化,而你并不需要考虑那个恶心人的’\0’。

字符串的常用操作有很多,而与C++中STL库的string类的相异之处也是有的。尽管Java字符串也支持相加,甚至于说不同类型之间的变量都可以加在一起当字符串,但是不能直接用逻辑相等对字符串进行比较了。

.length()方法获取字符串长度,这个是一样的。

.indexOf(String s)这个方法用于返回参数s在字符串中首次出现的下标位置。同理有lastindexOf,emmm大概率ACM用不到。

.substring(int beginindex)方法获取子串,是从beginindex所指下标开始一直到末尾。可能在某些字符串题目中用得到。此外还可以用成.substring(int beginindex, int endindex),指的是从beginindex位置取到endindex位置,个人感觉这个应该比前一个好用一些。

.trim()用来去除字符串开头以及末尾多余的空格。

(唉要是有能把单词和单词之间多余空格去除,只留一个空格的函数多好。。)

.replace(char oldChar, char newChar)用来把串里面所有的oldChar替换成newChar,或许有用。

.startsWith(String prefix)判断当前字符串为对象的前缀是否是参数指定的字符串。条件太苛刻,手动写也差不多,估计用不到。

.endsWith(String suffix),和上边那个一样,只不过前缀变成了后缀。这个函数自己写出来都不难,ACM的话使用的意义不算太大。

.equals(String otherstr),刚才说到字符串不能用逻辑相等进行比较,因为在Java里面字符串是以引用的形式存放的。所以系统为我们提供了一个比较相等的函数。判断字符串相等还是比较有用的,这个大概率使用率不低。

此外,.equalsIgnoreCase(String otherstr)支持忽略大小写地比较两个字符串,可能有用,笔者持观望态度。

.compareTo(String otherstr),它按字典序比较两个字符串,假设A.compareTo(B),如果A的字典序比B小,结果是一个负数,如果A的字典序比B大,结果是一个正数,二者相等时结果是0。

str.toLowerCase(),把整个串转化成小写,或许有用。

str.toUpperCase(),把整个串转化成大写,和上边那个相对的。

.split()方法可以使字符串按指定的分割字符或者字符串对内容进行分割,并且把分割后的结果保存在数组里。(所以这TM就是你只给读一整行字符串的理由吗QAQ),后面可以再加一个int型的参数,代表分割次数。

.format()对字符串进行格式化,教材上给出的例子是转化系统日期和时间,个人感觉ACM用不到。

正则表达式学不会啊QAQ

数组相关

Java数组画风清奇,写法上和C++有很大的不同。Java数组遵循先声明,再分配内存的原则。所以声明的时候是不能写下标的。比如C++里面的什么int a[maxn]这种操作通通使不得,需要先写成int a[];或者int[] a;这种时候数组还是暂时不能用的,还需要使用new来分配内存。写法是:数组名子 = new 数组元素类型[数组元素个数(可以使用变量)]

二维数组类似,也就是把a[]换成a[][]。。。此外,数组支持使用.length返回长度。

由于分配内存可以自由选择大小,所以Java里面二维数组可以“长得并不像”矩阵,可长可短。

emmmmm需要注意一点,使用foreach语句遍历二维数组时也要套两层。。如果要控制换行还要加临时变量,临时变量每跑一次内层循环就+1,该变量值等于这一维度的长度时换行。

对数组进行排序则直接使用Arrays.sort(数组名)就可以了。多关键字排序和降序排序我正在研究当中。目前可以清楚的是,在Java里面可以不用像C一样一次性开maxn那么大的空间,因为这个排序是对整个数组的排序,如果数组太大了会导致前面有一大堆的0,而你的数据都跑到数组的最后面去了。

Arrays.copyOf(arr, int newLength)方法可以对数组进行复制,arr代表要复制的数组,newLength代表复制的长度,如果新数组还有剩余空间则填充为0。把它的返回值赋给一个已经声明的数组就可以了。

还有Arrays.copyRange(),用法类似,是复制一个区间。

Arrays类还有一个binarySearch方法,显然这就是一个二分查找。两个参数分别是要搜索的数组和要搜索的值。二分查找我就不用多说了吧。。

这样应该就能用Java写一些简单的题了。

一个简单的示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
for (int i = 0;i < n; i++) {
a[i] = in.nextInt();
}
Arrays.sort(a);
for (int x:a) {
System.out.print(x + " ");
}
in.close();
}
}

-------------本文结束,感谢您的阅读转载请注明原作者及出处-------------


本文标题:Java小白学习笔记2——基本的语法

文章作者:Shawn Zhou

发布时间:2019年01月12日 - 18:01

最后更新:2019年01月18日 - 19:01

原始链接:http://shawnzhou.xyz/2019/01/12/19-01-12-01/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

知识无价,码字不易。对您有用,敬请打赏。金额随意,感谢关心。
0%