java基本程序设计结构👀
1.第一个Java程序🐝
public class FirstCode{ //驼峰命名法
public static void main(String[] args){
System.out.println("Welcome to java"); //使用双引号界定符
}
}
2.八种基本类型🐛
整型
int 4字节 -21亿~21亿(大概)
short 2字节 -32768~32767
long 8字节 -9 223 372 036 854 775 808~9 223 372 036 854 775 807 //后缀L或l 如400000L
byte 1字节 -128~127
//java没有任何无符号形式的上述类型
十六进制:前缀0x或0X 如0xCAFE
八进制:前缀0 如010表示8
二进制:前缀0b或0B 如0b1001表示9
可以加下划线:1_000_000(ob1111_0100_0010_0100_0000)表示100万
浮点型
float 4字节 //有效位数6~7位 有后缀F或f 如3.14f 没有后缀是默认为double型
double 8字节 //有效位数15位 可以选择性加后缀D或d 如3.14D
可以使用十六进制表示浮点数值:0.125=2-3表示为0*1.0p-3 此时p表示指数
浮点数采用二进制系统表示,有舍入误差
- 正无穷大
- 负无穷大
- NaN Double.isNaN(x)判断是不是数值
char类型
表示单个字符,要用’ '括起来
Unicode转义序列会在解析代码之前得到处理
转义序列 | 名称 | Unicode值(跟16进制数) |
---|---|---|
\b | 退格 | \u0008 |
\t | 制表 | \u0009 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\" | 双引号 | \u0022 |
\’ | 单引号 | \u0027 |
\\ | 反斜杠 | \u005c |
boolean类型
true
false
3.变量与常量🦋
变量
常量
使用final
修饰,不可再改变
枚举类型
enum Size{S,M,L,X}; //定义
Size s=Size.M; //声明,只能设置定义中的值或者null
4.运算符🐌
算术运算符
使用严格浮点运算
public static strictfp void main(String[] ages){}
强制类型转换
大类型转换为小类型是需要强制转换(当精度造成丢失时)
double x=9.997;
int nx=(int)x;
> nx=9
double x=9.997;
int nx=(int)Math.round(x); //round方法返回的结果为long类型
> nx=10
位运算符🤒
&("and")|("or")^("xor")~("not")
&
按位与
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|
按位或
两个相应的二进制位中只要有一个为1,该位的结果值为1
^
按位异或
若参加运算的两个二进制位值相同则为0,否则为1
~
取反
~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1
<<
左移
用来将一个数的各二进制位全部左移N位,右补0
>>
右移
将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数, 高位补0
左移和右移可以在补码的形式下进行,之后在转为原码。
数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
右移一位相当于除2,右移n位相当于除以2的n次方。
>>>
“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。
a=-1,a<<1
> a=-2
a=10,a>>1
> a=5
5.字符串🐞
子串
String greeting="Hello";
String s=greeting.substring(0,3);
> s="Hel"
拼接
String expletive="Hello";
String ager="World";
String message=expletive+ager; //用‘+‘拼接,可以与数字拼接
String all=String.join("/",,"S","M","L","XL"); //用/界定符分隔
> all=S/M/L/XL
String repeated="java".repeat(3); //重复3遍,java11中
> repeated="JavaJavaJava"
修改字符串
//String是不可变的,只能重新赋值
greeting=greeting.substring(0,3)+"p!";
检测是否相等
s.equals(t);
相等返回true,否则返回false
不区分大小写检测
s.equalsIgnoreCase(t);
compareTo
obj1.compareTo(obj2)
如果该方法返回0,则表示两个对象相等,如果该方法返回一个正整数,则表明obj1大于obj2;如果该方法返回一个负整数,则表明obj1小于obj2。
public class Main {
public static void main(String[] args) {
// 即参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,
// 返回该不同的字符的asc码差值,如果两个字符串不一样长,可以参与比较的字符又完全一样,则返回两个字符串的长度差值
String str1 = "abc", str2 = "ab", str3 = "abccc", str4 = "abe";
System.out.println("str1.compareTo(str2):" + str1.compareTo(str2));
System.out.println("str2.compareTo(str1):" + str2.compareTo(str1));
System.out.println("str1.compareTo(str3):" + str1.compareTo(str3));
System.out.println("str1.compareTo(str4):" + str1.compareTo(str4));
Integer num1 = 1, num2 = 4;
System.out.println("num1.compareTo(num2):" + num1.compareTo(num2));
System.out.println("num2.compareTo(num1):" + num2.compareTo(num1));
Character a = 'a', d = 'd';
System.out.println("a.compareTo(d):" + a.compareTo(d));
}
}
//输出
str1.compareTo(str2):1
str2.compareTo(str1):-1
str1.compareTo(str3):-2
str1.compareTo(str4):-2
num1.compareTo(num2):-1
num2.compareTo(num1):1
a.compareTo(d):-3
空串与Null串
检测是否为空
if(str.length()==0)或
if(str.equals(""))
检测是否为null
if(str==null)
检查二者
if(str!=null&&str.equals("")) //要先检查是否为null
码点与代码单元
char数据类型是一个采用UTF-16编码表示的Unicode码点的代码单元
- 常见的Unicode采用一个代码单元就可以表示
- 辅助字符需要一对代码单元
得到码点数量
int cpCount=str.codePointCount(0,str.length())
返回位置n的代码单元(有时会不准确)
char last=str.charAt(n);
得到第i个码点
int index=str.offsetByCodePoints(0,i);
int cp=str.codePointAt(index);
更多详情参见《java核心技术卷一》P48
这里不多介绍
构建字符串
StringBuilder builder=new StringBuilder(); //构键一个空的字符串构键器
builder.append(str); //添加元素到末尾
builder.setCharAt(int i,char c); //将第i个代码单元设置为c
builder.insert(int i,String srt); //在i个位置插入一个字符串
builder.delete(int startInder,int endIndex) //删除偏移量从startIndex到endIndex-1代码单元
String newstr=builder.toString(); //完成构建
6.输入与输出🐜
Scanner类
从控制台读取字符
import java.util.Scanner;
Scanner input=new Scanner(System.in);
String name=input.nextLine(); //读取一行
String firstName=input.next(); //读取一个单词,遇空格停止
int age=input.nextInt(); //读取整数
double socre=input.nextDouble(); //读取浮点数
boolean hasNext(); //检测是否还有其他单词
boolean hasNextInt(); //检测是否还有其他整数
boolean hasNextDouble();
Console类
适合从控制台读取密码
Console cons=System.console();
String username = cons.readLine("User name:"); //提示用户输入信息
char[] paw = cons.readPassword("Password:"); //对数组填充完毕后,应立刻用一个填充值覆盖数组元素
String.format
创建一个格式化的字符串,而不输出打印
String message=String.format("hello,%s. Next year,you'll be %d",name,age);
常规时间输出
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
System.out.println("当前时间为: " + ft.format(dNow));
switch
尽量不要使用,如果case分支没有break,会继续执行下一个case语句,很危险。
switch(choice)
{
case 1:
···
break;
case 2:
···
break;
default:
···
break;
}
中断流程控制
带标签的break语句
read_data: //要加上冒号
while(···){
···
for(){
···
if(){
break read_data; //跳转到带标签的语句块末尾
}
}
···
}
7.大数🪰
导入包
java.math.BigInteger
java.math.BigDecimal
转为大数
BigInteger a=BigInteger.valueOf(100);
BigInteger a=new BigInteger("2361056831275839759832749274")
大数常量
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
BigInteger.TWO
大数运算
- 加:
BigInteger c=a.add(BigInteger.valueOf(b))
- 减:
BigInteger c=a.subtract(b)
- 乘:
BigInteger c=a.multiply(b)
- 除:
BigInteger c=a.divide(b)
- 求余:
BigInteger c=a.mod(b)
- 平方根:
BigInteger c=a.sqrt(b)
- 比较:
int c=a.compareTo(b)
BigDecimal
与BigInteger
类似,在除法运算时有一个指定舍入位数的方法
BigDecimal divide(BigDecimal other,RoundingMode mode)
8.数组🐢
声明匿名数组
new int[] {17,19,23,29,31,37}
smallPrimes=new int[] {17,19,23,29,31,37}
可以创建长度为0的数组,但与null 不同
创建一个数字元素时,所有元素都初始化为0,boolean数组的元素都初始化为false,对象数组初始化为null
打印数组中所有值的简单方法:System.out.println(Arrays.toString(a))
数组拷贝
int[] arr=Arrays.copyOf(arr,arr.length)
第二个参数是新数组的长度:int[] arr=Arrays.copyOf(arr,2*arr.length)
数组排序
int[] a=new int[10000]
Arrays.sort(a)
使用的是快速排序算法
二分查找:Arrays.binarySearch(a,v)
在a中查找值v
将所有数据元素设置为v:Arrays.fill(a,v)
比较两个数组是否相等:Arrays.equals(a,b)
二维数组
快速访问所有元素:
for(double[] row:a)
for(double value:row)
do something with value
快速打印二维数组数据元素列表
System.out.println(Arrays.deepToString(a));
输出格式:[[14,23,5],[56,7,21],[24,88,45]]
不规则数组
int[][] odds=new int[NMAX+1][];
for(int n=0;n<=NMAX;n++)
odds[n]=new int[n+1];
🧱后续待更。。。