简单java应用程序
public class Example //类声明
{
public static void main(String[] args) //main方法声明,必须声明为public
{
System.out.println("This is my first Java program"); //方法
}
}
基本概念
- 数据类型
类型 | 存储需求 | 有效位数 |
---|---|---|
int | 4字节 | |
short | 2字节 | |
long | 8字节 | |
float | 4字节 | 6~7位 |
double | 8字节 | 15位 |
-
boolean 类型
java的布尔类型只可以使用false和true这两各值,不可以使用诸如0或者非0这样的值。 -
特殊浮点标记
- 无穷大 :Double.POSITIVE_INFINITY
- 负无穷大 :Double.NEGATIVE_INFINITY
- NaN:Double.NaN
然而以上三个常量在实际中很少用到
注:若要判断一个特定值是否等于Double.NaN,可以使用
if(Double.isNaN(X)) //check whether x is "not a number"
-
Java中的break可以使用标签,使用方法类似cpp中的goto语句
-
final关键字
final关键字可以指示常量
public class Constants
{
public static void main(String[] arg)
{
final double A_NUM=2.0; //final表示这个变量只能被赋值一次,一次复制之后,就不能够再修改了
//习惯上,常量名使用全大写
}
}
- 严格浮点运算标记
strictfp
public static strictfp void main(String[] args)
- 数学函数和常量
/*常用函数类*/
Math.sqrt(x) //平方根
Math.pow(x,a) //幂运算
Math.floorMod(position + adjustment,12) //归一化到0~12
/*三角函数类*/
Math.sin Math.cos Math.tan Math.atan Math.atan2
/*指数函数和对数函数*/
Math.exp Math.log Math.log10
/*PI和e*/
Math.PI Math.E
如果不必在数学方法名和常量名前添加前缀“Math”,则可以:
import static java.lang.Math.*;
System.out.println(sqrt(x));
- 强制转换
基本强制转换类型和C语言类似,这里多介绍一个round方法
double x=9.997
int nx=(int) Math.round(x); //round返回最接近的整数,返回值类型为long,这里需要强制转换类型
- 运算符
各种运算符使用基本与c++类似。
其中移位运算>>
和<<
直接限定是算术移位(扩展符号位),而>>>
是逻辑移位(填充0位),不存在<<<
这种运算。 - 枚举类
enum Size{S、M、L、X};
Size s = Size.S; //Size类也可以声明为null值
- 大数值
若基本的整数和浮点数精度不满足要求,可以使用java.math
包中的两个类:BigInteger
和BigDecimal
。这两个类可以处理包含任意长度数字序列的数值
BigInteger a = BigInteger.valueOf(100);
/*大数加和乘的运算*/
BigInteger c = a.add(b); //c = a+b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); //d = c*(b+2)
字符串
/*定义*/
String e = ""; //定义空字符串
String a = "This is my first Java program";
System.out.println(a);
String e = a.substring(0,3); //第一个参数是字串起始位置,第二个参数是不想复制的第一个位置
/*拼接*/
String c = ",i like it!";
String d = a + c;
String all = String.join("A", "B","C","D"); //这里输出的是"BACAD"
/*检测字符串是否相等*/
s.equals(t); //如果字符串s与t相等,则返回true;否则,返回false
"Hello".equals(s); //这种比较也是合法的
"Hello".equalsIgnoreCase("hello"); //不区分大小写的比较两个字符串
/*检测字符串是否是空串*/
if(str.length() == 0); //空串与null值不同
if(str != null); //检测是否是null
/*返回位置n的代码单元*/
char first = t.charAt(0);
Java中将String类对象称为不可变字符串,这样的优点是编译器可以让字符串共享。Java的设计者认为共享带来的高效率远远胜于提取、拼接字符串所带来的低效率。
直接对已经存储有数据的String方法a赋予另外一个值,不会产生内存遗漏,Java会自动地进行垃圾回收。
构建字符串
StringBuilder builder = new StringBulider(); //构建一个空的字符串构建器,当需要添加一部分内容的时候,调用append方法
builder.append(ch); //追加一个代码单元并返回this
builder.append(str); //追加一个字符串并返回this
String completedString = builder.toString(); //返回一个与构建器或缓冲器内容相同的字符串
StringBuilder 和 StringBuffer的区别
StringBuilder 的前身是 StringBuffer
StringBuffer 效率比较低,但是允许采用多线程的方式执行添加或删除字符的操作
如果所有字符串在一个单线程中编辑,应该使用 StringBuilder
输入输出
输入:
/*基本输入*/
import java.util.*; //Scanner类定义在java.util包中
Scanner in = new Scanner(Syetem.in); //首先构造一个Scanner对象,并与“标准输入流”System.in关联
String name = in.nextline(); //nextline可以输入空格
String firstname = in.next(); //next以空格为结束标志
int age = in.nextInt(); //读取一个整数
int salary = in.nextDouble(); //读取一个浮点数
String string = in.next(); //读取以空白字符结束的字符串,如' ' ,'\t','\f','\r','\n'
String string = in.nextln(); //读取以按下回车键为结束标志的字符串
//从控制台输入
Console cons = System.console();
String username = cons.readLine("Username");
char[] passwd = cons.readPassword("Password:");
输出
//简单输出
System.out.println(); // 输出以后并换行
System.out.print(); //输出以后不换行
//格式化输出
System.out.printf("Hello,%s. Next year, you'll be %d",name,age);
控制流程
-
循环结构
Java的基本循环结构与C++类似,这里不再论述。
需要注意的是Java支持带标签的break语句,标签用法与C++的goto类似。同样的,continue也可以使用标签。 -
for each 循环
用来一次处理数组中的每个元素,而指定下标值。
其格式是:
for (variable:collection) statement
for(int element : a)
System.out.println(element);
数组
- 数组声明
Java数组与cpp中的分配在heap上的数组指针是类似的
/*声明*/
int [] a = new int[100];
/*匿名声明*/
new int [] ={1,2,3,4,5,6,7};
/*不创建新变量声明*/
a = new int[] {1,2,3,4,5,6,7};
//上面例子等价于
int [] b = {1,2,3,4,5,6,7};
a = b;
- 数组拷贝
如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,则将赋值为false。如果长度小于原始数组的长度,则只拷贝最前面的数据元素
/*变量拷贝*/
int [] a =b ;
a[5] = 1 ; //拷贝的结果是两个变量引用同一个数组
/*两个数组的拷贝*/
int [] a = Array.copyOf(b,b.length);
- 数组排序
int[] a = new int[10000];
Arrays.sort(a) //快排
-
多维数组
-
- 多维数组只需要记住一句话:“多维数组也是一维数组,只不过是数组的数组”
-
- Java中多维数组可以实现锯齿数组(ragged array)。如,二维数组的各行长度不同。
/*声明和初始化*/
double [][] a =
{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
/*二维数组在循环中赋值*/
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a[0].length;j++)
赋值语句;
} //a.length是数组的列数,a[0].length是数组的行数
/*for each 在二维数组中的使用*/
for(double[] row : a)
for(double value : row)
do something with value;