服务器端的编程可以参考另一本书《企业Java编程》(Thinking in Enterprise Java)。
1.基本类型
基本型别 | 大小 | 最小值 | 最大值 | 默认值 |
boolean | ----- | ----- | ------ | false |
char | 16-bit | Unicode 0 | Unicode 2^16-1 | \u0000(null) |
byte | 8-bit | -128 | +127 | 0 |
short | 16-bit | -2^15 | +2^15-1 | 0 |
int | 32-bit | -2^31 | +2^31-1 | 0 |
long | 64-bit | -2^63 | +2^63-1 | 0L |
float | 32-bit | IEEE754 | IEEE754 | 0.0f |
double | 64-bit | IEEE754 | IEEE754 | 0.0d |
数值类型的都有正负之分。
boolean类型所占的空间没有明确的制定。
1.java的数值是有符号的,不要忘了还要考虑负数
判断一个数是不是奇数,
if( i % 2 == 1){
...
}
如果i是负数,i%2 的结果将是-1.应该是写成:
if( i%2 ! =0){
...
}
2.如果使用小数,默认的将是double类型,要使用float类型,应该显示的指明小数的类型
float f = 1.24f;
3.小数都可能会有精度的丢失,使用float和double做小数计算时可能都会碰到这样的问题,如果就是需要精确地计算,可以考虑使用BigDicemal,整型对应的是BigInteger。这里要用的是new BigDicemal(String)而不能用new BigDicemal(double),否则在构造BigDicemal之前就已经丢失了精度,这是需要注意的。
System.out.println(2.0f - 1.1f);
System.out.println(2.0d - 1.1d);
2.封装类型
包装类型包括:Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail
其中BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算,BigInteger 支持任意精度的整数,BigDecimal支持任意精度带小数点的运算。
使用BigInteger、BigDecimal不会产生精度丢失的问题,而是用long,float时都需要考虑精度丢失的问题。可能不是很大的数值的计算都会有精度丢失的问题。
为什么有了基本类型还需要包装类型?很多时候方法的参数是一个对象而非基本类型,例如ArrayList的add方法的参数就是对象。
想要查看int型的最大值,可以使用Integer.MAX_VALUE。
3.缓存
缓存是一种典型的空间交换时间的方案,数据库频繁读取时需要考虑缓存,最基本的思路就是Map。
使用缓存需要考虑的问题:
1.数据需要缓存多久
2.缓存数据和真实数据的一致性,当真实数据更新或删除时
3.缓存的并发控制,增删改查在多线程的环境下需要考虑。ConcurrentHashMap和Collections.synchronizedMap(Map)
java.lang包默认会导入到每个Java文件中,所以lang包下的类默认都可以直接使用。
rt.jar包也会自动加载,jre/lib下的jar包也会自动加载。
4.java的修饰符
类的修饰符有:
访问修饰符 |
||
名称 |
说明 |
备注 |
public |
可以被所有类访问(使用) |
public类必须定义在和类名相同的同名文件中 |
package |
可以被同一个包中的类访问(使用) |
默认的访问权限,可以省略此关键字,可以定义在和public类的同一个文件中 |
private |
修饰内部类 |
修饰符 |
||
名称 |
说明 |
备注 |
final |
使用此修饰符的类不能够被继承 |
|
abstract |
如果要使用abstract类,之前必须首先建一个继承abstract类的新类,新类中实现abstract类中的抽象方法。 |
类只要有一个abstract方法,类就必须定义为abstract,但abstract类不一定非要保护abstract方法不可 |
变量的修饰符有:
访问修饰符 |
||
名称 |
说明 |
备注 |
public |
可以被任何类访问 |
|
protected |
可以被同一包中的所有类访问 可以被所有子类访问 |
子类没有在同一包中也可以访问 |
private |
只能够被当前类的方法访问 |
|
缺省 无访问修饰符 |
可以被同一包中的所有类访问 |
如果子类没有在同一个包中,也不能访问 |
修饰符 |
||
名称 |
说明 |
备注 |
static |
静态变量(又称为类变量,其它的称为实例变量) |
可以被类的所有实例共享。 并不需要创建类的实例就可以访问静态变量 |
final |
常量,值只能够分配一次,不能更改 |
注意不要使用const,虽然它和C、C++中的const关键字含义一样 可以同static一起使用,避免对类的每个实例维护一个拷贝 |
transient |
告诉编译器,在类对象序列化的时候,此变量不需要持久保存 |
主要是因为改变量可以通过其它变量来得到,使用它是为了性能的问题 |
volatile |
指出可能有多个线程修改此变量,要求编译器优化以保证对此变量的修改能够被正确的处理 |
方法的修饰符有:
访问修饰符 |
||
名称 |
说明 |
备注 |
public |
可以从所有类访问 |
|
protected |
可以被同一包中的所有类访问 可以被所有子类访问 |
子类没有在同一包中也可以访问 |
private |
只能够被当前类的方法访问 |
|
缺省 无访问修饰符 |
可以被同一包中的所有类访问 |
如果子类没有在同一个包中,也不能访问 |
修饰符 |
||
名称 |
说明 |
备注 |
static |
静态方法(又称为类方法,其它的称为实例方法) |
提供不依赖于类实例的服务 并不需要创建类的实例就可以访问静态方法 |
final |
防止任何子类重载该方法 |
注意不要使用const,虽然它和C、C++中的const关键字含义一样 可以同static一起使用,避免对类的每个实例维护一个拷贝 |
abstract |
抽象方法,类中已声明而没有实现的方法 |
不能将static方法、final方法或者类的构造器方法声明为abstract |
native |
用该修饰符定义的方法在类中没有实现,而大多数情况下该方法的实现是用C、C++编写的。 |
参见Sun的Java Native接口(JNI),JNI提供了运行时加载一个native方法的实现,并将其于一个Java类关联的功能 |
synchronized |
多线程的支持 |
当一个方法被调用时,没有其它线程能够调用该方法,其它的synchronized方法也不能调用该方法,直到该方法返回 |
接口的修饰符:
访问修饰符 |
||
名称 |
说明 |
备注 |
public |
所有 |
|
无访问修饰符(默认) |
同一个包内 |
javadoc只能为public和protected成员进行注释,private和包成员的注释将会被忽略掉。
5.静态导入
静态导入的语法是:
import static 包名.类名.静态成员变量;
import static 包名.类名.静态成员函数;
package com.example.learnjava; public class Common{ public static final int AGE = 10;
public static void output() {
System.out.println("Hello World!");
}
}
使用静态导入:
package com.example.learnjava2; import static com.example.learnjava.Common.AGE;
import static com.example.learnjava.Common.output; public class StaticImportTest{
public static void main(String[] args){
int a = AGE;
System.out.println(a); output();
}
}
程序员经常会忘记运算符的优先级顺序,这时使用括号来明确地定义运算顺序是最保险的。
6. Math的常用函数
整数除法的结果并不是四舍五入,而是直接去掉小数部分,这点需要注意。如果需要保留小数,转换为float或double型。
Math.floor 返回小的整数值 System.out.println(Math.floor(10.7)); //10.0
Math.round 则是4舍5入的计算,入的时候是到大于它的整数
round 返回大的整数值,Math.round(-11.5)的结果为-11。
abs求绝对值, System.out.println(Math.abs(-10.4)); //10.4
max 两个中返回大的值,min和它相反
random 取得一个大于或者等于0.0小于不等于1.0的随机数
也可通过Random类生成随机的数, 下面的代码将生成0到100的随机整数。47是给定了一个生成器的种子,如果不给定,将使用当前时间作为种子。还可以使用nextFloat、nextLong等。
Random rand = new Random(47);
int i = rand,netInt(100);
ceil 则是不小于他的最小整数
7.Java中的移位操作
java中的移位操作只对int和long有效,byte、short、char升级为int后再进行移位,其结果可能就是不准确的。
>>是带符号右移,负数高位补1,正数补0
<<左移不管负数还是正数,在低位永远补0
>>>是不带符号右移,不论负数还是正数,高位补0
没有<<<符号
a = 1;
a = a >> 2;的结果将是4.
8.Java中标签的使用
Java中使用标签的唯一理由就是想要从多重循环中直接跳到某处,和continue和break结合使用
foo:
for(int x=3;x<20;x++){
while(y>7){
y--;
continue;
}
}
该continue只能跳出while这个内层循环
foo:
for(int x=3;x<20;x++){
while(y>7){
y--;
continue foo;
}
}
该continue可以直接跳至foo标签处,可以跳出多重循环。
上面的foo:就是标签,标签可以任意命名,如labeloutter:也是可以的。
使用标签和continue和break结合使用可以完成goto的功能。
while(true)和for(;;)的作用是一样的。
9.switch的使用
在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。在Java7中,呼吁很久的String支持也终于被加上了。
public class Test { public void test(String str) {
switch(str) {
case "abc":
System.out.println("abc");
break;
case "def":
System.out.println("def");
break;
default:
System.out.println("default");
}
} }
在switch语句中,String的比较用的是String.equals,因此大家可以放心的使用。
需要注意的是,传给switch的String变量不能为null,同时switch的case子句中使用的字符串也不能为null。
使用枚举值的情形:
package com.hap.code.utils; public enum TemplateType {
Single,Manager,Tree,TreeManager
}
package com.hap.code; import java.io.Serializable; import com.hap.code.utils.TemplateType; public class CodeFactory {
public void generateCode(TemplateType templateType,Class<Serializable>... cls) {
switch (templateType) {
case Single:
break;
default:
break;
}
}
}
break是可以省略的,若省略break,继续执行下面的case,直至下一个break为止。default后面也可以加一个break,但是没什么实际意义。
《Thinking in Java》学习笔记(一)的更多相关文章
-
0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
-
0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
-
Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
-
0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
-
0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
-
0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
-
0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
-
《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
-
Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
-
0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
随机推荐
-
关于yarn的spark配置属性
spark1.2.0 These are configs that are specific to Spark on YARN Property Name Default Meaning spark ...
-
struts2原理架构图
struts2 原理架构图
-
mysql-笔记-数据类型
https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html serial: SERIAL is an alias for BI ...
-
C# socket实践 - 简易版FTP(Server &; Client)
写了个简易版的ftp(服务器和客户端),运行效果如下图: click download下载中的UI: 原理:模仿正规ftp方式,分成2个socket连接:文本命令socket.数据信道socket. ...
-
swift 学习- 16 -- 构造过程 02
// 类的继承 和 构造过程 // 类里面的所有的存储型属性 -- 包括所有继承自父类的属性 -- 都必须在构造过程中设置初始值 // Swift 为类类型提供了 两种构造器来确保实例中所有的存储属 ...
-
1065 A+B and C
同样是一题会产生溢出的题,不同的是这个用大数类很麻烦,因为有负数的可能性 不妨利用溢出的特性来解题:两个整数和为负数 或者 两个负数和为正数,那么就溢出了. #include<bits/stdc ...
-
基于ASP.NET MVC的ABP框架入门学习教程
为什么使用ABP 我们近几年陆续开发了一些Web应用和桌面应用,需求或简单或复杂,实现或优雅或丑陋.一个基本的事实是:我们只是积累了一些经验或提高了对,NET的熟悉程度. 随着软件开发经验的不断增加, ...
-
WordPress用户登录后重定向到指定页面
这篇文章将向您展示WordPress用户登录后如何重定向到指定页面或者文章的技巧. 一.重定向到网站管理面板. 将以下代码添加到您的当前主题的 functions.php 文件中: function ...
-
mock 的独立使用
public class Air21QueryMileStoneJobTest{ @InjectMocks Air21QueryMileStoneJob air21QueryMileStoneJob ...
-
Python 正则表达式分组
被括号括起来的表达式将作为一个整体,也就是一个分组: In [43]: str = "Jan 26 16:41:27 localhost dhclient[1480]: bound to 1 ...