2. Java 基本语法


1. 变量/数据类型[1]

1.1. 基本数据类型

  • 整数类型

    • byte: 1个字节(8位),-128 ~ 127
      • 二进制:最高位是符号位,0:正数;1:负数
      • 公式:2^{字节数*{8-1}} ~ 2^{字节数*{8-1}}-1
    • short:2个字节,2^{15} ~ 2^{15}-1
    • int:4个字节,2^{31} ~ 2^{31}-1
    • long:8个字节
  • 小数(浮点类型)

    • float:4个字节(32位)
    • double:8个字节(64位)
      • 能用float就不用double,省内存加速
  • 布尔类型

    • 表示真或假
  • 字符类型

    • char:单个字符(2个字节,可以存放汉字)
      • 结论:在Java中,对char进行运算时,直接当作ascii码对应的整数对待
    • String:字符串

1.2. 定义变量

  • int a;这就定义了一个变量,变量名是a
  • float b;这也定义了一个变量,表示一个float类型的小数,变量名是b
  • 变量不能重复

1.3. 初始化变量

  • 在定义变量时,就给值
  • int a=45;这就是初始化变量a

1.4.变量赋值

  • 先定义变量:int tt;再给值tt=780

1.5. 基本数据类型转换

  • 自动转换
    • 原则:数据只能从高精度到低精度转换:byte< short< int< long< float< double
      • int a=1.2出错
      • double b=3 可以
    • 当一个整数和一个double运算时,运算结果会向高精度转
  • 小数默认是double,
    • float a=3.4出错
    • float a=3.4f 可以
  • 强制转换:
    • int a=(int)1.9:只取1

2. 运算符

2.1. 算术运算符

  • 算术运算符
    • *,/,+ ,-,
    • %取模
      • %运算可得两个数相除的余数
    • += 左加;-= 左减
    • /= 左除;%= 左取模
      • Int a=90; a+=90; ==>a=a+90 输出180
      • Float b=89.7f; b+=a; ==>b=b+a 输出 179.7
    • ++ 自加; -- 自减
int a=56;
int b=a++;//b=a;a=a+1;
System.out.println(b);//输出56
System.out.println(a);//输出57

int a=56;
int b=++a;//a=a+1; b=a;
System.out.println(b);//输出57
System.out.println(a)=//输出57

2.2. 关系运算符

  • == 等于;!= 不等于
  • ; <; >=; <=

2.3. 逻辑运算符

  • && 与;
  • || 或;
  • !非

3. 三大流程控制

  • 顺序控制
  • 分支控制
//1)单分支
if(条件表达式){
    语句;
}

//2)双分支
if(条件表达式){
    语句;
}else{
    语句;
}

//3)多分支
if(条件表达式){
    语句;
}else if(条件表达式){
    语句;
}else if(条件表达式){
    语句;
}else{
    语句;
}//找到一个入口后,即使下面的条件符合,也不会再进入

b.switsch(条件表达式){
case 常量1:
    语句1;
    break;
case常量2:
    语句2;
    break;
...
case常量n:
    语句n;
    break;
default:
    语句;
    break;
}
//条件表达式数据类型,应和case后的常量类型一致
//Switch中可用的数据类型:byte,short,int,char,enum
  • 循环控制
//for循环
for(循环初值; 循环条件; 步长){
        语句; //循环体
}

//while循环
while(循环条件){
        语句;//循环体
}

//do while循环
Do{
        语句;//循环体
}while(条件);

4. 数组

一维数组

  • 特点
    • 数组可以存放多个同一类型的数据
    • 对象数组在定义后,复制时需要再次为每个对象分配空间[new 对象]
    • 数组大小必须事先指定
    • 数组下标是从0开始编号
    • 输出数组
int[] arr={1,3,6,8,10};
for(int i=0; i<arr.length; i++)
    {
        System.out.print(arr[i]);
    }
  • 用法
//1. 程序员用法

//数组的定义
int a[]=new int[5];//数据类型 数组名[] =new 数据类型[大小];
//数组的引用
a[2];//数组名[下标]  比如:使用a数组的第三个数


//2. 没事找事用法

//第一步:先声明数组
int[] a;//数据类型 数据名[];  或 数据类型[] 数组名;
//第二步:创建数组
A=new int[5]//数组名=new 数据类型[大小];
//第三步:数组引用
a[2];


//3. 古板用法

//第一步:初始化数组
Int a={2,5,6,89,30};//数据类型 数组名[]={元素值, 元素值,...}  相当于:int a[]=new int[5]; a[0]=2;a[1]=5...
//第二步:数组的引用
a[2];

多维数组


5.排序,查找

比较字符串内容是否相等时, 用squals, 不要用==

排序是将一群数据,依照指定的顺序进行排列的过程

内部排序

将需要处理的所有数据都加载到内部存储器中进行排序

交换式排序法

运用数据值比较后,依照判断规则对数据位置进行交换

冒泡排序法(Bubble Sorting)
  • 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。
class Bubble{
    //排序方法
    public void sort(int arr[])
    {
        int temp=0;
        //排序
        //外层循环,决定走几趟
        for(int i=0; i<arr.length-1; i++){
            //内层循环,开始逐个比较, 如果发现前一个数大于后一个数,则交换
            for(int j=0; j<arr.length-1-i;j+1)
            {
                if(arr[j]>arr[j+1])
                {
                    //换位
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
    }
}


快速排序法(Quicksort)

选择式排序法

选择排序法(Selection Sort)
//选择排序法(Selection Sort)
class Select1{
    //排序方法
    public void sort(int arr[])
    {
        int temp=0;
        for(int i=0; i<arr.length-1; i++)
        {
            //假设第一个数最小
            int min=arr[i];
            //记录最小数的下标
            int minIndex=i;
            
            for(int j=i+1; j<arr.length; j++)
            {
                if(min>arr[j])
                {
                    //修改最小
                    min=arr[j];
                    minIndex=j;
                }
            }
            temp=arr[i];
            arr[i]=arr[minIndex];
            arr[minIndex]=temp;
        }
    }
}

class Select2{
    public void sort(int arr[]){
        int temp=0;
        for(int i=0; i<arr.length-1; i++)
        {
            
            for(int j=i+1; j<arr.length; j++)
            {
                if(arr[i]>arr[j])//假设arr[i]最小
                {
                    temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
                }
            }
            
        }
    }
}
堆排序法(Heap Sort)

插入排序法

属于内部排序法,是对与欲排序的元素以插入的方式找寻该元素的适当位置,已达到排序的目的

插入排序法(Insertion Sort)
  • 把n个待排序的元素看成一个有序表和一个无序表。开始时有序表中只包含一个元素,无序表中包含(n-1)个元素。排序过程中,每次从无序表中去除第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表
//插入排序法
class Insertion{
    //排序方法
    public void sort(int[] arr)
    {
        for(int i=1; i<arr.length; i++)
        {
            int insertVal=arr[i];
            int index=i-1;
            //insertVal准备和前一个数比较
            while(index>=0&&insertVal<arr[index])
            {
                //将arr[index]向后移
                arr[index+1]=arr[index];
                //index继续向前走
                index--;
            }
            arr[index+1]=insertVal;
        }
    }
}
谢尔排序法(Shell Sort)
  • 先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的),分别进行直接插入排序。待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
二叉树排序法(Binary-tree Sort)
  • 处理过程:先将第一个元素作为有序序列,进行n-1次插入。用二分查找的方法查找待排元素的插入位置,将待排元素插入。

6.2 外部排序###

数据量过大,无法全部加载到内存中,需要借助外部存储进行排序

合并排序法

  • 将已排好序的A、B合并成E,C、D合并成F,且E、F内部数据均已排好序。再将已排好序的E、F合并成G, 且G的内部数据已排好序。至此,四个文件A、B、C、D完成排序。

直接合并排序法


6.3 查找

  • 顺序查找[较简单]
  • 二分查找[演示]
package com.one_dimensional_array;

public class Demo5_3 {

    public static void main(String[] args) {
        int arr[]= {2,5,7,12,25};
        BinaryFind bf=new BinaryFind();
        bf.find(0, arr.length-1, 12, arr);
    }

}


//二分
class BinaryFind{
    public void find(int leftIndex,int rightIndex,  int val, int[] arr)
    {
        //首先找中间的数
        int midIndex=(rightIndex+leftIndex)/2;
        int midVal=arr[midIndex];
        
        if(rightIndex>=leftIndex) {
        //如果要找的数比midVal小
        if(midVal>val)
        {
            //在arr左边数中找
            find(leftIndex, midIndex-1, val, arr);
        }else if(midVal<val)
        {
            //在arr的右边数中找
            find(midIndex+1, rightIndex,val,arr);
        }else if(midVal==val)
        {
            System.out.println("找到下标"+midIndex);
        }
        }
    }
}

7. 集合框架

7.1 集合类

  • 较常用:
    • HashMap, HashSet, Hashtable(Legacy), ArrayList, LinkedList, Vector(Legacy), Stack(Legacy)
  • 分类
    • List结构的集合类
      • Arraylist类,LinkedList类,Vector类,Stack类
    • Map结构的集合类
      • HashMap类,Hashtable类
    • Set结构的集合类
      • HashSet类,TreeSet类
    • Queue结构的集合
      -Queue接口

7.2 常用方法

  • ArrayList
package com.one_dimensional_array;

import java.util.*;
public class Demo_Test {

    public static void main(String[] args) {
        ArrayList a1=new ArrayList();
        
        int a=0;
        int b=1;
        int c=2;
        
        //添加
        a1.add(a);
        a1.add(b);
        a1.add(c);
        System.out.println(a1);
        
        //删除
        a1.remove(a);
        System.out.println("====删除a====");
        
        //遍历找到
        for(int i=0;i<a1.size();i++)
        {
            System.out.println(a1.get(i));
        }
    }
}

/*结果:
[0, 1, 2]
====删除a====
1
2*/
  • LinkedList
public static void main(String[] args) {
    LinkedList l1=new LinkedList();
    Emp emp1=new Emp("sa01","aa",1.2f);
    Emp emp2=new Emp("sa02","bb",1.2f);
            
    //把emp1加在链表的最后面,emp1加在最前
    l1.addLast(emp1);
    l1.addFirst(emp2);
    for(int i=0;i<l1.size();i++)
    {
        System.out.println(((Emp)l1.get(i)).getName());
    }
}

class Emp{
...//假设已写好( ̄▽ ̄)"
}
  • Vector
public static void main(String[] args) {
    Vector vv=new Vector();
    vv.add(emp1);
        
    for(int i=0;i<vv.size();i++)
    {
        Emp emp=(Emp)vv.get(i);
    }
}

class Emp{
...//假设已写好( ̄▽ ̄)"
}
  • Stack
  • HashMap
public static void main(String[] args) {
    Emp emp1=new Emp("sa01","aa",1.2f);//编号,姓名,工资
    Emp emp2=new Emp("sa02","bb",1.2f);
    Emp emp3=new Emp("sa03","cc",1.2f);
    
    //创建一个HashMap对象
    HashMap hm=new HashMap();
        
    //将emp放入hm
    hm.put("sa01",emp1);
    hm.put("sa02", emp2);
    //hm.put("sa02",emp3);//emp3自动覆盖原先的key"sa02"中的value
    hm.put("sa03", emp3);
        
    //如果你要查找编号是sa01
        
    if(hm.containsKey("sa02"))
    {   
        System.out.println("有该员工");
        //如何取出,键k<-->值v
        Emp emp=(Emp)hm.get("sa02");
        System.out.println("名字:"+emp.getName());
        }
        else 
        {
            System.out.println("查无此人");
        }
        
        //遍历HashMap中所有的key和value
        //Iterator迭代
        Iterator it=hm.keySet().iterator();
        //hasNext返回一个boolean
        while(it.hasNext())
        {
            //取出key
            String key=it.next().toString();
            //通过key取出value
            Emp emp=(Emp)hm.get(key);
            System.out.println("名字"+emp.getName());
            System.out.println("工资"+emp.getSal());
        }
}

class Emp{
...//假设已写好( ̄▽ ̄)"
}

7.3 比较

  • ArrayList和Vector的区别

    • 同步性:
      • Vector是同步的。这个类中的一些方法保证了Vextor中的对象是线程安全的。
      • ArrayList是异步的。因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合,那么使用ArrayList可以避免由于同步带来的不必要的性能开销
    • 数据增长:
      • 从内部实现机制来讲,ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度,它们都需要扩展内部数组的长度。
      • Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%
      • 所以如果你要在集合中保存大量的数据,那么使用Vector较好,因为你可以通过设置集合的初始化大小来避免不必要的资源开销
  • HashMap和Hashtable的区别

    • 历史原因:

      • Hashtable是基于陈旧的Dictionary类的
      • HashMap是Java 1.2引进的Map接口的一个实现
    • 同步性:

      • Hashtable是同步的。这个类中的一些方法保证了Hashtable中的对象是线程安全的
      • HashMap是异步的。因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合,那么使用HashMap是一个很好的选择
    • 值:

      • Hashtable不能放入空值(null)
      • HashMap可以让你将空值作为一个表的条目的key或value

7.4 总结

  • 如果要求线程安全:使用Vector、Hashtable
  • 如果不要求线程安全:使用ArrayList、LinkedList、HashMap
  • 如果要求键值对:使用HashMap、Hashtable
  • 如果数据量很大:使用Vector

8. 泛型


  • 基本概念

    • 泛型本质:参数化类型,即所操作的数据类型被指定位一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法

    • 好处:

      • 类型安全:在没有泛型的情况下,通过对类型Object的引用来实现参数的“任意化”。“任意化”的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器不提示错误,在运行的时候才出现异常,这就是个安全隐患。
      • 向后兼容
      • 层次清晰
      • 性能较高:用GJ编写的代码可以为java编译器和虚拟机带来更多的类型信息。这些信息对java程序做进一步优化提高条件

  • 反射机制
    • 通过反射机制,我们可以得到某一类型的很多信息(比如得到成员函数名)

9. 异常


  • 基本概念

    • 当出现程序无法控制的外部环境问题(用户提供的文件不存在、文件内容损坏、网络不可用...)时 ,Java就会用异常对象来描述

  • 异常分类

    • 检查性异常:java.lang.Exception
      • 程序正常,但因为外在的环境条件不满足而引发
    • 运行期异常:java.lang.RuntimeException
      • 意味着程序存在bug,如数组越界、0被除、入参不满足规范... 这类异常需要更改程序来避免,java编译器强制要求处理这类异常
    • 错误:java.lang.Error
      • 少见,也很难通过程序解决。他可能源于程序的bug。但一般更可能源于环境问题,如内存耗尽。错误在程序中无需处理,而由运行环境处理
import java.io.*;
import java.net.*;
public class Demo9_1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //检查异常1.打开文件
        FileReader fr=new FileReader("d:\\aa.text");
        
        //2.连接一个192.168.12.12 ip的端口号4567
        Socket s=new Socket("192.168.12.12",78);
        //运行异常1. 0被除
        int a=4/0;
        
        //2.数组越界
        int arr[]= {1,2,3};
        System.out.println(arr[234]);
    }

}

  • 异常处理

    • 在发生异常的地方直接处理;

      • try...catch 程序运行异常时,将从异常发生点中断程序并向外抛出异常信息
      • finally 如果把finally块置于try...catch语句后,finally块一般都会得到执行。它相当于一个万能的保险。即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行
      • 以下情形,finally块将不会被执行
        • finally块中发生了异常
        • 程序所在线程死亡
        • 在前面的代码中用了System.exit();
        • 关闭CPU
    • 将异常抛给调用者,然调用者处理

      • throws
//直接处理
package com.one_dimensional_array;
import java.io.*;
public class Demo9_1 {

    public static void main(String[] args) {
    
        //检查异常1.打开文件
        FileReader fr=null;
        try {
            System.out.println("go on");
            fr=new FileReader("d:\\aa.txt");
        }catch(Exception e) {
            //把异常的信息输出,利于排错
            System.out.println("111");
            e.printStackTrace(); 
            //System.exit(-1);finally将无机会执行
            //处理 
        }finally{
            System.out.println("进入finally");
            //这个语句块,不管有没有异常,都会被执行
            //把需要关闭的资源,如[文件、链接、内存...]
            if(fr!=null)
            {
                try {
                    fr.close();
                }catch(Exception e) {
                    e.printStackTrace();
                }
            }
            
        System.out.println("aa");
        }
//抛出异常
package com.one_dimensional_array;
import java.io.*;
public class Demo9_2 {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Father father=new Father();
        father.test1();
    }
}

class Father{
    private Son son=null;
    public Father() {
        son=new Son();
    }
    public void test1() throws Exception {
        System.out.println("1");
        son.test2();
/*      try {
            son.test2();
        }catch(Exception e) {
            System.out.println("父亲");
            e.printStackTrace();
        }*/
    }
}

class Son{
    public void test2() throws Exception{
        FileReader fr=null;
        fr=new FileReader("d:\\aa.txt");
    }
}

  1. 持续更新中~笔记记录自韩顺平Java网课

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,343评论 0 2
  • 一.关键字&标识符 1.关键字:被java语言赋予特殊含义的字符串(或单词), 2.保留字:被java语言占用,但...
    RockShi阅读 318评论 0 0
  • 这是我的第一个作品。作者,齐藤英治 著 姚东敏 译本书讲述了,朕只有三十分钟,三十分钟可以阅读一本书,书是仆人,随...
    小胖谈成长阅读 239评论 0 1
  • 叶子写的文章《22岁赚足20万,废材的逆袭之路》,读来洒脱劲道,利落顺畅。观点聚焦,故事生动,言之有物,画龙点睛。...
    哈佛妈妈亲子园阅读 502评论 14 7
  • 液体之火 让你 若梦若醒 飘飘欲仙 让天地颠倒 让世界旋转 把人类历史 浇灌的跌宕起伏 将琴棋书画 熏染的色彩斑斓...
    BLUNBL阅读 706评论 0 0