【java(一)】——java的基本程序设计结构
断断续续学习Java的第一天
来自《Java核心技术 卷1》
你要为你说出的每句话,负责。特别是当你表情特别认真、好像真的在为对方着想的时候。此刻的想法
一个简单的Java应用程序
1、java中的所有函数都属于某个类的方法,因此java中的main方法必须有一个外壳类。Java中的main方法必须是静态的,关键字void表示没有返回值,如果main方法正常退出,那么Java应用程序的退出代码为0,表示成功地运行了程序。如果希望在终止程序时返回其他的代码,那就需要调用System.exit
方法。
2、java的通用语法:object.method(parameters);
数据类型
3、4种整型数据:
Java中没有任何无符号unsigned形式的int、long、short或byte类型
4、两种浮点类型:4字节(后缀为,很少使用)、8字节(默认,无后缀) NaN
不是一个数字;浮点数值不适用于无法接收舍入误差的金融计算中,如
5、字符串:char类型,Unicode编码
char类型用单引号括起来,如'A'
,它不等于用双引号括起来的"A"
,这是一个包含字符A的字符串。char类型的值可以表示为十六进制值,其范围从\u0000
到\uffff
。\u2122
表示注册符号(TM),转移字符串\u
可以出现在加引号的字符常量或子浮串之外。注释中的\u
也一定要注意了,因为Unicode转义序列会在解析代码之前得到处理。尽量不要再程序中使用char类型,最好将字符串作为抽象数据类型处理
6、boolean类型:true和false,与c++不同,没有什么非0代表true,0代表false的说法
变量
7、不要再代码中出现$
8、注意!不要使用未初始化的变量
9、常量:使用关键字final
,表示这个变量只能被赋值一次,一旦被赋值了,就不能再改了,注意常量你就使用全大写表示吧,好区分
10、static final
表示一个类常量,因为有时候希望某个常量可以在一个类的多个方法中使用,如果再被声明为public
,那这个常量还可以在其他类中被使用
运算符
11、 整数被0除会产生一个异常,但是浮点数被0除会得到一个无穷大或NaN的结果【这就是区别】
12、Math.pow()
的两个参数是double类型,返回值也是double。负数求余得到的是-1.
13、数值类型的转换,低字节的转换为高字节的
14、强制类型转换:高字节强制转换为低字节。有一个函数Math.round
,返回的类型的long型
15、&&
和||
的“短路”方式求值,前面的已经能直到整个表达式的值,后面的就不需要计算了,&
和|
也可以的得到一个布尔值,但是不采用短路方式
16、<<
和>>
是左移和右移的位运算符,移位运算符需要对右操作数进行模32运算,如1<<35等同于1<<3
String类
17、Java允许使用+号拼接两个字符串,当一个字符串与一个非字符串的值进行拼接时,后者被转换为字符串。如果需要把多个字符串放在一起,同时用一个特定的字符隔开,可以使用静态join方法String.join("特定字符串","first","second","……");
18、各种字符串存放在公共的存储池中,字符串变量指向存储池中相应的位置,如果赋值一个字符串变量,原始字符串与复制的字符串共享相同的内存中的字符
19、检测字符串是否相等:一定!一定!注意!使用equals
方法检测,而不是用==
符号,这个符号只能检测这两个字符串是否指向同一内存,不能比较内容是否相同。但是字符串的情况是,有可能内容相同的多个字符串的拷贝放置在不同的位置上。实际上,只有字符串常量是共享的,而+或者substring等操作产生的结果并不是共享的。当然也可以使用compareTo,但还是用equals好了
20、空串不是Null串,空串""
是长度为0的字符串,检测是否空串:if(str.length()==0)
或者if(str.equals(""))
,空串是有长度(0)和内容(空)的,是一个Java对象。单数Null串,表示的是目前没有任何对象与这个变量关联。if(str==null)
。要检查一个字符串既不是null也不是空串if(str!=null&&str.length()!=0)
一定要先检测是否null,不可以对一个null调用函数,它都不是一个对象呢
21、大部分Unicode码点(字符)使用一个代码单元就可以表示,辅助字符需要一对代码单元。length方法返回的是代码单元数量,而实际长度是码点数量,可以调用codePointCount
函数,调用charAt将返回位置n的代码单元。要想得到第i个码点,应该调用offsetByCodePoints(0,i);
22、String API【手敲一下,加点印象】
函数原型 | 作用 |
---|---|
int codePointAt(int index) | 返回从给定位置开始的码点 |
char charAt(int index) | 返回给定位置的代码单元,一般不需要调用这个方法 |
int offsetByCodePoints(int startIndex,int cpCount) | 返回startIndex代码点开始,位移cpCount后的码点索引 |
int compareTo(String other) | 按照字典顺序,如果字符串位于other之前,返回一个负数;之后,正数;相等,0 |
IntStream codePonints() | 将这个字符串的码点作为一个流返回。调用toArray将它们放在一个数组中 |
new String(int[] codePoints,int offset,int count) | 用数组从offset开始的count个码点构造一个字符串 |
boolean equals(Object other) | 相等,返回true |
boolean equalsIgnoreCase(String other) | 相等(忽略大小写),返回true |
int indexOf(String/int[,int fromIndex]) | 返回与字符串或代码点匹配的第一个子串的开始位置 |
int lastIndexOf() | 与上面一个功能类似,只不过这一个是返回最后一个子串的位置 |
int length() | 返回字符串的长度 |
int codePointCount(int start,int end) | 返回start和end-1之间的代码点的数量 |
String subString([]) | 返回一个新的字符串 |
String trim() | 返回一个而删除了原始字符串头部和尾部空格的字符串 |
String join() | 返回新字符串,用给定的界定符链接所有元素 |
23、构建字符串:使用StringBuilder类
StringBuilder builder=new StringBuilder();
builder.append(ch);
builder.append(str);
String completedStr=builder.toString();
24、面试题:请解释String、StringBuffer、StringBuilder 的区别?
⚫String类的内容一旦声明则不可改变,StringBuffer 和 StringBuilder 的内容
可以改变。
⚫StringBuffer 类中提供的方法都是同步方法,属于安全的线程操作;而
Stringbuilder 类中的方法都是异步方法,属于非线程安全的操作。
日后在开发中见到字符串的应用,不需要思考 95%使用 String 类,只有在需要频繁修改的时候才需要使用 StringBuffer 或者 StringBuilder。
输入输出
25、通过控制台输入步骤:
①构造一个Scanner
对象,并与“标准输入流”相关联:Scanner in=new Scanner(System.in);
②使用Scanner类的各种方法实现输入操作:in.nextline();
或者读取intin.nextInt();
26、对于密码的 读取一般使用Console类
,对于任何一个通过控制台窗口启动的程序,都可以使用Console
对象。
27、文件输入和输出
//读取文件
Scanner in=new Scanner(Path.get("文件路径+文件名","UTF-8"));
//写入文件
PrintWriter out=new PrintWriter("文件名","UTF-8");
//以下只是将字符串解释为数据,并不是文件名
Scanner in=new Scanner("文件名");
控制流程
28、Java不允许在嵌套的两个块中声明同名的变量,与C++不同
29、注意double类型的比较,在《数据结构与算法》中有提到
30、对于switch,尽量不要使用,如果使用可以在编译时加上javac -Xlint:fallthrough Test.java
这样在编译时,如果发现某个case后面缺少break
,编译器就会发出警告
31、case可以是char、String、byte、short、int的常量表达式
32、Java没有允许程序员对运算符进行重载
33、所以关于大数值的计算有如下图
数组
34、声明一个数组:int[] a;
没有初始化
35、创建数组:int[] a=new int[100];
36、不初始化的时候,默认数字型为0,boolean型为false,对象(String
)为null
37、一旦创建了数组,就不能再改变它的大小,需要扩展数组大小最好使用数组列表
38、增强版的for语句for each,如for(int ele:elements)
可以遍历数组中的每个元素,不需要使用下标值,不必为起始值和终止值操心。
40、有个更简单的打印数组中所有值的方式:Arrays.toString(a)
,其中a是数组
41、数组长度为0与null是不一样的
42、数组拷贝:int[] copyArray=Arrays.copyOf(originArray,originArray.length);
,第二个参数是新数组的长度,这样的方式通常用来增加数组大小
Java中[]
运算符被预定义为检查数组边界,而且没有指针运算,即不能通过对数组名+1到达下一个元素【与C++的区别】
43、命令行参数:arg[0]
是第一个参数变量,和C++不一样,Java中的命令行参数不包括文件名
44、数组排序:Arrays.sort(数组名)
45、for each对于二维数组:
另外,可以使用System.out.println(Arrays.deepToString(数组名));
打印出一个二维数组的数据元素列表,打印出来的格式是:[[ ],[ ],[ ]]
46、Java特别:Java其实没有多维数组,只有一维数组,多维数组被解释为“数组的数组”,不是连续存放的内存单元,内存中的存放如下:
public class LotteryArray {
public static void main(String[] args) {
final int MAX=10;
int[][] odds=new int[MAX+1][];
//声明每行格子的列数
for(int n=0;n<=MAX;n++)
odds[n]=new int[n+1];
for(int n=0;n<odds.length;n++)
for(int k=0;k<odds[n].length;k++) {
int lotteryOdds=1;
for(int i=1;i<=k;i++)
lotteryOdds=lotteryOdds*(n-i+1)/i;
odds[n][k]=lotteryOdds;
}
for(int[] row:odds) {
for(int odd:row)
System.out.printf("%-5d",odd);
System.out.println();
}
}
}
运行结果:
附:垃圾回收机制
47、请解释什么叫 GC,如何处理?
⚫ GC(Garbage Collector)垃圾收集器,指的是释放无用的内存空间;
⚫ GC 会由系统不定期的进行自动的回收,或者调用 Runtime 类中的 gc()方法手
工回收。
实际上 Runtime 类还有一个更加有意思的功能,就是他可以调用本机的可执行程序,并且创建进程。
垃圾回收机制—参考博客:https://blog.csdn.net/zsuguangh/article/details/6429592
上一篇: 锁的实现原理
下一篇: Java核心 -- 基本程序设计结构