欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【java(一)】——java的基本程序设计结构

程序员文章站 2022-07-12 18:36:49
...

断断续续学习Java的第一天
来自《Java核心技术 卷1》
你要为你说出的每句话,负责。特别是当你表情特别认真、好像真的在为对方着想的时候。此刻的想法
【java(一)】——java的基本程序设计结构

一个简单的Java应用程序

1、java中的所有函数都属于某个类的方法,因此java中的main方法必须有一个外壳类。Java中的main方法必须是静态的,关键字void表示没有返回值,如果main方法正常退出,那么Java应用程序的退出代码为0,表示成功地运行了程序。如果希望在终止程序时返回其他的代码,那就需要调用System.exit方法。
2、java的通用语法:object.method(parameters);

数据类型

3、4种整型数据:
【java(一)】——java的基本程序设计结构
Java中没有任何无符号unsigned形式的int、long、short或byte类型
4、两种浮点类型:4字节(后缀为f,很少使用)、8字节(默认,无后缀)
【java(一)】——java的基本程序设计结构
NaN不是一个数字;浮点数值不适用于无法接收舍入误差的金融计算中,如2.01.10.89999999999999999999
5、字符串:char类型,Unicode编码
【java(一)】——java的基本程序设计结构
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.
【java(一)】——java的基本程序设计结构
13、数值类型的转换,低字节的转换为高字节的
【java(一)】——java的基本程序设计结构
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、所以关于大数值的计算有如下图
【java(一)】——java的基本程序设计结构

数组

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++的区别】
【java(一)】——java的基本程序设计结构
43、命令行参数:arg[0]是第一个参数变量,和C++不一样,Java中的命令行参数不包括文件名
44、数组排序:Arrays.sort(数组名)
45、for each对于二维数组:
【java(一)】——java的基本程序设计结构
另外,可以使用System.out.println(Arrays.deepToString(数组名));打印出一个二维数组的数据元素列表,打印出来的格式是:[[ ],[ ],[ ]]
46、Java特别:Java其实没有多维数组,只有一维数组,多维数组被解释为“数组的数组”,不是连续存放的内存单元,内存中的存放如下:
【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();
        }
    }
}

运行结果:
【java(一)】——java的基本程序设计结构

附:垃圾回收机制

47、请解释什么叫 GC,如何处理?
⚫ GC(Garbage Collector)垃圾收集器,指的是释放无用的内存空间;
⚫ GC 会由系统不定期的进行自动的回收,或者调用 Runtime 类中的 gc()方法手
工回收。
实际上 Runtime 类还有一个更加有意思的功能,就是他可以调用本机的可执行程序,并且创建进程。
垃圾回收机制—参考博客:https://blog.csdn.net/zsuguangh/article/details/6429592