Java学习Part1:基础知识
数据类型
一共有8种基本类型,4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean型。
- 整型
byte short int long
长整型数值后面有一个L(l),如400000000000L。
java没有无符号类型。
- 浮点型
float double
一般都用double。
float型后面有个F(f),如果浮点数后面不跟字母F,则默认为double型,double型也可以在后面加D(d)。
溢出和出错的三种情况:
正无穷大;
负无穷大;
NaN(不是一个数字);
例如:一个整数除以0的结果为正无穷大,0/0或者负数的平方根的结果为NaN。
- char型
char类型的字面量值要用单引号括起来。char只能表示单个字符。char 数据类型是一
个采用 UTF - 16 编码表示 Unicode 码点的代码单元。
双引号的是String型。
有些特殊字符要用两个代码单元才能表示,以后再说。
\u的字符转义序列可以出现在引号外面。比如public static void main (String\u005B\u005D args),分别代表[ 和 ]。
- boolean型
false 和true。
整型值和布尔型不能相互转换。
- 变量
变量类型+变量名。(初始化)
变量名必须以字母(包括_、$、甚至是表示字母的Unicode字符)开头,由字母和数字组成。另外不能使用保留字。
- 常量
常量用final指定,一般常量名用大写字母。常量被指定后不可修改。
运算符
+、-、*、/表示加减乘除。%求余。
- 数学函数与常量
数学函数在math类中。
sqrt(x) 函数求平方根。
pow(x,a) 函数求幂运算,x的a次幂。
- 数值类型转换
虚线代表会有信息丢失。
强制类型转换:
很轻松的,int就能转换成double,比如int a;double b;b=a-1;此时a-1里的a就是double型。但是如果需要把double转换成 int就需要强制类型转换。
double a=2.333;int b=(int)a;
强制转换是以牺牲精度为代价的(无法避免)。
上面这种强制转换是将小数点后的内容直接去掉。
如果需要四舍五入,就要用到round函数。
- 结合赋值和运算符
比如x+=5;+可以换成-*/%等。
- 自增自减运算符
++;--;
注意区别a++和++a:前缀加号会先运算加法再赋值,后缀加号先赋值再运算加法。
a=10;
b=a++;//a=11但是b=10;
c=++a;//a=11而且b=11;
- 关系和boolean运算符
==、!=、>、>=、<、<=等,可以用逻辑与&&和逻辑或||链接多个判断。
三元操作符: ?:
例子: 条件a ? 结果b : 结果c
若果条件a为true,表达式的结果就是结果1,否则为结果2。
- 位运算符
&与,|或,^异或,~非。<<和>>移位,左移和右移。
- 运算符优先级
- 枚举类型
enum Num{1,2,3,4,5};
Num a=Num.1;
字符串
- 子串
String类的substring方法可以从一个较大的字符串中提取出一个子串。
String greeting=”Hello World!”;
String son =greeting.substring(4,8);//提取o Wo,这个区间也是左闭右开。
- 拼接
使用+无缝拼接。
String str1=”Hello ”;
String str2=”World!”;
String str3=str1+str2;
和py不同。如果有str+int,py会要求你把int转换成str,但是java会自动把int转换为str。
对了,而且py没有单双引号的区别。
如果需要把多个字符串连在一起并用定界符分隔,可以用join方法。
String.join(“拼接符”,字符串1,2,3……)
- 修改字符串
String类是不可修改的。
百度方法可以用StringBuilder和StringBuffer。
- 检测字符串是否相等
用equals方法
str1.equals(str2);//如果str1和str2相等返回true,不等返回false。字符串既可以是字面量也可以是变量。
尽量一定避免用==来判断。
原因:
其实看不太懂。。。
- 空串和NULL串
空串””是长度为0的字符串。有自己的长度(0)和内容(空)。
null可能就类似于不存在?
- 码点和码点单元
这里,看不懂了。
str.length()方法返回的是代码单元的数量,不是码点的数量。一个char值是一个代码单元。
咱也体会不到区别,咱也百度不到。那个特殊字符是复制的教材上的“占用两个代码单元的”符号。
看不懂先把内容贴到这,以后再来体会吧。
- String API
这个就是你需要那个查哪个吧,查阅API文档。
- 构建字符串
StringBuilder。
StringBuilder builder =new StringBuilder();
每次连接时就builder.append();
最后生成String型数据;
String result =builder.toString();
输入输出
这里教材说我太辣鸡了,让我掌握控制台的输入输出就行了,教材让我滚。
好的。
第10-12章我再来。
- 读取输入
标准输入流:System.in
要想同过控制台进行输入,首先要构造一个Scanner对象,并与“标准输入流”System.in关联。
Scanner in =new Scanner(System.in);
String name=in.nextLine();//这个in自己起名字,不过一般用in多好
还得带上这个包;import java.util.Scanner;
这里使用nextLine的原因是输入中可能包含空格,nextline读到换行结束。
next方法以空格为分隔符,想要读取一个单词就用next,因为next读到空格结束。
还有nextint nextdouble等。
没有搞懂next,nextint和nextdouble。
这是说,next方法读取完之后,剩下的输入值还作为下次的输入值?
经过测试,确实是这么回事。next每次只读取一个单词,剩下的还在缓冲区,还可以继续调用方法来读,那剩下的内容没读完之前就不能输入了吗?
网上方法很多,有很多还没学到的知识,这里先总结一个,重新new输入流。
另外在百度时了解到nextInt方法读取缓冲数据时,遇到回车或者空格,数据就会被读走,剩下一个回车或者空格在缓冲区,接下来如果你调用nextLine方法就可能出现意料之外的错误,因为直接读到了回车,就直接跳过去了。
- 格式化输出
System.out.print() 输出目标数据类型所允许的最大非0数字位数打印输出。
System.out.printf(,)
可以使用String.format方法创建一个格式化的字符串而不打印输出。
String str=String.format(“”,)
- 文件输入与输出
需要一个用File对象构造一个Scanner对象。
输出:
Scanner in =new Scanner(Paths.get(“myfile.txt”),”UTF-8”);
System.out.println(in.nextLine())
输入:
Printwriter out =new Printwriter(“myfile.txt”,”utf8”);
out.println(“”);
out.close;
今天学习用的代码:
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Paths;
import java.util.Scanner;
import static java.lang.Math.*;
public class trydouble {
enum Sizee{
Small,Middle,Big,Large
}
public static void main(String[] args) throws IOException {
int a=2;//整型
double b=1.1;//浮点型
double c=a-b;//浮点运算,二进制和十进制的差异,存在误差。
char d='\u005B';//字符型
String e="Ab";//字符串型
final int F=66;//常量
a=a+3;//变量啊,可以‘变’。
/*F=6;
不可行,报错,因为F是常量,不能更改。
*/
int g1=5;
for(int g2=0;g2<10;g2++){//求余
g1--;
//System.out.println(g1+"除以3的余数:"+g1%3);
//System.out.println(floorMod(g1,3));//求余函数
}
double h1=5.555;
int h2=(int)h1;//普通强制转换
int h3=(int)round(h1);//round函数强制类型转换
String greeting ="Hello World!";
String son = greeting.substring(4,8);//提取子串o Wo
String str1="Hello ";
String str2="World!";
String str3=str1+str2;//+拼接字符串
String str4=String.join("@",str1,str2,str3);
System.out.println("浮点运算(2-1.1):"+c);
System.out.println("char字符型:"+d);
System.out.println("字符串型:"+e);
System.out.println("不可更改常量:"+F);
System.out.println("普通强制类型转换(5.555 to int):"+h2);
System.out.println("round函数强制类型转换(5.55 to int):"+h3);
System.out.println("枚举值:"+Sizee.Big);
System.out.println("提取的子串:"+son);
System.out.println("str1和str2拼接:"+str3);
System.out.println("join拼接字符串(@):"+str4);
if(str1.equals(null)){//判断是否为null
System.out.println("NULL");
}
else System.out.println("不为NULL:"+str1);
if(str1.substring(0,3)=="He") System.out.println("He");//测试==和equals方法
else System.out.println("==出问题了");
if(String.join("",str1,str2)=="Hello World!")
System.out.println("== run correctly");
else
System.out.println("==又出问题了");
if(String.join("",str1,str2).equals("Hello World!"))
System.out.println("equals函数正常");
else
System.out.println("equals方法也不正常了");
/*String str5 = "hello⑪";
int n = str5.length();
System.out.println("代码单元长度,即char值个数:"+n);
int cp=str5.codePointCount(0,n);
System.out.println("码点数量:"+cp);
char str6=str5.charAt(5);
System.out.println(str6);*/
StringBuilder builder= new StringBuilder();//使用StringBuilder构建字符串
builder.append(str1);
builder.append(str2);
System.out.println(builder);
String result =builder.toString();
System.out.println(result);//这个builder和result有什么区别呢?
Scanner input=new Scanner(System.in);//标准输入流
String inputs=input.nextLine();
System.out.println("刚刚你输入的现在还给你:"+inputs);
String inputs2=input.next();
System.out.println("别什么垃圾都往我这扔啊,还你:"+inputs2);
/*int inputs3=input.nextInt();
double inputs4=input.nextDouble();
System.out.println("你的int:"+inputs3+"\n你的double:"+inputs4);
*/
String inputs5=input.nextLine();//清空输入缓冲区
Scanner fileout = new Scanner(Paths.get("D:\\001student\\myfile.txt"),"utf8");
String file1=fileout.nextLine();//读文件
String file2=fileout.nextLine();
System.out.println(file1+"\n"+file2);
PrintWriter filein =new PrintWriter("D:\\001student\\myfile2.txt","utf8");
filein.println("Nice to meet U!");//写入
filein.close();
}
}
今天学了一天都没学完一章,不开心。在学下去,学习效率也跟不上了,到此为止。
TO BE CONTINUE...