java基础知识

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)
byte1-128~127
short2-3276832767(-215215-1)
int4-21474836482147483647,共10位(-231231-1)
long8-92233720368547758089223372036854775807,共19位(-263263-1)
float4-3.403E38~3.403E38
double8-1.798E308~1.798E308
整数型:

Java语言整数型常量的三种表示形式:

  • 十进制:12,-314,0。
  • 八进制(要求以0开头):012。
  • 十六进制(要求以0x或0X开头):0x12。
  1. 整数直接量可以直接赋值给byte,short,char,但不能超出范围。
  2. 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

数据类型转换必须满足如下规则:

  1. 不能对Boolean类型进行转换。

  2. 不能把对象类型转换成不相关类的对象。

  3. 在把容器大的类型转换为容量小的类型时必须使用强制类型转换。

  4. 转换过程中可能导致溢出或者损失精度,例如:

    int i = 128;
    byte b = (byte) i;
    

    因为byte类型时8位,最大值为127,所以强制转换为int类型值128时就会导致溢出。

  5. 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:

    (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

  1. 自动装箱与拆箱
  2. 枚举
  3. 静态导入
  4. 可变参数(Varargs)
  5. 内省(Introspector)
  6. 泛型(Generic)
  7. For-Each循环

JDK6

  1. Desktop类和SystemTray类
  2. 使用JAXB2来实现对象与xml的映射
  3. STAX
  4. 使用Compiler API
  5. 轻量级Http Server API
  6. 插入式注解处理API(PluggableAnnotation Processing API)
  7. 提供Console开发控制台程序
  8. 对脚本语言的支持,如y,groovy,javascript
  9. Common Annotations
  10. Java GUI界面的显示
  11. 嵌入式数据库Derby
  12. Web服务元数据
  13. Table的排序和过滤
  14. 更简单更强大的JAX-WS

JDK7

  1. switch中可以使用字符串了

  2. 泛型实例化类型自动推断

  3. 自定义自动关闭类

  4. 新增一些取环境信息的工具方法

    • 新增一些取环境信息的工具方法,File System.getJavaIoTempDir()//IO临时文件夹
    • 新增一些取环境信息的工具方法,File System.getJavaHomeDir()//JRE的安装目录
  5. Boolean类型反转,空指针安全参与位运算

  6. 两个char间的qeuals

  7. 安全的加减乘除

  8. 对Java集合(Collections)的增强支持

  9. 数值可加下划线

    int one_milion = 1_000_000;
    
  10. 支持二进制文字

    int binary = 0b1001_1001;
    
  11. 在trycatch异常捕捉中,一个catch可以以写多个异常类型,用”|“隔开

  12. jdk7之后,你可以不必要写finally语句来关闭资源,只要你在try{}的括号内部定义要使用的资源。

JDK8

  1. 接口的默认方法
    • Java8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法
  2. Lamba表达式
  3. 函数式接口
  4. 方法与构造函数引用
  5. Java8扩展了集合类
  6. Data API
    • Timezones 时区
    • LocalTime 本地时间
    • LocalDate 本地日期
    • LocalDateTime 本地日期时间
  7. Annotation 多重注解
  8. Streams
  9. Parallel Stream
  10. Map

JDK9

  1. Jigsaw项目;模块化源码
  2. 简化进程API
  3. 轻量级JSON API
  4. 钱和货币的API
  5. 进程改善和锁机制的优化
  6. 代码分段缓存
  7. 智能Java编译,第二阶段
  8. HTTP2.0客户端
  9. 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();
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值