一.学习java前需要了解的
初步认识
在第一周的学习中,我初步对JavaSE有了一些了解,首先是其发展历史,java的前身是Oak语言(翻译为橡树),是由1990年Sun公司的James Gosling领导设计而成,初期是为了实现智能设备,但并未发展成果,但这门语言留了下来,并经过改造,成为了现在的java语言,1995年,java正式由SUN公司发布,推出了java1.0以及开发工具包JDK1.0。值得一提的是,java名字起源于印度的爪哇岛(英语翻译就是java),java的官网图标是冒热气的咖啡。
java分类
java有几个分类
- JavaME java微型版 如今基本已经淘汰
- JavaSE java标准版 基础核心
- JavaEE java企业版 开发WEB项目(流行的重要原因)
其中JavaSE,是java的核心和基础,也是JavaME和JavaEE的核心,可以用于开发桌面端程序,如IDEA。
Java流行的原因
一个东西的流行肯定是因为其具有某些优质的特性,以下是来自百度百科的java语言介绍,点击此处查看更多。
Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性(跨平台)、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 。
在第一周里,有了解到java具有一处编译,处处执行的特点,这基于java的一个核心“JVM(Java Virtual Machine——java虚拟机)”。说到这个补充一下:java运行过程:首先编程人员会编写java代码,并将java代码保存到一个".java"源文件里,将源文件经过编译后,会生成".class"的字节码文件,然后由JVM解释字节码文件。如下图1:
二.技术总结
经过第一周的学习,收纳了以下自认为比较重要的方法、知识点等。
1.数据类型
原始类型
- 整型 byte short int long
- 浮点型 float double
- 字符型 char 注意ASCII字符代表码
引用类型
- 类
- 接口
- 数组
注意:数据类型这个知识点着重需要注意的是各数据占用内存的大小、定义数据类型(注意float、 long),以及数据类型之间的转换。例如:
隐式类型转换(自动类型转换)
占用字节小的数据类型的变量,可以直接保存到占用字节大的数据类型的变量中
short s = 123
int i = s;
//s是short类型,占2个字节,i是int类型,占4个字节
显式类型转换(强制类型转换)
占用字节大的数据类型的变量,默认无法保存到占用字节小的数据类型的变量中,如果要强制保存,需要经过类型转换。
语法:(目标类型)待转化的变量
int num = 123
// byte b = num;//直接无法赋值
byte b = (byte)num;//强制转换为byte类型
//如果待转换的变量中的数据能正常保存到转换的目标变量中,结果无误。
//如果超出目标变量的范围,会造成数据溢出
byte n = (byte)128;//byte最大值为127,强制将128赋值给byte时,真正保存的是byte的最小值-128
2.运算符
重点:
逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
&& | and与 | 符号两端需要两个表达式,判断如果都为true,整体结果为true,如果有一端结果为false,则整体结果为false。 |
|| | or或 | 符号两端需要两个表达式,判断如果都为false,整体结果为false,如果有一端结果为true,整体结果为true。 |
! | not非 | 是一个单目运算符(只有一个表达式),“!表达式”:表示对原表达式的结果取相反值。 |
位运算符
符号 | 作用 |
---|---|
& | 按位与:计算的结果与&&相同,但过程不同。符号两端的表达式都会执行判断。 |
| | 按位或:计算的结果与||相同,但过程不同。符号两端的表达式都会执行判断。 |
^ | 按位异或:将操作数转换为二进制后,按位比较,如果相同结果为0,不同结果为1,最终二进制结果转换为十进制。 |
>> | 按位右移:将第一个操作数转换为二进制后,向右移动第二个操作数对应的位数,再将结果转换为十进制 |
<< | 按位左移:将第一个操作数转换为二进制后,在后边补充第二个操作数对应数量的0,再将结果转换为十进制。 |
示例代码:
System.out.println(2^3);
//^按位异或符号
//2 010
//3 011
// 异或就是两个一样就用0表示,不一样就是1
//1 001
//6 110 向右移动一位 //011-->3
System.out.println(6>>1);//3
//将第一个操作数转换为二进制后,在后边补充第二个操作数对应数量的0,再将结果转换为十进制。
//5 101 //1010-->20
System.out.println(5<<1);//10
条件运算符
三目运算符,有三个操作数参与,是一个简化版的双分支条件语句。
表达式1?表达式2:表达式3
首先运算表达式1,如果结果为true,执行问号后的表达式2;如果结果为false,执行问号后的表达式3;整个表达式的最终结果为表达式2或表达式3.
Scanner sc = new Scanner(System.in);
System.out.print("请输入年份");
int year = sc.nextInt();
String res = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? "是闰年" : "不是闰年";
System.out.println(year + res);
顺序解读2 :
注意:
- 运算后,最终数据类型为运算语句中所占字符最大的数据类型。
- &&和||也称为短路运算符。如果能通过第一个表达式确定最终的结果,则不用判断第二个表达式。
- 通常情况下,使用&&和||提高代码执行效率
- 运算符优先级:小括号>>单目运算符(!、++、–)>>算术运算符>>关系运算符>>逻辑运算符>>条件运算符>>赋值/复合赋值运算符
3.条件语句
if 语句
- 单分支if语句
如果一件事满足则执行,不满足什么都不执行。
if (判断条件){ //判断条件结果为布尔值
条件满足时执行的代码
}
- 双分支if语句
if (判断条件){
条件满足时执行的代码
}else{
条件不满足时另外执行的代码
}
- 多分支if语句
if (判断条件1){
条件1满足时执行
}else if(判断条件2){
条件2满足时执行
}else if(判断条件3){
条件3满足时执行
}else{
如果所有条件都不满足时执行
}
多分支if语句判断流程图一个具有注脚的文本 3。
switch语句
开关语句,如果一个变量的值能够例举出来时,使用switch语句更为简洁。
switch(变量){//要判断的变量,只能是非long整型、字符型char和字符串String和枚举类型
case 值:
//如果变量的值与当前case的值匹配,执行这里的代码
break;
case 值:
//如果变量的值与当前case的值匹配,执行这里的代码
break;
...
default:
//如果没有任何值与变量的值匹配,执行这里的代码
break;
}
使用注意事项
-
switch小括号中的变量只能是非long的整型、字符型char、字符串String和枚举类型
-
小括号中的变量类型要与case后的值的类型相匹配
-
如果有某个case后的内容和变量值匹配,执行case后的代码,如果没有任何case匹配,执行default后的代码
-
break和default可以省略。如果不写break,在某个case匹配时,执行玩相应的代码后继续执行后续case后的代码,直到遇到break或没有代码为止
-
如果多个case后执行的内容一致,可以省略break,将统一要做的代码放在最后的case后
补充: switch和if语句都还能和return关键字搭配哦,用于不再执行后续的代码,特别提醒,switch使用return后就会停下main主函数了,所以一般switch不会搭配return。
4.循环(用于需要重复执行的代码)
- while 循环
/*
while(循环条件){
满足循环条件时重复执行的代码
}*/
//简单例子
int i = 0;
while (i<3){
System.out.println("这是第"+(i+1)+"行文字");
i++;
}
- do-while 循环
do{
满足循环条件时重复执行的代码
}while(循环条件);
do-while循环至少执行一次
- for 循环
//表达式1为定义循环变量
//表达式2为判断循环条件
//表达式3为更新循环变量
/*for(表达式1;表达式2;表达式3){
循环体
}*/
//打印1-10
for (int i=1;i<=10;i++){
System.out.println(i);
}
执行流程
首先执行表达式1,再执行表达式2,如果表达式2的结果为true,执行循环体,再执行表达式3,再执行表达式2判断,如果表达式2的结果为false,结束循环。这里的表达式2,循环体,表达式3是一个循环,直到表达式2为false才结束循环。
增强for循环
用于遍历数组或集合元素的循环,例如:
/*
for (数据类型 变量名:数组名){}
*/
String[] nameList = {"张三","李四","王五","赵六"}
for (String name : nameList){
System.out.print(name+"\t")
}
5.循环控制
break和return
- 所有的循环都可以使用break退出整个循环
- break是停止循环后,继续执行循环之外的内容
- return是结束方法,不再执行return之后的内容。
public class BreakAndContinue {
public static void main(String[] args) {
int i = 1;
while (true){
System.out.println("xxxxx");
if (i++ == 10){
break;//退出整个循环,程序继续执行循环之外的内容
//return;//退出整个main方法,程序不再执行之后的代码
}
}
System.out.println("结束");//如果循环中有return,不会执行这句话
}
}
continue
在循环语句中,可以使用continue,停止本次循环,不再执行continue之后的代码,直接进行下次循环。
int i = 1;
while (i<10){
if (i++ % 2 == 0){
//例如i=1,则1%2==0条件不满足,所以打印i(1+1)
continue;//如果遇到continue,结束本次循环(不再执行continue之后的代码),直接进入下一次循环
}
System.out.println(i);
}
6.循环总结
- 如果已知循环次数,建议用for循环。如遍历数组、集合等。
- 如果未知循环次数,推荐使用while循环。
- while循环和for循环可以互相转换。
- while循环可能一次都不执行,do-while循环至少循环一次。
- 循环可以进行嵌套,循环里有循环,但尽量不要嵌套太多循环,占用资源很多。
关于循环的例题有很多,例如:
龟兔同笼问题
//鸡兔同笼 笼子里有若干鸡和兔,头一共35,腿一共94,鸡兔各几只?
for (int ji=0;ji<=35;ji++){
for (int tu=0;tu<=35;tu++){
if (ji+tu==35&&2*ji+4*tu==94){
System.out.println("鸡"+ji+"只,兔子"+tu+"只");
}
}
}
打印九九乘法表
for (int i=1;i<10;i++){
for (int j=1;j<=i;j++){
System.out.print(i+"*"+j+"="+i*j+"\t");
}
System.out.println();
}
打印菱形
以下代码将菱形分成上下两个三角形打印的
for (int i=1;i<=6;i++){
for (int x=6;x>=i;x--) {
System.out.print(" ");
}
for (int x=6;x<=i+5;x++){
System.out.print(" *");
}
System.out.println();
}
for (int i=1;i<=6;i++){
for (int x=6;x<=i+5;x++){
System.out.print(" ");
}
for (int x=6;x>=i;x--) {
System.out.print(" *");
}
System.out.println();
}
7.数组
有关这部分,只要知道怎么定义、赋值数组,数组初始化、读取数组元素(for循环/增强for循环)就OK了。
另外这里附上一个Arrays这个工具类的方法列表(静态的,直接调用)
常用方法 | 作业 |
---|---|
sort(数组) | 将输入中的元素升序排序 |
sort(数组,起始位置,结束位置) | 对数组中[起始位置,结束位置)区间的元素升序排序 |
fill(数组,值) | 使用指定值对数组中的所有元素进行填充 |
fill(数组,起始位置,结束位置,值) | 使用指定值对数组中[起始位置,结束位置)区间的元素进行填充。 |
copyOf(数组,新数组长度) | 复制数组并指定复制后的数组的长度。得到复制后的新数组。 |
asList(一组数据) | 将一组数据转换为list集合 |
equals(数组1,数组2) | 判断两个数是否相同,得到判断的布尔值,只有两个数组一模一样时得到true。 |