学习Java的一些笔记
注意事项
- Java对大小写很敏感
- 类名必须以字母开头,后面可以跟字母和数字,也可以用_和$ 两种符号。不能使用Java保留字。(标准类名:以大写字母开头,如果类名由多个单词组成,每个单词首字母应该要大写
- 源代码文件名必须与公共类的名字相同
- 为了代码能够执行,必须包含一个main方法
Java中的三种注释
- 单行注释( // )
- 多行注释( /* */)
- 多行注释可以自动生成文档( /** */)
数据类型
类型 | 储存需求 | 取值范围 | |
---|---|---|---|
boolean | 1字节(8 bit) | true, false | |
char | 2字节(16 bit) | 0 ~ 216-1 | |
byte | 整型 | 1字节(8 bit) | -128 ~ 127 |
short | 整型 | 2字节(16 bit) | -32 768 ~ 32 767 (-215 ~ 215-1) |
int | 整型 | 4字节(32 bit) | -2 147 483 648 ~ 2 147 483 647 (-231 ~ 231-1) |
long | 整型 | 8字节(64 bit) | -9 223 372 036 854 776 808 ~ 9 223 372 036 854 775 807 (-263 ~ 263-1) |
float | 浮点类型 | 4字节(32 bit) | 大约±3.402 823 47E + 38F(有效位数为6~7位) |
double | 浮点类型 | 8字节(64 bit) | 大约±1.797 693 134 862 315 70E + 308(有效位数为15位) |
- 长整数型有一个后缀L (如4000000000L)
- 十六进制数值有一个后缀0x (如0xCAFE)
- 八进制有一个前缀0 (如010)
- 二进制有一个前缀0b (如0b1001)
- Float类型的数值有一个后缀F (如3.14F)
final 关键字
final关键字表示变量只能被赋值一次,一旦被赋值后,就不能被更改。
例如:
1
|
Final double CMCC = 2.54
|
如果希望某个常量可以在一个类中的多个方法中使用,称这个常量为类常量。可以使用关键字static final 设置一个类常量,定义的位置在main方法外部。因此,同一个类的其他方法中也可以使用这个常量。如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。
运算符
在java中,算术运算符可以用+ – * /来代表加减乘除。
当参与除(/)运算的两个操作数为整数时,表示整数除法,答案为整数。否则,表示浮点除法。
求余数可以用%
例如10%3等于1,10%3.0等于1.0
注意:整数除以0将会产生一个异常,而浮点数除以0将会得到无穷大或NaN结果。
i++ 和++i 的区别
- 如果只是看i++和++i,这两个是等价的,都等同于i=i+1,都是变量自身加1。
- 在一般情况下,它们都是跟赋值联系在一起。
比如:
1 2 3 4 5 |
int a; a=i++; //将i的值赋值给a,即a=i;然后再执行i=i+1; 也就是【a=i++;】与【a=i; i=i+ 1 ; 】等价。 a=++i; //将i+1的值赋给a,即a=i+1;然后再执行i=i+1; 也就是【a=++i;】与【a=i+ 1 ;i=i+ 1 ;】等价。 |
总结一下
- 前置++是将自身加1的值赋值给新变量,同时自身也加1;
- 后置++是将自身的值赋给新变量,然后才自身加1.
关系运算符
三元操作符
Condition? expression1: expression2
当Condition为true时,计算或返回第一个表达式expression1,如果为false,则计算第二个表达式expression2.
如x <y ? x: y
返回x和y中较小的那个值。
数值类型之间的转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。转换过程中可能导致溢出或损失精度
1 2 |
低------------------------------------------------- ---------高 byte , short , char —> int —> long —> float —> double |
自动类型转换
必须满足转换前的数据类型的位数要低于转换后的数据类型。
自动转换由低到高的顺序转换
1 2 |
int n = 123456789 ; float f = n; //f值为1.234567892E8 |
当使用上面两个数值进行二元操作时(例如n+f , n是整数,f是浮点数),先要将两个操作数转换为同一种类型,然后再进行计算。
- 如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型;
- 否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型;
- 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型。
- 否则,两个操作数都将被转换为int类型。
强制类型转换
高的向低的顺序转换
1 2 |
double x = 3.94 ; int y = ( int ) x; |
x的结果为3,强制类型转换通过截断小数部分将浮点值转为整型。
如果想要四舍五入,得到最接近的整数。可以使用Math.round方法
1 2 |
double x = 3.14 ; int y = ( int ) Math.round(x); |
结果为4,当调用round时,仍然需要使用强制类型转换(int).其原理是因为round方法返回的结果为long类型。由于存在信息丢失的可能性,所以只有使用显式的强制类型转换才能够将long类型转换成int类型。
不要在boolean类型与任何类型之间进行强制类型转换,这样可以防止发生错误。
运算符优先级
|优先级|运算符|简介|结合性|
| —— | ——————————————————————– | —————————— —————————- | ——– | ——– |
| 1 | [ ]、 .、 ( ) |方法调用,属性获取|从左向右|
| 2 | !、~、 ++ 、 – |一元运算符|从右向左|
| 3 | * 、/ 、% |乘、除、取模(余数) |从左向右|
| 4 | + 、 – |加减法|从左向右|
| 5 | <<、 >>、 >>> |左位移、右位移、无符号右移|从左向右|
| 6 | < 、<= 、>、 >=、 instanceof |小于、小于等于、大于、大于等于,对象类型判断是否属于同类型|从左向右|
| 7 | == 、!= | 2个值是否相等,2个值是否不等于。下面有详细的解释|从左向右|
| 8 | & |按位与|从左向右|
| 9 | ^ |按位异或|从左向右|
| 10 | | |按位或|从左向右|
| 11 | && |短路与|从左向右|
| 12 | || |短路或|从左向右|
| 13 | ?: |条件运算符|从右向左|
| 14 | = 、 += 、-= 、*= 、/=、 %=、 &=、 |=、 ^=、 <、<= 、>、>= 、>>= |混合赋值运算符|从右向左|
字符串
子串substring
String类的substring方法可以从一个较大的字符串提取出一个子串。
substring(a,b)
- a 表示开始的位置(从0开始计数)
- b表示不想复制的第一个位置
例如
1 2 3 4 5 |
String greeting = "hello" ; String s = greeting.substring( 0 , 3 ); // s = hel //从0开始计数,直到3位置,但是不包括3,所以返回hel |
substring的一个优点:容易计算子串的长度,长度为ba。
例如hel的长度为3-0=3
检测字符串是否相等
可以使用equals来检测两个字符串是否相等。
s.equals(t)
如果相等,会返回true,否则,返回false. s和t可以是字符串变量,也可以是字符串常量。
eg: “hello”.equals(greeting)
检测是否相等,而且不区分大小写,可以使用equalsIgnoreCase方法。
eg: “hello”.equalsIgnoreCase(“HeLLO)
不能使用==运算符来检测两个字符串是否相同,这个运算符只能够确定两个字符串是否放置在同一个位置。
空串和Null串
空串是一个Java对象,有自己的串长度(0)和内容(空)。可以通过调用以下代码检查字符串是否为空。
1 2 3 |
if (str.length()== 0 ) 或 if (str.equals( "" )) |
null
表示目前没有任何对象与该变量关联。可以通过调用以下代码检查字符串是否为null
1 2 3 |
if (str == null ) 要检测一个字符串既不是null也不是空串: if (str != null && str.length()!= 0 ) |
length() 与charAt()
length方法会返回采用UTF-16编码表示的给定字符串所需的代码单元数量。
想要得到实际的长度,即代码点数量,可以调用
1
|
xxx.codePointCount( 0 ,xxx.length())
|
调用s.chatAt(n)将返回位置n的代码单元,n介于0~ s.length()-1之间。
eg:
1 2 3 |
String greeting = "Hello" char first = greeting.charAt( 0 ); // first is H char last = greeting.charAt( 4 ); // last is o |
想得到i个的代码点,可以使用
1 2 |
int index= greeting.offsetByCodePoints( 0 ,i); int cp = greeting.codePonintAt(index); |
输入输出
读取输入
为了能够读取用户在控制台的输入,首先需要创建一个Scanner对象,并与“标准输入流”System.in关联。
1
|
Scanner in = new Scanner (System.in)
|
- next()
读取到输入有效的字符才会结束输入,对于输入有效的字符之前的空白会自动去掉,输入有效的字符之后的空白作为分隔符或者结束符。next()不能得到带有空格的字符串。 - nextLine()
以enter为结束符,nextLine()可以得到带有空格的字符串,不会去掉空白,会全盘输出。 - nextInt()
得到int类型的数据。nextDouble(),nextFloat()以此类推。 - boolean hasNext()
检测输入中是否有还有其他单词。
记得要import java.util.*;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import java.util.*; public class Input_and_Output { public static void main (String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); System.out.print( "what is your name :" ); String name = in.nextLine(); System.out.print( "age :" ); int age = in.nextInt(); System.out.println( "the name is " + name + ",the age is " +age); } //输入结果: //what is your name :jerry //age :24 //the name is jerry,the age is 24 |
格式化输出
System.out.print(X)会将以x对应的数据类型所允许的最大非0数字位数打印输出x
1 2 |
double x = 10000.0 / 3.0 ; System.out.print(x); // x = 3333.3333333333335 |
为了能够方便格式输出结果,可以使用printf()。
1 2 3 4 5 |
double x = 10000.0 / 3.0 ; System.out.printf( "8.2f" ,x); // x = 3333.33使用8个字符的宽度和小数点后两位字符的精度打印x //因为小数点后2位,为3333.33。但是指定要8个字符的宽度,所以左边会补一个空格 // x结果为(1个空格)3333.33 |
用于printf的转换符
转换符 | 类型 | 举例 |
---|---|---|
%s | 字符串类型 | “Hello” |
%c | 字符类型 | ‘H’ |
%b | 布尔类型 | true OR false |
%d | 整数类型(十进制) | 10 |
%x | 整数类型(十六进制) | 9f |
%o | 整数类型(八进制) | 237 |
%f | 浮点类型 | 15.9 |
%a | 十六进制浮点类型 | 0x1.fccdp3 |
%e | 指数类型 | 6.23e+24 |
%g | 通用浮点类型(f和e类型中较短的) | 42.5000 |
%h | 散列码 | 42628b2 |
%% | 百分比类型 | % |
%n | 换行符 | 相当于”n”换行作用 |
%tx | 日期与时间类型(x代表不同的日期与时间转换符) | 见博文下表 |
大数值
如果基本的整数和浮点数精度不够满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。
- BigInteger 实现任意精度的整数运算
- BigDecimal 实现任意精度的浮点数运算
把普通的数值转换成大数值,可以使用静态的valueOf()方法。
1
|
BigInteger a = BigInteger.valueOf( 100 );
|
大数值的运算不能使用常用的算术运算符(如+,*)处理,而是要使用大数值类中的add
和multiply
1 2 |
BigInteger c = a.add(b); // c=a+b BigInteger d = c.multiply(b.add(BigInteger.valueOf( 2 ))); // d = c*(b+2) |
其他的运算包括有subtract(減)
,divide(除)
和mod(餘數)
数组
数组声明
数组是一种数据结构,用来存储同一类型值的集合
数组声明方式:
1
|
int [] array或者int array[]
|
数组初始化
1 2 3 |
int [] array = new int [ 100 ]; int [] arry = new int []{ 1 , 2 , 3 , 4 , 5 } int [] array = { 1 , 2 , 3 , 4 , 5 } |
创建一个数字数组时,所有的元素都初始化为0。
boolean数组的元素会初始化为false
对象数组的元素会初始化为一个特殊值null
1 2 3 4 5 6 7 8 9 |
public class Array { public static void main (String[] args) { int [] test = new int [ 5 ]; for ( int i = 0 ;i<test.length;i++) { System.out.println(test[i]);} } } |
输出的结果会是: 0 0 0 0 0
重要:
一旦创据数组,就不能再改变数组的大小。如果需要在运行中扩展数组的大小,则需要使用另一种数据结构——数组列表(array list)
for each循环
Java有一种很强的循环结构,可以用来依次处理数组中的每个元素而不必为指定下标值而分心。
格式:
for(variable:collection) statement
定义一个变量用于暂存集合中的每一个元素,并执行相应的语句。
collection这一集合表达式必须必须是一个数组或者是一个实现了Iterable接口的类对象(例如Arraylist)。
eg:
1 2 3 4 |
for ( int element :a) System.out.println(element) //打印数组a的每一个元素,一个元素占一行// for each element in a |
数组拷贝
在java中,允许将一个数组变量拷贝到给另一个数组变量。这时,两个变量将引用同一个数组
1 2 3 |
int [] a = { 2 , 3 , 5 , 7 , 11 , 12 }; int [] b = a; a[ 5 ] = 12 // b[2] = 12 |
如果想将一个数组的所有值拷贝到一个新的数组去,使用Arrays类的copyTo方法。
1
|
int [] copieda = Arrays.copyTo(a,a.length);
|
第二个参数是新数组的长度,可以通过这个方法来增加数组的大小。
eg: Arrays.copyTo(a,2*a.length);
增加到2倍大
如果数组元素是数字数组时,多余的元素都赋值为0。
如果数组元素是boolean数组,多余的元素会赋值为false
如果数组元素是对象数组的元素,多余的元素赋值为特殊值null
如果长度小于原始数组的长度,则只拷贝前面的数据元素
数组排序
想要对数组排序,可以使用Arrays类的sort方法Arrays.sort(數組a)
抽奖游戏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import java.util.Arrays; import java.util.Scanner; public class LotteryDrawing { public static void main (String[] args) { // TODO Auto-generated method stub //抽奖游戏,设置总数n和抽取的数k,随机抽取 Scanner in = new Scanner(System.in); System.out. println( "how many numbers do you need to draw?" ); int k = in.nextInt(); System.out.println( "what is the highest number you can draw?" ); int n = in.nextInt( ); //给总数赋值int [] numbers = new int [n]; for ( int i = 0 ;i< numbers.length;i++) { numbers[i]= i+ 1 ; } int [] result = new int [k]; for ( int i = 0 ; i<result.length;i++) { int r = ( int )(Math.random()*n); //随机抽取 result[i] = numbers[r]; //把抽取的值赋给result numbers[r]=numbers[n- 1 ]; //避免抽到相同的数,把最尾的值赋给被抽到的值 n--; } Arrays.sort(result); //排序 System.out.println( "Bet the foolowing combination. It'll make you rich!" ); for ( int r:result) System.out.println(r); } } |
多维数组(矩阵)
多维数组适用于表示表格或者更加复杂的排列方式。
声明和初始化
声明:type arrayName[][]
或者type[][] arrayName
初始化:
1 2 |
- balance= new double [rownumber][columnNumber] - int [][] abc = {{ 1 , 2 , 3 , 4 },{ 5 , 6 , 7 , 8 },{ 9 , 10 , 11 , 12 , 13 }} |
Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。
一、如果您发现本站侵害了相关版权,请附上本站侵权链接和您的版权证明一并发送至邮箱:yehes#qq.com(#替换为@)我们将会在五天内处理并断开该文章下载地址。
二、本站所有资源来自互联网整理收集,全部内容采用撰写共用版权协议,要求署名、非商业用途和相同方式共享,如转载请也遵循撰写共用协议。
三、根据署名-非商业性使用-相同方式共享 (by-nc-sa) 许可协议规定,只要他人在以原作品为基础创作的新作品上适用同一类型的许可协议,并且在新作品发布的显著位置,注明原作者的姓名、来源及其采用的知识共享协议,与该作品在本网站的原发地址建立链接,他人就可基于非商业目的对原作品重新编排、修改、节选或者本人的作品为基础进行创作和发布。
四、基于原作品创作的所有新作品都要适用同一类型的许可协议,因此适用该项协议, 对任何以他人原作为基础创作的作品自然同样都不得商业性用途。
五、根据二〇〇二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可不经软件著作权人许可,无需向其支付报酬!
六、鉴此,也望大家按此说明转载和分享资源!本站提供的所有信息、教程、软件版权归原公司所有,仅供日常使用,不得用于任何商业用途,下载试用后请24小时内删除,因下载本站资源造成的损失,全部由使用者本人承担!