java(杂记)

“开发工具”是JDK内容,公共JRE就是Java运行环境
安装完后,需要设置JAVA_HOME环境变量,指向JDK目录,很多Java工具运行都需要的JAVA_HOME环境变量
将JDK\bin目录添加到Path环境变量中,这样在任何路径下都可以执行JDK提供的工具指令。在Path后添加 %JAVA_HOME%\bin

基本类型表示简单的数据,基本类型分为4大类,共8种数据类型。

  • 整数类型:byte、short、int和long
  • 浮点类型:float和double
  • 字符类型:char
  • 布尔类型:boolean

在Java中除了8种基本数据类型外,其他数据类型全部都是引用(reference)数据类型,引用数据类型用了表示复杂数据类型,包含:类、接口和数组声明的数据类型。

  • 分支语句:if和switch
  • 循环语句:while、do-while和for
  • 跳转语句:break、continue、return和throw

类成员的访问控制:
image

类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性。一个对象的生命周期包括三个阶段:创建、使用和销毁
一个引用变量没有通过new分配内存空间,这个对象就是空对象,Java使用关键字null表示空对象。
String name = null;

Java构造方法的特点:

  1. 构造方法名必须与类名相同。
  2. 构造方法没有任何返回值,包括void。
  3. 构造方法只能与new运算符结合使用。

需要在运行时判断一个对象是否属于某个引用类型,这时可以使用instanceof运算符
发生多态要有三个前提条件:

  1. 继承。多态发生一定要子类和父类之间。
  2. 覆盖。子类覆盖了父类的方法。
  3. 声明的变量类型是父类类型,但实例则指向子类实例。

设计良好的软件系统应该具备“可复用性”和“可扩展性”,能够满足用户需求的不断变更。使用抽象类和接口是实现“可复用性”和“可扩展性”重要的设计手段。

有两种比较方法:==运算符和equals()方法,==运算符是比较两个引用变量是否指向同一个实例,equals()方法是比较两个对象的内容是否相等

在Java中8种基本数据类型不属于类,不具备“对象”的特征,没有成员变量和方法,不方便进行面向对象的操作。为此,Java提供包装类(Wrapper Class)来将基本数据类型包装成类,每个Java基本数据类型在java.lang包中都有一个相应的包装类,每个包装类对象封装一个基本数据类型数值。
image
包装类都是final的,不能被继承。包装类都是不可变类,类似于String类,一旦创建了对象,其内容就不可以修改。

List集合中的元素是有序的,可以重复出现。List接口的实现类有:ArrayList 和 LinkedList。ArrayList是基于动态数组数据结构的实现,LinkedList是基于链表数据结构的实现。ArrayList访问元素速度优于LinkedList,LinkedList占用的内存空间比较大,但LinkedList在批量插入或删除数据时优于ArrayList。

 public static void main(String[] args) {

        List list = new ArrayList();

        String b = "B";
        // 向集合中添加元素
        list.add("A");
        list.add(b);
        list.add("C");
        list.add(b);
        list.add("D");
        list.add("E");

        // 1.使用for循环遍历
        System.out.println("--1.使用for循环遍历--");
        for (int i = 0; i < list.size(); i++) {
            System.out.printf("读取集合元素(%d): %s \n", i, list.get(i));      ①
        }

        // 2.使用for-each循环遍历
        System.out.println("--2.使用for-each循环遍历--");
        for (Object item : list) {                                 ②
            String s = (String) item;                              ③
            System.out.println("读取集合元素: " + s);
        }

        // 3.使用迭代器遍历
        System.out.println("--3.使用迭代器遍历--");
        Iterator it = list.iterator();                             ④
        while (it.hasNext()) {                                     ⑤
            Object item = it.next();                               ⑥
            String s = (String) item;                              ⑦
            System.out.println("读取集合元素: " + s);
        }
    }

Set集合是由一串无序的,不能重复的相同类型元素构成的集合。Set接口直接实现类主要是HashSet,HashSet是基于散列表数据结构的实现。

public static void main(String[] args) {

        Set set = new HashSet();

        String b = "B";
        // 向集合中添加元素
        set.add("A");
        set.add(b);
        set.add("C");
        set.add(b);
        set.add("D");
        set.add("E");

        // 1.使用for-each循环遍历
        System.out.println("--1.使用for-each循环遍历--");
        for (Object item : set) {
            String s = (String) item;
            System.out.println("读取集合元素: " + s);
        }

        // 2.使用迭代器遍历
        System.out.println("--2.使用迭代器遍历--");
        Iterator it = set.iterator();
        while (it.hasNext()) {
            Object item = it.next();
            String s = (String) item;
            System.out.println("读取集合元素: " + s);
        }
    }

Map(映射)集合表示一种非常复杂的集合,允许按照某个键来访问元素。Map集合是由两个集合构成的,一个是键(key)集合,一个是值(value)集合。键集合是Set类型,因此不能有重复的元素。而值集合是Collection类型,可以有重复的元素。Map集合中的键和值是成对出现的。Map接口直接实现类主要是HashMap,HashMap是基于散列表数据结构的实现。

public static void main(String[] args) {

        Map map = new HashMap();                ①

        map.put(102, "张三");
        map.put(105, "李四");                    ②
        map.put(109, "王五");
        map.put(110, "董六");
        //"李四"值重复
        map.put(111, "李四");                    ③
        //109键已经存在,替换原来值"王五"
        map.put(109, "刘备");                    ④


        // 打印集合元素个数
        System.out.println("集合size = " + map.size());
        // 打印集合
        System.out.println(map);

        // 通过键取值
        System.out.println("109 - " + map.get(109));    ⑤
        System.out.println("108 - " + map.get(108));    ⑥

        // 删除键值对
        map.remove(109);
        // 判断键集合中是否包含109
        System.out.println("键集合中是否包含109:" + map.containsKey(109));
        // 判断值集合中是否包含 "李四"
        System.out.println("值集合中是否包含:" + map.containsValue("李四"));

        // 判断集合是否为空
        System.out.println("集合是空的:" + map.isEmpty());

        // 清空集合
        map.clear();
        System.out.println(map);
    }
public static void main(String[] args) {

        Map map = new HashMap();

        map.put(102, "张三");
        map.put(105, "李四");
        map.put(109, "王五");
        map.put(110, "董六");
        map.put(111, "李四");

        // 1.使用for-each循环遍历
        System.out.println("--1.使用for-each循环遍历--");
        // 获得键集合
        Set keys = map.keySet();                                    ①
        for (Object key : keys) {
            int ikey = (Integer) key; // 自动拆箱                   ②
            String value = (String) map.get(ikey); // 自动装箱      ③
            System.out.printf("key=%d - value=%s \n", ikey, value);
        }

        // 2.使用迭代器遍历
        System.out.println("--2.使用迭代器遍历--");
        // 获得值集合
        Collection values = map.values();                           ④
        // 遍历值集合
        Iterator it = values.iterator();
        while (it.hasNext()) {
            Object item = it.next();
            String s = (String) item;
            System.out.println("值集合元素: " + s);
        }

    }

一般可以在同一时间内执行多个程序的操作系统都有进程的概念。一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源。在进程的概念中,每一个进程的内部数据和状态都是完全独立的。在Windows操作系统中一个进程就是一个exe或者dll程序,它们相互独立,互相也可以通信,
线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序控制的流程,但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源。所以系统在各个线程之间切换时,开销要比进程小的多,正因如此,线程被称为轻量级进程。一个进程中可以包含多个线程。
Java程序至少会有一个线程,这就是主线程,程序启动后是由JVM创建主线程,程序结束时由JVM停止主线程。主线程它负责管理子线程,即子线程的启动、挂起、停止等等操作。

Java SE提供java.net包,其中包含了网络编程所需要的最基础一些类和接口。这些类和接口面向两个不同的层次:基于Socket的低层次网络编程和基于URL的高层次网络编程,所谓高低层次就是通信协议的高低层次,Socket采用TCP、UDP等协议,这些协议属于低层次的通信协议;URL采用HTTP和HTTPS这些属于高层次的通信协议。低层次网络编程,因为它面向底层,比较复杂,但是“低层次网络编程”并不等于它功能不强大。恰恰相反,正因为层次低,Socket编程与基于URL的高层次网络编程比较,能够提供更强大的功能和更灵活的控制,但是要更复杂一些。
网络通信会用到协议,其中TCP/IP协议是非常重要的。TCP/IP协议是由IP和TCP两个协议构成的,IP(Internet Protocol)协议是一种低级的路由协议,它将数据拆分成许多小的数据包中,并通过网络将它们发送到某一特定地址,但无法保证都所有包都抵达目的地,也不能保证包的顺序。

由于IP协议传输数据的不安全性,网络通信时还需要TCP协议,传输控制协议(Transmission Control Protocol,TCP)每台计算机都必须有一个与众不同的标识,这就是IP地址,TCP/IP使用IP地址来标识源地址和目的地址。最初所有的IP地址都是32位数字构成,由4个8位的二进制数组成,每8位之间用圆点隔开,如:192.168.1.1,这种类型的地址通过IPv4指定。而现在有一种新的地址模式称为IPv6,IPv6使用128位数字表示一个地址,分为8个16位块。是一种高层次的协议,面向连接的可靠数据传输协议,如果有些数据包没有收到会重发,并对数据包内容准确性检查并保证数据包顺序,所以该协议保证数据包能够安全地按照发送时顺序送达目的地。
在IPv4地址模式中IP地址分为A、B、C、D和E等5类。

  • A类地址用于大型网络,地址范围:1.0.0.1~126.155.255.254。
  • B类地址用于中型网络,地址范围:128.0.0.1~191.255.255.254。
  • C类地址用于小规模网络,192.0.0.1~223.255.255.254。
  • D类地址用于多目的地信息的传输和作为备用。
  • E类地址保留仅作实验和开发用。

TCP/IP系统中的端口号是一个16位的数字,它的范围是0~65535。小于1024的端口号保留给预定义的服务,如HTTP是80,FTP是21,Telnet是23,Email是25等,除非要和那些服务进行通信,否则不应该使用小于1024的端口。
TCP/IP协议的传输层有两种传输协议:TCP(传输控制协议)和 UDP(用户数据报协议)。TCP是面向连接的可靠数据传输协议。TCP就像好比电话,电话接通后双方才能通话,在挂断电话之前,电话一直占线。TCP连接一旦建立起来,一直占用,直到关闭连接。另外,TCP为了保证数据的正确性,会重发一切没有收到的数据,还会对进行数据内容进行验证,并保证数据传输的正确顺序。因此TCP协议对系统资源的要求较多。

public static void main(String[] args) {

        System.out.println("客户端运行...");

        try ( // 向本机的8080端口发出请求
                Socket socket = new Socket("127.0.0.1", 8080);         ①
                // 由Socket获得输出流,并创建缓冲输出流
                BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());②
                // 创建文件输入流
                FileInputStream fin = new FileInputStream("./TestDir/coco2dxcplus.jpg");
                // 由文件输入流创建缓冲输入流
                BufferedInputStream in = new BufferedInputStream(fin)) {

            // 准备一个缓冲区
            byte[] buffer = new byte[1024];
            // 首次读取文件
            int len = in.read(buffer);
            while (len != -1) {
                // 数据写入Socket
                out.write(buffer, 0, len);
                // 再次读取文件
                len = in.read(buffer);
            }

            System.out.println("上传成功!");

        } catch (ConnectException e) {                                 ③
            System.out.println("服务器未启动!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

UDP(用户数据报协议)就像日常生活中的邮件投递,是不能保证可靠地寄到目的地。UDP是无连接的,对系统资源的要求较少,UDP可能丢包不保证数据顺序。但是对于网络游戏和在线视频等要求传输快、实时性高、质量可稍差一点的数据传输,UDP还是非常不错的。

UDP Socket网络编程比TCP Socket编程简单多,UDP是无连接协议,不需要像TCP一样监听端口,建立连接,然后才能进行通信。

反射(Reflection)是程序的自我分析能力,通过反射可以确定类有哪些方法、有哪些构造方法以及有哪些成员变量。Java语言提供了反射机制,通过反射机制能够动态读取一个类的信息;能够在运行时动态加载类,而不是在编译期。反射可以应用于框架开发,它能够从配置文件中读取配置信息动态加载类、创建对象,以及调用方法和成员变量。

在编程实现数据库连接时,JVM必须先加载特定厂商提供的数据库驱动程序。使用Class.forName()方法实现驱动程序加载过程
java.sql.Connection接口的实现对象代表与数据库的连接,也就是在Java程序和数据库之间建立连接。
java.sql.Statement称为语句对象,它提供用于向数据库发出SQL语句,并且访问结果。Connection接口提供了生成Statement的方法,一般情况下可以通过connection.createStatement()方法就可以得到Statement对象。
在Statement执行SQL语句时,如果是SELET语句会返回结果集,结果集通过接口java.sql.ResultSet描述的,它提供了逐行访问结果集的方法,通过该方法能够访问结果集中不同字段的内容。

你可能感兴趣的:(java)