版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。undefined本文链接: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型 强制转换前就出错了。
数值类型之间的合法转化(实线合法)
类比。
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 为止,说有的余数按照倒序排列。
运算符优先级
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("---");
}
这些是很基础的东西,绝大多是编程语言都支持,并且相差不会很大,上面说的是远远不够的,这只是自己一年前的总结,这些基础其实敲多了,就自然的熟悉了。