java拾遗录1
想做java程序员,就免不了javaSE javaEE javaME这些东西,当然什么数据库,数据结构,设计模式,javascript什么的也少不了,不过最基本的便是javaSE,先回到学习core java的那天看看。
主题:core java1——java运算符与控制流程
一、java运算符
几乎所有运算符都只能操作“主类型”(Primitives)。例外是“=”、“= =”和“! =”,它们能操作所有对象。除此以外,String类支持“+”和“+=”。
(1)赋值
主类型使用“A=B”,那么B处的内容就复制到A。若修改A,那么B根本不会受修改的影响。
对象“赋值”的时候情况发生了变化。对一个对象进行操作时,我们真正操作的是它的句柄。所以倘若“从一个对象到另一个对象”赋值,实际就是将句柄从一个地方复制到另一个地方。这意味着假若为对象使用“C=D”,那么C和D最终都会指向最初只有D才指向的那个对象。
short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)
short s1 = 1; s1 += 1;(可以正确编译) +=运算符无类型转换问题
(2)算术运算符
Java的算术运算符:加号(+)、减号(-)、除号(/)、乘号(*)以及模数(%,从整数除法中获得余数)。整数除法会直接砍掉小数,而不是进位。
(3)自动递增、递减
对于前递增和前递减(如++A或--A),会先执行运算,再生成值。
对于后递增和后递减(如A++或A--),会先生成值,再执行运算。
(4)关系运算符
关系运算符包括<、>、<=、>=、= =、!=
等于和不等于适用于所有内建的数据类型,但其他比较不适用于boolean类型。
想对比两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法equals()。
equals()方法不适用于“主类型”,那些类型直接使用= =和!=即可。
equals()的默认是比较句柄。所以除非在自己的新类中改变了equals(),否则不可能表现出我们希望的行为
大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄
= =和! =比较的是对象句柄,而不是对象的实际内容
(5)逻辑运算符
逻辑运算符&&、||、!能生成一个布尔值
&和&&都可作为逻辑运算符“与”使用,但是&&是“短路与”,运算时先判断符号前面的表达式的值,如果能够确定整个表达式的值,则不进行符号后面的表达式的运算。
另外,&可作为位运算符使用
(6)按位运算符
按位AND运算符(&)
按位OR运算符(|)
按位XOR(^,异或)
按位NOT(~,也叫作“非”运算符)属于一元运算符,生成与输入位的相反的值
(7)移位运算符
左移位运算符(<<)能将运算对象向左移动运算符右侧指定的位数(在低位补0)。
有符号右移位运算符(>>)将运算对象向右移动运算符右侧指定的位数。有符号右移位运算符使用了符号扩展:若值为正,则在高位插入0;若值为负,则在高位插入1
无符号右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0
(8)三元IF-ELSE运算符
布尔表达式 ? 值0:值1 “布尔表达式”的结果为true,就计算“值0”,否则计算“值1”
(9)字符串运算符+
int x = 0, y = 1, z = 2;
System.out.println(“out:” + x + y + z);
在这里,Java编译程序会将x,y和z转换成它们的字串形式,而不是先把它们加到一起。
运用“String +”时,若表达式以一个String起头,那么后续所有运算对象都会转换到字串。想通过“加号”连接字串(使用Java的早期版本),请务必保证第一个元素是字串
(10)造型(Cast)运算符
对于“缩小转换”(Narrowing Conversion)的操作(能容纳更多信息的数据类型,将其转换成容量较小的类型,例如int转short),此时就可能面临信息丢失的危险。此时,编译器会强迫我们进行明确造型
对于“放大转换”(Widening conversion),则不必进行明确造型,因为新类型肯定能容纳原来类型的信息,不会造成任何信息的丢失
布尔值(bollean)根本不允许进行任何造型处理,其它任何主类型可互相造型
将float或double值造型成整数值后,总是将小数部分“砍掉”,不作任何进位处理
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12 Math.round(-11.5)==-11
round方法返回与参数最接近的长整数,参数加1/2后求其floor.
public class TestIfElse {
public static void main(String[] args) {
double f = 0;
final int times = 100;
double min = 1000;
double max = 0;
//取100次平均。其实可以再多,但是耗时太长了,意义并不是很大。
for(int i=0; i<times; i++){
double df = test();
System.out.println("df["+i+"] = "+df);
f +=df;
if(min>df){
min = df;
}
if(max<df){
max = df;
}
}
f /=times;
System.out.println("------->min = "+min);
System.out.println("------->max = "+max);
System.out.println("------->ave = "+f);
}
private static double test(){
//来点计算,用处不大。
long sum = -1;
//循环次数,有点大哦,自己悠着点调
final int max = 100000000;
//下面给出一个包含循环和计算的耗时统计,作为一个基础。后面的统计必然包含此部分时间
long timeS = System.currentTimeMillis();
for(int i=0; i<max; i++){
sum = i+i;
}
long timeE = System.currentTimeMillis();
long delta = timeE - timeS;
//计算出一个布尔值,免得后面还要计算而占用时间,造成误差。
boolean flag = sum>0;
//下面是If/Else(包含循环和计算)的耗时统计,真实耗时应当除去上面的基准值
long timeS1 = System.currentTimeMillis();
for(int i=0; i<max; i++){
if(flag){
sum = i+i;
}else{
sum = i+i;
}
}
long timeE1 = System.currentTimeMillis();
long delta1 = timeE1 - timeS1;
//这是真实的耗时计算
long realIfElse = delta1-delta;
//下面是三目运算符(包含循环和计算)的耗时统计,真实耗时同样应当除去前面的基准值
long timeS2 = System.currentTimeMillis();
for(int i=0; i<max; i++){
sum = flag?i+i:i+i;
}
long timeE2 = System.currentTimeMillis();
long delta2 = timeE2 - timeS2;
//这是真实的耗时计算
long realTri = delta2-delta;
//返回耗时比率,以反映效率差别
double f = (double)realIfElse / realTri;
return f;
}
}
------->min = 1.9841269841269842
------->max = 3.5161290322580645
------->ave = 2.6170264636067144
statement
}
expression必须是数组或可以实现java.lang.Iterable接口的对象.这个类型必须在编译时就已经被确定,编译器可以产生合适的循环程序代码.
数组类型或Iterable元素必须要和declaration中声明的变量类型兼容.如果你使用了一个Iterable对象,且它的元素类型没有被参数化时,则该变量就必须被声明为Object.declaration通常由一个类型和一个变量组成,但它也可以加入一个final修饰符及一些适当的注释.使用final可以避免循环变量使用由循环所赋予的数组或集合元素之外的其他值.并帮助强调循环变量中的数组或集合不可被更改.foreach循环的循环变量的类型与变量的名称必须被声明为循环的一部分,同时不能像for循环一样将变量的声明放在循环的外面.
2 不要人云亦云的骂“goto”
自从《goto有害》开始,不断的有人大骂goto,其实goto和世上的任何一件事都一样,有好有坏,只要掌握好“度”就没什么问题,但是初学者很难掌握,所以java中将goto设为保留字,她推出了带标签的break,continue。
Java 中的标签是为循环设计的,是为了在多重循环中方便的使用 break 和 coutinue 而设计的。正是由于这个原因,Java 的标签只能定义在三种循环 (for() {}, do{} while(), while() {}) 的开始位置,否则编译器会报告说找不到标签。
在循环前面加上标签,就好像给循环起了个名字。而后在循环中使用 break 或者 continue 语句的时候,就可以带上这个标签做为参数,指明跳出 (break) 或者继续 (continue) 哪一个循环,如“break mylabel;”、“continue mylabel;”
而break和continue的区别在于,break是跳到标签处所在的循环外,即次循环结束了,而continue则是跳到标签所在的循环,并再次进入执行。下面是两个最简单的例子:
public class BreakLabel { public static void main(String[] args) { boolean isTrue = true; outer: for(int i=0; i<5; i++){ for(int j=0; j<30000; j++){ System.out.println("hello"); break outer; //如果没有标签,那么outer loop这句语名将被输出。正因为有标签,直接跳出两层循环 } System.out.println("outer loop"); } System.out.println("Good-bye"); } }
还有continue:
public class ContinueLabel { public static void main(String[] args) { outer: for(int i=0; i<5; i++){ System.out.println("begin outer loop"); //而因为continue直接退到外层这句话被反复执行到 for(int j =0; j<3; j++){ System.out.println("Hello"); continue outer; } System.out.println("end outer loop~~~~~~~~~~~~``"); //因为标签这句话,不会执行到。 } System.out.println("goodbye"); } }
3 switch中的break
switch语句中的每个case字句,可以加break也可以不加,加了break的case字句代表一个选项只执行我这个case里的代码,大多数情况下我们加break,但有的时候,我们想要让她按照一定的等级执行,即3级执行123,4级执行1234.这时候我们可以选择不加break
eg:
int x = 3; switch (x) { case 4: System.out.println("执行4"); case 3: System.out.println("执行3"); case 2: System.out.println("执行2"); case 1: System.out.println("执行1"); default: break; }
相关推荐
NULL 博文链接:https://langyu.iteye.com/blog/1167581
Java知识拾遗:三大框架的技术起源 本篇文章主要讲述了Java开发中三大框架的技术起源,即Struts、Hibernate和Spring框架。这些框架是我们Java开发中的常用的框架,它们分别针对不同的应用场景给出最合适的解决方案...
java回顾、知识整理、拾遗、面试_java-review
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
11.java基础拾遗--匿名内部类语法详解.mp4
读书笔记:算法 并发 函数式编程 java语言拾遗 手写设计模式
09.java基础拾遗--类的加载和对象的构造过程.mp4
10.java基础拾遗--匿名内部类的应用--实现scala中的集合map方法.mp4
Java开发中的三大框架——Struts、Hibernate和Spring,都是为了解决传统Java Web应用程序中存在的一系列问题而诞生的。这些框架分别针对MVC模式的实现、数据持久化和依赖管理给出了高效且灵活的解决方案。 Struts...
Java开发中的三大框架,即Struts、Hibernate和Spring,各自解决了传统Java Web应用程序中的不同问题,提升了开发效率和代码质量。下面将详细讲解这三个框架的技术起源及其核心功能。 首先,Struts框架诞生于解决JSP...
Java语言拾遗 │ │ └─util 工具类 │ └─mq 消息队列 │ └─kafka └─resources 消息队列源码会作专题研究 关于消息队列使用参考另一个库:https://github.com/GitJavaProgramming/springboot_mybatis 参考...
**拾遗补缺** 除了上述主题,还要关注其他Java编程中的细节,如枚举、类型转换、异常层次结构、字符串操作、日期时间处理等。熟悉标准库中的各种类和方法,提高编码效率。 **视窗程式** 尽管Java主要用于服务器端...
17. 拾遗物品登记表.pdf
在本章拾遗中,我们将探讨C语言中的一些高级特性,包括结构体成员函数、C语言中的布尔类型、预编译指令与条件编译以及位运算与位段结构。这些内容是C语言深入学习的重要部分。 首先,让我们关注结构体成员函数。在...
拾遗物品的管理制度是社会文明进步的标志之一,它体现了人们对于财物归属权的尊重以及对公共道德的维护。在中国传统文化中,拾金不昧被视为高尚的品德,而在现代社会,完善的拾遗物品管理制度则是社会主义精神文明...
在"day03 拾遗"中,特别提到了小数的取模运算。需要注意的是,Java中的小数取模与整数有所不同,可能会导致非预期的结果。例如,12.12%2.2的结果是1.1199,而8.8%2的结果是0。这是因为浮点数的取模运算并不总是精确...
### 有感于《路边拾遗》:摄影与心灵之旅 #### 一、摄影的意义与价值 《路边拾遗》是一本由两位非职业摄影师创作的摄影画册,书中不仅收录了他们拍摄的精美照片,更重要的是传达了作者对摄影艺术的理解与感悟。...
【图论拾遗(一)题解1】这篇文章主要探讨了如何解决图论中的特定问题,包括求解无向图中最远两点之间的距离以及寻找有向图中的最短路径。文章通过三个具体的POJ在线判题平台上的题目来阐述相关算法。 首先,POJ...