java中所有数值类型所占的字节数与平台无关,每一种数据的取值范围是固定的,int、short、long、byte分别占4,2,8,1个字节,float、double占4,8个字节。
float类型有后缀F,没有后缀的浮点数默认为double类型,double类型的数据后缀可以加上D。
char类型是用UTF-16编码描述的一个代码单元。
变量名以字母开头由数字或者字母组成。大小写敏感,长度没有限制,不能是保留字,不能有空格、“+”等符号。
类常量用static final修饰,final变量表示变量只能赋值一次,一旦赋值就不能改变。
二元操作时数据转换规则:若一个数为double,另一个转换为double;否则,若一个为float,则另外一个转换为float;否则,若一个为long,另一个转换为long;否则,两个数都转换为int。
枚举: enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
Size s=Size.MEDIUM;
String是不可变字符串,这样可以让编译器共享字符串,可以用equals方法来检查两个字符串的内容是否相同。而“==”检测两个字符串是否放在同一位置。
在java中char采用UTF-16编码的,也就是说,char是代表一个字符单元,占两个字节。
代码单元:UTF-8中是用8个字节表示的,UTF-16中使用16个字节表示的等等。
代码点:对应各种真正字符(char不是真正的字符,是代码单元)的Unicode编码。一个代码点可能对应一对代码单元,如辅助字符。
char ch=str.charAt(2);获取代码单元,但是如果这个代码单元时某个代码点的一部分(它和另外一个代码单元构成一个代码点,如辅助字符),那么ch任然显示的是整个代码点。所以不建议使用char类型。
codePointAt获得代码点,可以用如下方式遍历代码点:
int cp = aString.codePointAt(index);
if (Charater.isSupplementaryCodePoint(cp))
i += 2;
else
i++;
StringBuilder是可变字符串。
StringBuilder builder=new StringBuilder();
builder.append(ch); //append a character
builder.append(str); //append a string
控制台输入:需要将标准输入System.in与一个Scanner对象关联
Scanner in=new Scanner(System.in);
Scanner有nextLine,next(以空格分开),nextInt,hasNext,hasNextInt等方法。
控制台输出:用标准输出System.out
System.out.printf可以控制输出格式。%后面加d,f,s,c表示十进制整数、浮点数、字符串、字符。System.out.printf("%8.2f",x);以宽为8,小数位数为2输出。
文件输入:从文件中读取用 Scanner in=new Scanner(new File("C:\\mydir\\file.txt"));
这里反斜杠需要两个,如果文件不存在,那么会发生异常。
文件输出:写入文件时需要用PrintWriter对象, PrintWriter out=new PrintWriter("file.txt");
注意Scanner中参数为File,而PrintWriter中参数为String(文件名)。
switch语句中,case标签必须是整数或枚举变量,不能测试字符串。
java.math包中有两个表示大数据的类BigInteger和BigDecimal。其加减乘除用add、substract、mutiply、divide表示。
BigInteger c=BigInteger.valueOf(100);
BigInteger b=g.mutiply(BigInteger.valueOf(10000));
数组是存储同一类型的数据的集合,它是引用类型。
声明及初始化:int[] a;int a[];int b[]={2,3,5}; //左边不能有数据大小
长度:array.length,长度可以为0
for each: for(int x:b) //遍历b
System.out.println(x);
还可以用如下方式打印数组:System.out.println(Array.toString(b));
数组的拷贝: int[] lucky={2,4,6};
int[] good=Array.copyof(lucky,lucky.length*2); //good={2,4,6,0,0,0}
这里多余的元素赋值0,如果是boolean类型的,多余元素赋值为false。
排序:int[] a=new int[1000]; ... ...
Array.sort(a); //用快速排序将a从小到达排序
多维数组的for each循环:
double[][] a=......;
for(double[] row:a)
for(double value:row)
System.out.println(value);
也可以用System.out.println(Array.deepToString(a));输出。
不规则数组:java实际没有多维数组,只有一维数组,多维数组可以理解为是“数组的数组”。
int [][] old=new int[4][];
for(int i=0;i<3;i++)
old[i]=new int[i+1];
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。
public class Test1 {
public static void main(String[] args) throws UnsupportedEncodingException{
split("我ABC",4);
split("我ABC汉DEF",6);
/**
* 对于UTF-8:‘我’占3个字节,‘a’占1个字节
* 对于java采用的UTF-16,‘我’占2个字节,‘a’占2个字节,不过他们前面貌似还有两个字节(feff),表示规则吧
* 所以‘我’.getBytes("UTF-8")得到4,‘我们’.getBytes("UTF-8")得到6
* 对于GBK,‘我’占两个字节,‘a’占一个字节
*/
//System.out.println("我a".getBytes("UTF-16").length);
}
public static void split(String source,int num) throws UnsupportedEncodingException{
int k=0;
String temp="";
for (int i = 0; i <source.length(); i++){
byte[] b=(source.charAt(i)+"").getBytes("GBK");//"我".getBytes("UTF-8")得到3
k=k+b.length;
if(k>num){
break;
}
temp=temp+source.charAt(i);
}
System.out.println(temp);
}
}