loading...

2

java 语言从零学习

java读完大概需要31分钟

  • 发布时间:2019-02-18 22:07 星期一
  • 刘伟波
  • 824
  • 更新于2019-05-16 18:07 星期四

java介绍

三种技术架构

  1. J2EE(JAVAEE)Java5.0版本后改名的JAVAEE
  2. J2SE(JAVASE)
  3. J2ME(JAVAME)

特点

因为有了JVM(JAVA虚拟机),同一个java程序,跨平台 win(微软公司,c++写的)、linuxmac
编译:javac -encoding UTF-8 .\demo.java 报错加上 -encoding UTF-8
运行:java Demo

环境搭建

  • JRE(java运行环境,虚拟机、核心类库等)
  • JDK(java开发工具包,包括了JRE,编译工具,打包工具)
  • 环境变量

简单来讲:使用JDK开发完成的java程序,交给JRE去运行

hello world

临时变量 classpath hellow world

进制

1byte(字节B) = 8个二进制位 (bit位b)

计算机存储器最小单位是字节(Byte),缩写为大写的B,1个字节等于8位(bit),位缩写为小写的b。在存储一个字符时,一个字符至少釆用8位存储,如大写的A:编码为01000001,8位即一个字节,故可说成一个字符用一个字节存储,所以存储器小单位是字节(Byte)容量的最小单位是位(bit)

  • 10进制:752 = 7*10(2) + 5 *10(1) + 2 * 10(0)
  • 2进制: 1011 = 1*2(0) + 1 * 2(1) + 0 * 2(2) + 1 * 2(3) 2进制, 1011 代表 1 + 2 + 0 + 8 = 11
  • 8进制
    1010-1110 三个为一个 最大为7 满8进1,分析:
    010-101-110
    2 5 6 八进制表示 0256
  • 16进制
    1010-1110 四个为一个 最大为15 满16进1,分析:
    10 14 十六进制表示 0xAE

结论:
八进制数,其实就是二进制位 3个二进制位一个八进制位 111为7
十六进制,其实就是二进制中的四个二进制位为一个十六进制 1111为15
为何没有32进制 因为英文字母最多26个,多了 表示太多了

10进制转二进制,除以2,从下向上,看余数。
http://images.liuweibo.cn/image/common/10进制转二进制_1551279895387_18518_1551279900778.png

  • 负数二进制 最高位为1
    http://images.liuweibo.cn/image/common/负数二进制_1551364761170_12906_1551364766667.png

变量

基本类型:byte,short,int,long, float,double,char,boolean
引用类型:calss,interface,[]

计算

  • 默认int 两个int变量相加 默认会转换 最大值2的32次方减1
  • 两个byte类型变量相加可能会损失精度 -128~127之间
  • 赋值动作会默认强制转换
class Operate {
    public static void main(String[] args){
        short x = 3;
        //x += 4; //7   先计算 底层会默认计算,相当于 x = (short)(x + 4); // 强制转换
        x = x + 4; //  x是不确定变量 报错
        System.out.println(x);
    }
}

https://github.com/Weibozzz/java-study/commit/77a811b6f8863e666dac005bd1dd7f5715984013

逻辑运算符

逻辑运算

  • &:且(两边都运算)
  • &&: (左边为假,右边不运算),结果都一样
  • |:或
  • ||:(左边为真,右边不运算),结果都一样
  • ^: 异或(符号两边结果一样为false)
  • !:非

位运算

指的是二进制

http://images.liuweibo.cn/image/common/位运算_1551796590440_144822_1551796717082.png

左移
3 << 2 =12 相当于 3 * 2(2) = 12;

http://images.liuweibo.cn/image/common/左右移_1551797265128_297511_1551797272435.png

https://github.com/Weibozzz/java-study/commit/63eb2f805178de73029069a96d4b30a9271c70ed

数组应用

http://images.liuweibo.cn/image/common/array进制计算_1552638384346_29449_1552638436258.png

进制转换

https://github.com/Weibozzz/java-study/commit/a49a1b2af5ccc992265f2db4ab5673b8041bd826
10进制转换16进制:60=》3C

http://images.liuweibo.cn/image/common/array进制计算_1552638384346_29449_1552889597183.png

class ArrayDemo{
    /**
    获取一个整数的16进制的表现形式
     */
    public static void main(String[] args){
        toBinary(-6);
        System.out.println(Integer.toBinaryString(-6));
    }
    // 十进制-->十六进制
    public static void toHex(int num){
        trans(num, 15 ,4);
    }
    // 十进制-->二进制
    public static void toBinary(int num){
        trans(num, 1, 1);
    }
    // 十进制-->八进制
    public static void toOctal(int num){
        trans(num, 7, 3);
    }
    public static void trans(int num, int base, int offset){
        if(num==0){
            System.out.println("0");
            return;
        }
        char[] chs = {'0','1','2','3',
                        '4','5','6','7',
                        '8','9','A','B',
                        'C','D','E','F'};
        char[] arr =new char[32];
        int pos = arr.length;
        while(num!=0){
            int temp = num& base;
            arr[--pos] = chs[temp];
            num = num >>> offset;
        }
        System.out.println("pos="+pos);
        for (int i =pos;i<arr.length;i++){
            System.out.print(arr[i]);
        }
        System.out.println();
    }
}

面向对象

demo1

面向对象

demo2

引用数据类型参数引用 会改变原来

demo3

封装 private

demo4

构造函数

demo5

static 外部也可以访问 不在栈和堆存储,在方法区存储,也叫对象方法共享数据. 静态方法只能访问静态成员

demo6

主函数

/**
 * public:因为权限必须是最大的
 * static:不需要对象的,直接用珠海市所属类名调用即可
 * main:函数名,还是关键字,只是一个jvm识别的固定的名字
 * string[] args:这是主函数的参数列表,而且元素都是字符串类型 运行的时候可以
 * 带上参数 如:java MainDemo haha lili 
 */
class MainDemo {
    public static void main(String[] args){ // new String[0]
        System.out.println(args); // [Ljava.lang.String;@15db9742
        // System.out.println(args[0]);
        // System.out.println(args);

    }
}

https://github.com/Weibozzz/java-study/commit/35b46c4a0afced3f580f13a84dcef3b28a8bfa83

demo7

  • 静态代码块。作用:用于给类初始化
  • 构造代码块。可以给所有对象初始化

demo8

静态基本使用 工具类的提出,privite私有的使用,文档注释javadoc

demo9

设计模式 单例

class Single{// 类一加载,对象就已经存在了
    private static Single s = new Single();
    private Single(){};
    public static Single getInstance(){
        return s;
    }
}
class Single2{// 类加载进来,没有对象,只有调用了getInstance方法,才会创建对象
                // 延迟加载形式 懒汉式
    private static Single s = null;
    private Single(){};
    public static Single getInstance(){
        if(s == null){
            return s =  new Single2();
        }
        return s;
    }
}
class SingleDemo{
    public static void main(String[] args){
        Single ss = Single.getInstance();
    }
}

https://github.com/Weibozzz/java-study/commit/214bd323a6a99e71176d9b3e0e0371ee341d745b

demo10

基本继承 单继承 多继承

demo11

  • this代表本类
  • super代表父类
  • 相同变量或者方法,子类权限必须大于等于父类权限,才会覆盖父类方法
  • 静态子涵覆盖静态,或被静态覆盖
  • 继承 // super() // 默认调用父类 super()

demo12

final关键字

  • 继承弊端:因为会覆盖,打破封装性
  • final 是一个修饰符,可以修饰类,方法,变量
  • final 修饰的方法不可以被覆盖
  • final 修饰的变量是一个常量,只能赋值一次

demo13

抽象类 例子

demo14

接口 interface

  • 接口的成员都是公共的权限。
  • 修饰符可以省略,interface权限会自动加上去,但是不建议,阅读性不强

demo15

实现 implements

demo16

多实现

  • java多继承记性了改良,变为了多实现

demo17

实现继承的例子

demo18

多态:类型转换 转型

demo19

https://github.com/Weibozzz/java-study/commit/3ddb215d420f5ad8735d44fa399c59ea34aa19cf

https://github.com/Weibozzz/java-study/commit/6207c442d3ab1366fa04f9d905bb000b95f38b6d
多态:类型转换 转型

  • 1.成员变量
  • 编译时:参考引用类型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
  • 运行时:参考引用类型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
  • 简单说:编译和运行都参考等号的左边
  • 2.成员函数
  • 编译时:参考引用类型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
  • 运行时:参考的是对象所属的类中是否有调用的函数
  • 简单说:编译看等号的左边,运行看右边
  • 3.静态函数
  • 编译时:参考引用类型变量所属的类中的是否有调用的静态方法
  • 运行时:参考引用类型变量所属的类中的是否有调用的静态方法
  • 简单说:编译和运行都参考等号的右边
  • 其实对于静态方法,是不需要对象的,直接调用类名即可。

demo20

内部类:生成Outer$Inner.class

demo21

https://github.com/Weibozzz/java-study/commit/38a3d62396255718fb96772e499e5294e754718a

demo22

https://github.com/Weibozzz/java-study/commit/323717f0cbac20ccbd56d4e572a791836b540680

  • 面向对象(Object类-equals方法覆盖)
  • 03-面向对象(Object类-hashCode方法)
  • 04-面向对象(Object类-getClass方法)
  • 05-面向对象(Object类-toString方法)

内部类:

  • 直接访问外部类中的内部类中的成员
  • 如果内部类是静态的 相当于外部的

error

demo1

异常处理
java文档
https://github.com/Weibozzz/java-study/commit/6e1467ff6cf413ef472cf45cea68c129152d6486

https://github.com/Weibozzz/java-study/commit/4c95ce4bd82523a3473085411243c8ad88f989e5

demo2

自定义异常,要么继承Exception,要么继承RuntimeException

demo3

异常处理的捕捉形式 try{}catch(){}finally{}

demo4

异常例子
https://github.com/Weibozzz/java-study/commit/121ebe1a8d1678a4bd399704f6b043ed6bfe0364
异常例子改进

ticket

多线程买票实例

demo1

单线程实例
https://github.com/Weibozzz/java-study/commit/2b1f118d3b7905384ccb07bb6913ab9a8d47f19a

demo2

单线程实例=》多线程
https://github.com/Weibozzz/java-study/commit/a0c027920c8fb9f7bf19f274795d0e9294533575

demo3

https://github.com/Weibozzz/java-study/commit/6a067a1614bb5ed28107f8755fede37fc06b77a1

多线程安全问题demo=>过同步代码块解决这个问题 synchronized

多线程安全问题demo

  • 产生原因一个线程没结束,另外一个进行了运算
    -解决办法使用同步
    • 弊端:相对降低了效率,因为同步外的线程都会判断同步锁
    • 前提:必须右多个线程并使用同一个锁

demo5

线程安全例子示例

  • 同步函数的锁是this
  • 同步代码块的锁是任意的对象

包 package

demo1

包的基础使用

thread 多线程通信

多线程详细看 ticket 卖票示例

demo1

多线程通信示例

demo2 多线程示例生产者消费者

多线程示例生产者消费者

  • 多生产者,多消费者的问题
  • if判断标记,只有一次,会导致不该运行的线程运行,出现了错误的情况
  • while判断标记,解决了线程执行权后,是否要运行
  • notify:只能唤醒一个线程,如果只唤醒了本方就没有意义,而且while判断标记+notify会导致死锁。
  • notifyAll:本线程一定会唤醒对方线程

dk1.5以后

  • await();
  • signal();
  • signalAll();

线程停止方式

  1. 控制循环结束标记
  2. 可以使用interrupt()方法将线程从冻结强制恢复到运行状态

String

StringBuffer

特点

  • 长度是可变的
  • 可以存储不同类型的数据
  • 最终要变成字符串进行处理
  • 可以对字符串进行修改

StringBuilder

和 StringBuffer 是一样的,不过 StringBuffer 是同步的,更安全。
StringBuilder的StringBuilder不能安全使用多线程。 如果需要同步, 那么建议使用StringBuffer 。

java.long

  • String()
  • String(byte[] bytes)
  • String(byte[] bytes, int offset, int length)
  • String(char[] value)

demo1 按照字典排序

练习 按照字典排序

demo2 一个字符串在整数中出现的次数

练习

基本包装类型

  • Byte
  • Short
  • Integer
  • Long
  • Float
  • Double
  • Character
  • Boolean

之间的转化

基本类型=》字符串

  1. 基本类型+ """
  2. 用String类中的静态方法valueOf(基本类型数值)

字符串=》基本类型

  1. 使用 xxx parseXxx ("xxx类型的字符串);
  2. 使用intValue()将一个Integer对象转为基本类型
int parseInt("123");
long parseLong
boolean parseBoolean
//只有Character没有parse方法

进制转换

  • toBinaryString(int i)
  • toHexString(int i)
  • toOctalString(int i)
  • toString(int i, int radix)
  • parseInt(String s, int radix) // 其他进制转为十进制

自动装箱

demo1 演示自动装箱

例子

demo1 字符串数组排序

  • StringBuilder
  • append
  • toString
  • parseInt
  • split

map

集合特点

  • 用于存储对象到容器
  • 集合的长度是可变的
  • 集合中不可以存储基本数据类型

collection的常见方法

  • 添加

    • boolean add(object obj)
    • boolean addAll(Collection coll)
  • 删除

    • boolean remove(object obj)
    • boolean removeAll(Collection coll)
    • void clear();
  • 判断

    • boolean contains(object obj)
    • boolean containsAll(Collection coll)
    • boolean isEmpty()
  • 获取

    • int size() 获取元素个数
    • Iterator iterator() 迭代器
  • 其他

    • boolean retainAll(Collection<?> c) 取交集
    • Object[] toArray() 将集合转化为数组
  • Collection

    • List 有序,存入和取出的顺序一致,元素都有索引,元素可以重复
    • Set 无序,元素不能重复
      • HashSet:内部数据结构是哈希表,是不同步的,方法和Collection一样,只有Iterator迭代器
        • linkedHashSet: 有序的
      • TreeSet:可以对set集合中的元素进行排序,是不同步的
        判断元素惟一的方式就是根据比较方法的返回值是否是0,是0就是相同元素,不存
        让元素自身具备比较功能,元素就需要实现comparable接口,覆盖compareTo方法
        如果不按照自然排序,可以使用TreeSet集合第二种排序,让集合自身具备功能,
        定义一个实现Comparator接口,覆盖compare方法。
        将该类对象作为参数传递给TreeSet集合的构造函数

demo1 Collection集合演示1

demo2 List 演示

  • 添加
    • void add(index,element)
    • void add(index,collection)
  • 删除
    • Object remove(index)
  • 修改
    • Object set(index,element)
  • 获取
    • Object get(index)
    • int indexOf(Object)
    • lastIndex(Object)

List集合是可以完成对元素的增删改查

  • Vector 内部是数组数据结构,是同步的,增删查询都很慢!
  • ArrayList 内部是素组的数据结构,是不同步的,替代了Vector。查询的速度快
  • LinkedList 内部是链表结构,是不同步的,增删很快,查询慢

demo3 演示Iterator 和 ListIterator<E>

  • iterate遍历的同时不能add,用ListIterator<E>代替

    demo4 演示Vector

  • Vector jdk1.0 之后被Iterator替代

demo5 演示LinkedList

  • addFirst

  • addLast jdk1.6

  • offsetFirst

  • offsetLast

  • getFirst // 获取但不移除,如果为空,报出异常NoSuchElementException

  • getLast jdk1.6

  • peekFirst // 获取但不移除,如果为空,返回null

  • peekLast

  • removeFirst

  • isEmpty

    demo6 演示ArrayList

  • 提升的Object要转为Persion对象

    demo7 演示TreeSet

  • 字符串比较是按照字典比较的

  • 复写java.lang.ComparablecompareTo方法, 字典比较字符串

    demo8 演示TreeSet集合第二种排序,让集合自身具备功能

  • 构造一个新的,空的树集,根据指定的比较器进行排序。

--
作者:刘伟波

链接:http://www.liuweibo.cn/p/247

来源:刘伟波博客

本文原创版权属于刘伟波 ,转载请注明出处,谢谢合作

你可能感兴趣的文章

    发表评论

    评论支持markdown,评论内容不能超过500字符
    关于技术问题或者有啥不懂的都可以来 我的视频空间 提问, 推荐作者总结知识点 前端知识体系, 感謝支持!