Java基础
文本型char:
Java字符采用Unicode编码,每个字符占两个字节,因而char可以用十六进制编码形式表示,例:
char c = '\u0061';
-
char字符类型事实上是一个16位无符号整数,这个值是对应字符的编码。
-
Unicode是全球语言统一编码,Java字符类型采用Unicode字符编码。Unicode是世界通用的定长字符集,所有的字符都是16位。
Unicode编码格式(0~65535)
-
‘a’ = 97
-
‘A’ = 65
-
‘0’ = 48
char c1 = 97; System.out.println(c1); // a
-
-
字符直接量可以采用诸如:‘中’的形式,也可以采用16进制的表示形式,例如:’\u4e2d’。
-
char字符是表现形式,实质上是int码,有且仅有一个。
对于不方便输出的字符采用转义符表示:
字符 | 含义 |
---|---|
‘\n’ | 回车 |
‘\r’ | 换行 |
‘\\’ | \ |
‘’’ | ’ |
‘"’ | " |
‘\t’ | 水平制表符 |
char c = '\\';
System.out.println(c); // \
System.out.println('2' + '2'); // 100
类型 | 占用存储空间(字节) | 表数范围(28x-1) |
---|---|---|
byte | 1 | -128~127 |
short | 2 | -3276832767(-215215-1) |
int | 4 | -21474836482147483647,共10位(-231231-1) |
long | 8 | -92233720368547758089223372036854775807,共19位(-263263-1) |
float | 4 | -3.403E38~3.403E38 |
double | 8 | -1.798E308~1.798E308 |
整数型:
Java语言整数型常量的三种表示形式:
- 十进制:12,-314,0。
- 八进制(要求以0开头):012。
- 十六进制(要求以0x或0X开头):0x12。
- 整数直接量可以直接赋值给byte,short,char,但不能超出范围。
- byte,short,char型变量参与运算时,先一律转换为int再运算。
byte b1 = 5;
byte b2 = 6;
byte b3 = b1 + b2; // 编译错误,直接量可以直接赋值,但变量不可以
浮点型:
在数学中0到1之间有无数个浮点数,而计算机是离散的,所以表示的时候有误差,计算机用精度(小数点后几位来表示),比较浮点数时a0.1是不合适的,应该a-0.10;如果a是0.1,则即使有误差a-0.1==0,因为a和0.1都被表示为一个有误差的计算机二进制。
Java语言浮点类型常量有两种表示形式:
- 十进制:3.14,314.0,.314
- 科学计数法:3.14e2,3.14E2,100E-2
浮点型常量默认为double
doble运算时会出现舍入误差:
二进制系统中无法精确的表示1/10,就好像十进制系统中无法精确的表示1/3一样,所以二进制表示十进制时会有一些舍入误差。对于一些要求精确运算的场合会导致代码缺陷。
自动类型转换:
整型,字符型数据可以混合运算,运算中,不同类型的数据先转化为同一类型,然后进行运算,转化从低级到高级。
double persent1 = 80/100; // 0.0
右边都是int类型数据运算结果也为int类型,结果为0,在赋值给double类型,将0转换为0.0。
double persent2 = 80.0/100; // 0.8
右边表达式有double型直接量参与运算结果为double型。
byte->short,char->int->long->float->double
数据类型转换必须满足如下规则:
-
不能对Boolean类型进行转换。
-
不能把对象类型转换成不相关类的对象。
-
在把容器大的类型转换为容量小的类型时必须使用强制类型转换。
-
转换过程中可能导致溢出或者损失精度,例如:
int i = 128; byte b = (byte) i;
因为byte类型时8位,最大值为127,所以强制转换为int类型值128时就会导致溢出。
-
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
(int) 23.7 = 23; (int) -45.89f = -45;
short a = 5;
a += 10; // 赋值运算符,自动强制转换
a = a + 10; // 编译错误,需要强制转换符。(short) (a + 10)
逻辑运算符:
^(异或):当两个操作数不同时返回true时返回true,否则返回false。
System.out.println(4 >= 5 ^ 'c' > 'a'); // true
数组:
int[] a = new int[4]; // 4表示数组a的个数,int数组默认值为0。
char[] b = new char[4]; // char默认值为数字0。
boolean[] c = new boolean[4]; // boolean默认值为false。
初始化:
int[] arr1 = new int[3]; // 0,0,0
int[] arr2 = { 1, 4, 7 }; // 1,4,7
int[] arr3 = new int[] { 1, 4, 7 }; // 1,4,7
int[] arr4;
arr4 = { 1, 4, 7 }; // 编译错误,此方法只能声明的同时初始化
arr4 = new int[] { 1, 4, 7 }; //ok
数组的复制:
int[] a = { 10, 20, 30, 40, 50 };
int[] b = new int[6];
System.arraycopy(a, 1, b, 0, 4); // b = { 20, 30, 40, 50, 0, 0 }
System.arraycopy复制效率高,可操作性强,但不可用于扩容
int[] a = { 10, 20, 30, 40, 50 };
/*
* 声明整形数组b,将a数组的数据复制到b,并设置b为6个长度,最后空缺位补0。
* 当新数组小于源数组时,则进行截取;大于时,则用0或null进行填充(此案例并非扩容)
*/
int[] b = Arrays.copyOf(a, 6);
数组的扩容:
int[] a = { 10, 20, 30, 40, 50 };
a = Arrays.copyOf(a, a.lenght + 1); // 扩容后的a为新数组,与源数组无关。
JDK各版本特性
JDK5
- 自动装箱与拆箱
- 枚举
- 静态导入
- 可变参数(Varargs)
- 内省(Introspector)
- 泛型(Generic)
- For-Each循环
JDK6
- Desktop类和SystemTray类
- 使用JAXB2来实现对象与xml的映射
- STAX
- 使用Compiler API
- 轻量级Http Server API
- 插入式注解处理API(PluggableAnnotation Processing API)
- 提供Console开发控制台程序
- 对脚本语言的支持,如y,groovy,javascript
- Common Annotations
- Java GUI界面的显示
- 嵌入式数据库Derby
- Web服务元数据
- Table的排序和过滤
- 更简单更强大的JAX-WS
JDK7
-
switch中可以使用字符串了
-
泛型实例化类型自动推断
-
自定义自动关闭类
-
新增一些取环境信息的工具方法
- 新增一些取环境信息的工具方法,File System.getJavaIoTempDir()//IO临时文件夹
- 新增一些取环境信息的工具方法,File System.getJavaHomeDir()//JRE的安装目录
-
Boolean类型反转,空指针安全参与位运算
-
两个char间的qeuals
-
安全的加减乘除
-
对Java集合(Collections)的增强支持
-
数值可加下划线
int one_milion = 1_000_000;
-
支持二进制文字
int binary = 0b1001_1001;
-
在trycatch异常捕捉中,一个catch可以以写多个异常类型,用”|“隔开
-
jdk7之后,你可以不必要写finally语句来关闭资源,只要你在try{}的括号内部定义要使用的资源。
JDK8
- 接口的默认方法
- Java8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法
- Lamba表达式
- 函数式接口
- 方法与构造函数引用
- Java8扩展了集合类
- Data API
- Timezones 时区
- LocalTime 本地时间
- LocalDate 本地日期
- LocalDateTime 本地日期时间
- Annotation 多重注解
- Streams
- Parallel Stream
- Map
JDK9
- Jigsaw项目;模块化源码
- 简化进程API
- 轻量级JSON API
- 钱和货币的API
- 进程改善和锁机制的优化
- 代码分段缓存
- 智能Java编译,第二阶段
- HTTP2.0客户端
- Kulla计划:Java的REPL实现
Java的通信编程,编程题;用Java Socket编程,读取服务器几个字符,再写入本地显示?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Server端程序
* @author 759826115
*
*/
public class Server {
private ServerSocket serverSocket;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server() {
try {
serverSocket = new ServerSocket(12031);
System.out.println(12);
while (true) {
socket = serverSocket.accept();
String remoteIP = socket.getInetAddress().getHostAddress();
String remotePort = ":" + socket.getLocalPort();
System.out.println("A client come in! IP:" + remoteIP +remotePort);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = in.readLine();
System.out.println("Client send is:" + line);
out = new PrintWriter(socket.getOutputStream(), true);
out.println("Your Message Received!");
out.close();
in.close();
socket.close();
}
} catch (IOException e) {
out.println("Wrong");
}
}
public static void main(String[] args) {
new Server();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* Client端程序
* @author 759826115
*
*/
public class Client {
Socket socket;
BufferedReader in;
PrintWriter out;
public Client() {
System.out.println("Try to Connect to 127.0.0.1:10000");
try {
socket = new Socket("127.0.0.1", 12031);
System.out.println("The Server Connected!");
System.out.println("Please enter some Character:");
BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream(), true);
out.println(line.readLine());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
} catch (IOException e) {
out.println("Wrong");
}
}
public static void main(String[] args) {
new Client();
}
}