变量
变量的定义 int myAge = 12;
变量的声明 int myName;
变量的赋值 myName = 1024;
变量只能在作用域内使用,不可以声明两个同名变量
数据类型
基本数据类型
整型:byte(1字节) \ short(2字节) \ int(4字节) \ long(8字节)
浮点型:float(4字节,3.403E38) \ double(8字节,1.798E308)
字符型:char //a:97, A:65
布尔型: boolean
注:long、float型变量的声明:
long l1 = 123456L; //long型变量的定义必须在末尾加"L"或"l",若不加L则视为定义的int型变量。
float f1 = 123.4f; //long型变量的定义必须在末尾加"F"或"f",不加会直接导致报错(double转float变小是被拒绝的)
引用数据类型
类:class //String类型属于类
接口:interface
数组:[]
基本数据类型的使用
char型中只能存放一个字符,汉字也可以存入。
代码实例:
class VariableTest{
public static void main(String[] args){
char c1 = 'A';
char c2 = 'Y';
System.out.println(c1);
System.out.println(c2);
}
}
转义字符:存在char型变量中,例:char c = '\n';
代表换行。
类型转换
类型转换只存在于除boolean外的7种基本数据类型中。
-
自动类型提升
更小数据的运算必须由更大或两者中更大的一方的数据类型变量接收。byte b1 = 124; int i1 = 567; //byte b2 = b1 + i1; //会报编译错误 不能从大到小转换 int i2 = b1 + i1; float f1 = b1 + i1; System.out.println(f1); //691.0 System.out.println(i2); //691
char型变量也可以进行类型提升,其容量相当于int类型。
特别,char、byte、short进行运算时,结果相当于int类型。char c1 = 'a'; //97 int i3 = 10; int i4 = c1 + i3; //short s1 = c1 + i3; //编译不通过 不能从大到小转换 //char c2 = s1 + c1; //编译不通过 short、byte、char做运算时结果为int型 System.out.println(i4); //107
-
强制类型转换
自动类型提升的逆运算,使用()进行运算double d1 = 12.3; int i5 = (int)d1; System.out.println(i5); //12 精度损失 int i6 = 128; byte b3 = (byte)i6; System.out.println(b3); //-128 超出范围
-
常量在java中的默认类型
整形常量在默认为int型,浮点型常量默认为double型,这意味着:class VariableTest3{ public static void main(String args[]){ byte b1 = 12; b1 = b1 + 2; //会报错,因为2默认为int型变量 flaot f1 = 12.3f; f1 = f1 + 1.0; //会报错,因为1.0默认为double型变量 } }
String类型
String是引用数据类型,是由一个一个的char型变量组合而成,String可以与八种数据类型做运算,只能用“+”做运算,意思为链接两个字符串。
注:“+”在非String型类型中运算是相加的意思,在有String型变量参与的时候才是链接。
String类型无法通过强制类型转换转换为其他类型,想要转换需要调用外部类如Interger等。
String s1 = "Hello World!";
String s2 = "你好:";
String s3 = s2 + s1; //+号代表两个字符串连接在一起
System.out.println(s3); //你好:Hello World!
int Number = 1001;
String s4 = s2 + Number;
System.out.println(s4); //你好:1001
boolean b1 = true;
String s5 = s2 + b1; //八种数据类型都可以与String类型做+法,进行连接
System.out.println(s5); //你好:true
运算符
算数运算符
+、 -、 *、 /、 %、++、 --、 +(字符串链接)、
注:取模运算中,余数与被模数符号相同。
自增运算不会改变数据类型,如:
short s1 = s;
s1 += 2; //s1结果仍为short类型
s1 = s1 + 2; //数据类型被改变,s2变为int类型
逻辑运算符
&、&&、|、||、!、^
&、&&:与运算,必须都为真,结果才为真
|、||:或运算,有一个为真就为真
&:逻辑与:false & num++; //无论如何逻辑运算的两边都会执行
&&:短路与 false && num++; //若前面的条件已判断为false的话,则会直接判断整体为false,不会再执行后面的条件,即num++不会执行
|:逻辑或:true & num++; //无论如何逻辑运算的两边都会执行
||:短路或:true && num++; //若前面的条件已判断为true的话,则会直接判断整体为true,不会再执行后面的条件,即num++不会执行
!:取反
^:异或:不同时为真,相同时为假
位运算符
位运算符只能对整型数据进行运算
‘>>’、‘<<’、‘>>>’、‘&’、‘|’、‘^’
<<:左移,将数以二进制形式左移,例:3<<2,3左移两位,11 -> 1100 即12。相当于乘以2的2次方
‘>>’:右移,类比左移,每右移一位相当于除以2
位运算符的运行效率要高于±*/等运算,即:
2 * 8 更好的写法是 2 << 3; 或 8 << 1;
‘>>>’:无符号右移,以0补最左边,进行右移,可能导致符号的变化,一般不使用。
&、|、^、!:按位与、按位或、按位异或、按位非:按底层二进制存储的两个数的0与1的不同进行对应位的逻辑操作后产生的结果。
三元运算符
(条件表达式)?(表达式1):(表达式2)
若条件表达式值为true,则执行表达式1;
若条件表达式值为false,则执行表达式2;
整体是有返回值的,是表达式1和表达式2的统一
(m > n) ? 2 : 3.0; //被统一成double型变量
(m > n)? "m大" : (m == n)? "相等": "n小"; //可以嵌套
流程控制
注:从键盘获取数据的方法
使用scanner类实现从键盘输入:
import java.util.Scanner; //导入Scanner必要的包
class ScannerTest{
public static void main(String[] args){
Scanner scan = new Scanner(System.in); //创建对象
System.out.print("请输入姓名:");
String name = scan.next(); //使用scan对象从键盘读入String类型变量
System.out.print("\n");
System.out.print("请输入年龄:");
int age = scan.nextInt(); //使用scan对象从键盘读入int类型变量
System.out.print("\n");
System.out.print("请输入体重:");
double weight = scan.nextDouble(); //读入double型变量
System.out.print("\n");
System.out.print("你相中他了吗(true/false):");
boolean isLove = scan.nextBoolean(); //读入boolean型变量
System.out.print("\n");
System.out.println(age + "岁的" + weight + "斤的" + name + "对你的感觉是:" + isLove);
}
}
if-else结构
switch-case结构
switch-case中switch的表达式只能是byte、short、char、int、枚举类型(JDK5.0)、String类型(JDK7.0新增)
case中的表达式只能存放6种数据类型,不可以写范围。
循环结构
for循环
/*
体会for循环条件中的定义,第一个分号之前的内容可以省略,但只能执行一个条件,int num = 1;不能放在其中
*/
int num = 1;
for(System.out.print("a"); num < 3; System.out.print("c"), num++){
System.out.print("b");
}
while循环
所有用while的循环都可以用for写,for写的循环也可以用while写。
do-while循环
do-while先执行一边循环体,再判断循环是否继续迭代。
while(true)根据条件结束循环
/*
不限制次数的循环
题目:
从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
*/
import java.util.Scanner;
class WhileTrue{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int positiveNum = 0;
int negativeNum = 0;
for(;;){ //或while(true)
int num = scan.nextInt();
if(num < 0){
negativeNum++;
}else if(num > 0){
positiveNum++;
}else if(num == 0){
break;
}
}
System.out.println("输入的正数数量为:" + positiveNum);
System.out.println("输入的负数数量为:" + negativeNum);
}
}
100以内所有质数的输出
/*
100以内所有质数的搜索
1. 基础执行:双循环嵌套搜索
2. 优化一:break语句截断非质数的无效搜索
3. 优化二:math.sqrt()阶段质数的无效搜索
注:数学知识,质数x如果前根号x的数都无法找到一个整除,则整个后面也不可能再找到能整除的数。
*/
class PrimeNumber{
public static void main(String[] args){
Long start = System.currentTimeMillis();
int count = 0; //计数器,用来存储质数的个数
boolean isFlag = true;
for(int i = 2; i <= 100000; i++){
for(int j = 2; j < i; j++){
for(int j = 2; j < Math.sqrt(i); j++){ //优化二
if(i % j == 0){
isFlag = false;
break; //优化一
}
}
if(isFlag == true){
count++;
}else{
isFlag = true;
}
}
Long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("所消耗的时间为:" + (end - start)); //
/*
未优化消耗时间:14115
优化一后消耗时间:1149
再优化二后消耗时间:10
*/
}
}
注:continue和break语句后不能写语句,因为可能被跳过,无法通过编译。
带标识符的break与continue
label:for(;;){
for(;;){
break label; //意为中断标签为label的循环,在该例中指外层循环。
continue label;
}
}
质数的输出也可以利用带标签的continue语句实现。