Java的基础程序设计结构(Java学习-1)
- 2019 年 11 月 5 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43126117/article/details/90710314
一年前学习Java的总结
注释
注释就是方便自己或者别人阅读代码,绝大多数的程序语言都有注释这个功能,大部分的注释命令都是相同的或者想通的,
下面给出Java的注释结构
三类注释 //单行注释 /*多行注释*/ /**文本注释*/
注意:/*多行或者文本注释*/不能嵌套。后面的*/或匹配前面的。
文本注释可以用来自动生成程序文档。
数据类型
Java是一种强类型语言,也就是说每一个变量声明都需要一种数据类型,作为一款可移植性,跨平台可用的语言,当然不像C、C++这种换平台,64位OS->32位OS,数据类型空间就发生改变,JVM的好处呗。
- 数据类型划分两种
基本数据类型:
数值型 整型:byte short int long 默认值:0; 浮点型:float double 默认值0.0 字符型:chat ’u0000' ‘ 布尔型:Boolean false
引用数据类型: 数组 类 接口 默认值:根据存放内容,初始化不同值,对象(null),基本数据类型(默认值)。
- 整型
声明一个数据类型 一个数据溢出(最小值?)的问题 int maxValue = Integer.MAX_VALUE +1 一个变量命名要求 首字母小写 下个单词大写) 操作前预估数据大小 怎么解决溢出问题:换个数据类 long解决interest的数据溢出问题,(有一个大数值的概念) 在使用方法处理时,要注意 所有的程序执行顺序都是 由等号的右边到左边,计算还会溢出, 溢出的问题
一 将int 的数据变量赋值给long
long result = maxValue; long result = maxValue +1; //出错 这里涉及到一个自动转换的问题, 等号右边到左边;
二 直接将某一int型变量变为long型
long result = (long)maxValue +1;//强制转换
数据类型也可以以小变大!!(强制完成- 肯定会丢内容,少用 少用) 任何整数其默认数据类型,所以 long i= 2147483648; 编译是错误的 int型储存不了那么的数字范围 所以在int型 强制转换前就出错了。
![](https://ask.qcloudimg.com/http-save/6430374/xtzmsubx1h.jpeg)
数值类型之间的合法转化(实线合法)
类比。 long i = 2147483648L (L/l)
重要说明
关于数据类型的默认值, 这个默认值在方法(主方法)中声明无效 int num; 直接输出 System.out.print(num) 出错
class Untitled { public static void main(String[] args) { int i ; System.out.println(i); } } Untitled.java:4: error: variable i might not have been initialized System.out.println(i); ^ 1 error
byte数据保存范围问题 十进制为( -128–127. ),1字节
byte i = 10 ;// 输出也是 10 ,为什么没错, 10 int型 可以强制转换成 byte 可以保存下。 byte i = 128; //从 int转换到 byte 可能有损失。 byte i = (byte)128 //溢出 ! byte i = (int j = 10); //出错!!运行:等号右边到左边,小的自动转大的 byte i = (byte) (int j = 10);
- 浮点型
描述小数的数据,默认是double。 如果要用float,要强制转换,在数字后加一个F/f。、
float f = 1.1 ; //错误,从double转换float可能有损失。 float f = 1.1F; float f = (float)1.1;
(Java 的一个but , 输出的数有一推零。) 精度问题(int型 除 int型 等 int型 , 10/4 =2 ,错误。 )
- 字符型
会使用字符型的概念,但是很少使用char, 单引号 chat c ='A'; 麻烦的地方在 int型的转换等比较难, Unicode编码,十六进制编码。包含ASCII。 常用范围 大写字母A-Z;65—90 小写字母a-z;97 -122(相差32个) chat c ='A'; int num = c + 32; //等于int 型 ,大的范围类型加小范围类型,等于大的数据类型 字符数字(‘0’-‘9’),48-57. 另外一个神奇的用法, 变量命 类名 直接用中文都可以。命名标识符
char只可以描述单一字符, 多个字符用String,String不是基本数据类型是一种引用数据类型 ‘’+‘’ 两个字符串相加, int+double+String 结果(String)为字符串相加连接,不能用减。解决方法:(int+double)+String 还存在一种转义字符! 可以对字符串进行一些操作。
这里也涉及到一个Unicode和char的问题,要从编码机制开始说,就不谈了。
- 布尔型
一般指逻辑结果,其他语言没有布尔型,其他语言用0 1表示 .
变量
刚说的,Java是一种强类型语言,也就是说每一个变量声明都需要一种数据类型
命名规范,大小写敏感,不能用Java关键字。
public calss Constants{ int i ; int i = 1;//变量声明 public static void main(String [] arg){ int i ;//局部变量声明,上面说了,这个无效 int i = 1;//局部变量声明 final double i = 2.3;//加了final关键字就是常量了,不能改变值 } public static final double i = 2.3;//类常量,别的类可直接访问。 }
运算符
程序的计算 别写特别的复杂运算。可使用Math类下的方法,关于这些算法,其实都是用C写的,有兴趣可以看算法网站
- 基本四则运算
自增运算:++变量(先加再运算)。 变量++(先运算再相加)。 自减运算。
- 三目运算
赋值运算,根据条件运算。 int result = x > y ? x : y; 不熟悉,也可以写if判断。代码行数太多了。
- 关系运算符
>,<,<=,==,!=.返回结果都是布尔型。字符和数字判断 ‘a’ == 97 ;
- 逻辑运算
与, 或 ,非(!) 。 返回布尔型 & , && (单& 全部都都返回了,不管后面是怎么样, 双&&,(短路与),判断一个就行了) | , | | (单 | 全部都返回了, 双||判断前面就ok了。)
- 位运算(了解)
按照二进制 十六进制 等进行 数据移位处理。 位运算实现的关键问题再与要进行十进制与二进制的转换,转换原则是 数据除 2 取余,一直除到 0 为止,说有的余数按照倒序排列。
- 运算符优先级,运算可以直接加括号。()
![](https://ask.qcloudimg.com/http-save/6430374/xqp80u1dm9.jpeg)
运算符优先级
- 常见运算符使用例子
int x ; x += 4; x = x + 4; x +=3.5; x = (int) x + 3.5; x++; x = x + 1;//先赋值再运算 ++x; x = x + 1;//先运算再赋值 if(x != 0 && x++>y ) //前面要是false了,后面是不会运行的。 enum Size{s,m,l,x};//枚举 Size s = Size.s;
字符串
Java是没有字符串类型的,它只是Unicode字符序列,其实就是一个字符数组(char [ ]),String是一个Java一个预定义类,也称为不可变字符串。
String e = ""; //一个空字符串 if(e != null&& e.length != 0);//判断字符串,因为String还有一个特殊的值null;
- 子串
String e = "hello"; String sube = e.substring(0,2);//hel //源码 public String substring(int beginIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } int subLen = value.length - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return (beginIndex == 0) ? this : new String(value, beginIndex, subLen); }
- 拼接
java语言允许使用加号连接两个字符串,需要注意的是这是生成一个新对象,jvm的垃圾回收会解决旧对象的回收问题。
- 检查字符串是否相等
==和.equal
在引用数据类型中==比较的是:在内存中的地址是否相等。
在基本数据类型中==比较的是:值是否相等。
.equal的问题,由于String对象是利用字符常量形成的数组,并且内部有一个字符串共享的存储池的概念;
String a = "hello";//在字符串共享池中存入。 String b = "hello";//先在共享池中查找到相同对象,引用相同内存地址,共享池就是一个对象数组 a==b;//是相等的,内存地址相等;
so,一般比较字符串大小使用.equal。
if(e.equal(hello)); if(e.compareTo("hello"));//类似上面的 //.equal源码java.lang.String类 /** The value is used for character storage. */ private final char value[]; public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
- 字符串原理
字符串由char值序列组成的,char类型是一个采用UTF-16编码表示unicode码点的代码单元。(有一些字符需要两个代码单元)
String e = "hello"; String num = e.length();//获取代码单元(在内存中的大小) 5 String num = e.codePointCount(0,e.length());//获取码点(实际看到的数量) 5 /** The value is used for character storage. */ private final char value[];
- 一些字符串注意点
我们尽量减少使用char类型,因为这个太底层了,太多技术细节了,
String类是一个非线程安全的,并且一部小心就生成了很多String对象,浪费空间和时间,虽然jvm有自动垃圾回收,但是也是系统的一个负担。
so,使用StringBuilder类,或者StringBuffer类(线程安全)。
控制流程
- 顺序结构
分支结构,逻辑判断,满足某些条件才执行
if 分支结构 if(布尔表达式){ 满足条件时执行代码; }else if( 布尔表达式){ 条件满足时的执行代码; }。。。【else】{ 所有条件都不满足时执行的代码; } switch分支结构 switch(数字|枚举|字符|字符串){ case 内容1 :{ 瞒住的条件执行 【break】~停止的 } default{ 都不满足执行 } }
- 循环结构
while循环 while(布尔表达式)( 循环语句; 修改循环结束田间判断; } 另 do -- while(始终执行一次) 基本不使用 for循环 FOR(循环初始条件;循环结束判断;修改循环条件{ 循环代码 }
对于不知道循环次数的用while, 知道次数的使用for循环。 循环控制 continue: 跳过当前的循环,循环体后面的不执行。回到循环语句开头 brake:结束整个循环体 循环嵌套,用的不多。
数组
数组是一种引用数据类型,用来存储同一类值的集合,通过一个整型下标可以访问数组中的每一个值。
- 数组初始化
int a[]; int [] a ;//声明整型数组a,只是声明了变量。 int [] a = new int[100]//创建数组,下标为0-99。 int [] b = {1,2,3};//简写 b = new int[]{3,5,4};//匿名数组
- 数组拷贝
数组拷贝,只是两个变量引用同一个数组,也就是同一个堆地址。同一块堆被不同块栈指向,堆真实数据 , 栈保存堆的地址。
int [] a = {1,2,3}; int [] b = Arrays.copyOf(a,a.length); //源码 public static int[] copyOf(int[] original, int newLength) { int[] copy = new int[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
- 数组排序与查找
Java语言是完全面向对象的,相比于“结构化”的语言,注重方向是一样的,Java,更加注重数据结构,而不是算法。so,这里就谈算法的问题啦,直接使用api。
int [] a = {1,3,2,5}; int [] b = Arrays.sort(a);//优化了的快速排序算法 int c = Arrays.binarySearch(a ,0 ,3 ,2);//二分搜索查找算法
- 多维数组
Java实际上是没有“多维数组”的概念的,但是可以用“数组的数组”代替。
int [][] a ;//声明 int [][] a = new [1][2];//初始化化 int [][] a = { {1,2,3}, {2,3,4} };//简写 //不规则数组 int [][] b = { {1,2,3}, {1,2,3,4,5} }; //可以用foreach输出数组 foreach(int [] row : b){ foreach(int value : row){ System.out.println(value); } System.out.println("---"); }
总结
这些是很基础的东西,绝大多是编程语言都支持,并且相差不会很大,上面说的是远远不够的,这只是自己一年前的总结,这些基础其实敲多了,就自然的熟悉了。