JAVA基础
JAVA基础
Avices
这个作者很懒,什么都没留下…
展开
-
MySQL的悲观锁和乐观锁
MySQL的悲观锁和乐观锁悲观锁:这个事务不结束,就无法解除对该事务的锁定,别的程序(线程)就无法对该数据库的行级数据进行修改。乐观锁:拥有一个版本号。原创 2021-08-13 11:27:28 · 67 阅读 · 0 评论 -
JDBC的事务机制
JDBC的事务机制JDBC的事务机制:JDBC中的事务是自动提交的,什么事自动提交?只要执行任意一条DML语句,则自动提交一次,这是JDBC默认的事务行为。但是在实际的业务中。通常都是N条DML语句共同联合才能完成的,必须保证他们这些DML语句在同一个事务中同时成功或者同时失败。一下程序先验证JDBC的事务是否是自动提交的。import java.sql.*;public class Test { public static void main(String[] args) {原创 2021-08-13 11:11:11 · 178 阅读 · 0 评论 -
如何SQL注入的问题?
如何SQL注入的问题?只要用户提供的信息不参与SQL语句的编译过程,问题就解决了。即使用户提供的信息中含有SQL语句的关键字,但是没有参与编译,不起作用。要想用户信息不参与SQL语句的编译,那么必须使用java.sql.PreparedStatementPreparedStatement接口继承了java.sql.StatementPreparedStatement是属于预编译的数据库操作对象。PreparedStatement的原理是:预先对SQL语句的框架进行编译,然后再给SQL语句传“值”原创 2021-08-13 10:54:52 · 113 阅读 · 0 评论 -
JDBC概述
JDBC概述JDBC是什么?Java DataBase Connectivity(Java语言连接数据库)JDBC的本质是什么?JDBC是SUN公司制定的一套接口(interface)java.sql.*; (这个软件包下有很多接口。)接口都有调用者和实现者。面向接口调用、面向接口写实现类,这都属于面向接口编程。接口的实现类被称为驱动,例如MySQL驱动。为什么要面向接口编程?解耦合:降低程序的耦合度,提高程序的扩展力。多态机制就是非常典型的:面向抽象编程。(不要面向具原创 2021-08-13 10:53:55 · 71 阅读 · 0 评论 -
Java注解
注解注解,或者叫做注释类型,英文单词是:Annotation注解Annotation是一种引用数据类型。编译之后也是生成xxx.class文件。怎么自定义注解呢?语法格式?[修饰符列表] @interface 注解类型名{}注解怎么使用,用在什么地方?默认情况下,注解可以出现在任意位置。第一:注解使用时的语法格式是:@注解类型名第二:注解可以出现在类上、属性上、方法上、变量上等…注解还可以出现在注解类型上。JDK内置了哪些注解呢?java.lang包下的注原创 2021-08-11 10:14:23 · 114 阅读 · 0 评论 -
反射Constructor类的学习
反射Constructor类的学习常用方法:Constructor<?>[] getDeclaredConstructors() // 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) // 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指原创 2021-08-10 17:21:56 · 169 阅读 · 0 评论 -
反射Method类的学习
反射Method类的学习Java中依靠方法名和参数列表,来区分方法。Method类常用的方法:Method getDeclaredMethods() // 获取所有的方法,其中:包括公共、保护、默认(包)访问和私有方法,返回 Method 对象的一个数组,但不包括继承的方法。Class<?> getReturnType() // 得到Method的返回值类型。Class<?>[] getParameterTypes() // 返回Method的形参,是一个数组Method原创 2021-08-10 17:21:11 · 83 阅读 · 0 评论 -
反射Field类的学习
反射Field类的学习反射属性FieldField翻译为字段,其实就是属性/成员,每一个属性相当于一个Field对象。Field的常用方法:int getModifiers() // 获取属性的修饰符列表,但是返回的是一个整数,需要使用Modifier类的toString方法进行转化。String getSimpleName() // 返回源代码中给出的底层类的简称。Field[] getDeclaredFields() // 获取所有的FieldField[] getFields() //原创 2021-08-10 17:20:27 · 239 阅读 · 0 评论 -
可变长度参数
可变长度参数public static void m1(int... args) {} // int... args 这就是可变长度参数语法是:类型… (注意:一定是3个点。)注意:可变长度参数要求的参数个数是:0~N个。可变长度参数在参数列表中必须在最后一个位置上,而且可变长度参数只能有1个。可变长度参数可以当做一个数组来看待代码示例public class Test { public static void main(String[] args) { m1原创 2021-08-10 17:19:15 · 363 阅读 · 0 评论 -
Java反射机制
反射机制反射机制有什么用?通过java语言中的反射机制可以操作字节码文件。(可以读和修改字节码文件。)通过反射机制可以操作代码片段。(class文件。)可以让程序更加灵活。反射机制的相关类在哪个包下?java.lang.reflect.*;反射机制相关的重要的类有哪些?java.lang.Class:代表整个字节码,代表一个类型,代表整个类。java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。java.lang.reflect.Cons原创 2021-08-10 17:18:13 · 53 阅读 · 0 评论 -
Java类加载器
类加载器什么是类加载器?专门负责加载类的命令/工具。ClassLoaderJDK中自带了3个类加载器启动类加载器:rt.jar扩展类加载器:ext/*.jar应用类加载器:classpath假设有这样一段代码:String str = "abc"; 代码在开始执行之前,会将所需要类全部加载到JVM当中。通过类加载器加载,看到以上代码类加载器会找String.class文件,找到就加载,那么是怎么进行加载的呢?首先通过“启动类加载器”加载。注意:启动类加载器专门加载原创 2021-08-10 17:13:15 · 47 阅读 · 0 评论 -
Java路径的学习
Java路径的学习由于以前用的获取文件路径的方式移植性差,在IDEA中默认的当前路径是Project的根。假设这个代码假设离开了IDEA,换到了其它位置,可能当前路径就不是Project的根了,这时这个路径就无效了。以前获取路径的方式:FileReader reader = new FileReader("classinfo.properties");怎么获取一个文件的绝对路径。以下这种方式是通用的。但前提是:文件需要在类路径下。才能用这种方式。什么类路径下?方式在src下的都是类原创 2021-08-10 17:12:12 · 84 阅读 · 0 评论 -
生产者和消费者模式
Object类中的wait和notify方法。关于Object类中的wait和notify方法。(生产者和消费者模式!)第一:wait和notify方法不是线程对象的方法,是java中任何一个java对象都有的方法,因为这两个方式是Object类中自带的。wait方法和notify方法不是通过线程对象调用,不是这样的:thread.wait(),也不是这样的:thread.notify()…不对。第二:wait()方法作用?Object obj = new Object();obj.wai原创 2021-08-10 09:59:24 · 50 阅读 · 0 评论 -
线程的定时器
定时器定时器的作用:间隔特定的时间,执行特定的程序。在java中可以采用多种方式实现定时器:可以使用sleep方法,睡眠,设置睡眠时间,没到这个时间点醒来,执行任务。这种方式是最原始的定时器。在java的类库中已经写好了一个定时器:java.util.Timer,可以直接拿来用。Timer类的常用方法:Timer() // 创建一个新计时器。Timer(boolean isDaemon) // 创建一个新计时器,可以指定其相关的线程作为守护程序运行。Timer(String nam原创 2021-08-10 09:56:47 · 546 阅读 · 1 评论 -
线程之守护线程
守护线程java语言中线程分为两大类:一类是:用户线程一类是:守护线程(后台线程)其中具有代表性的就是:垃圾回收线程(守护线程)。守护线程的特点:一般守护线程是一个死循环,所有的用户线程只要结束,守护线程自动结束。注意:主线程main方法是一个用户线程。当用户线程结束,守护线程自动终止。守护线程用在什么地方呢?例如:每天00:00的时候系统数据自动备份。这个需要使用到定时器,并且我们可以将定时器设置为守护线程。一直在那里看着,没到00:00的时候就备份一次。所有的用原创 2021-08-09 15:46:11 · 439 阅读 · 0 评论 -
线程的死锁
死锁自己实现的死锁的代码千万不要再程序中这样写,这样很难调试。public class Test { public static void main(String[] args) { Object obj1 = new Object(); Object obj2 = new Object(); // myThread1和myThread2两个线程共享obj1,obj2 Thread myThread1 = new MyThrea原创 2021-08-09 15:44:56 · 36 阅读 · 0 评论 -
线程的调度
线程的调度常见的线程调度模型有哪些?抢占式调度模型:那个线程的优先级比较高,抢到的CPU时间片的概率就高一些/多一些。java采用的就是抢占式调度模型。均分式调度模型:平均分配CPU时间片。每个线程占有的CPU时间片时间长度一样。平均分配,一切平等。有一些编程语言,线程调度模型采用的是这种方式。java中提供了哪些方法是和线程调度有关系的呢?void setPriority(int newPriority) // 设置线程的优先级,是实例方法int getPriori原创 2021-08-09 15:43:17 · 175 阅读 · 1 评论 -
线程生命周期
线程生命周期关于线程对象的生命周期?有五种状态。分别是:新建状态就绪状态运行状态阻塞状态死亡状态原创 2021-08-09 15:42:18 · 36 阅读 · 0 评论 -
线程同步机制synchronized
线程同步机制synchronized如果有一部分代码必须是线程排队的,不能并发。一个线程把这里的代码全部执行结束之后,另一个线程才能进来。需要使用线程同步机制线程同步机制的语法是:使用同步代码块的方式,这种方式比较灵活。修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;synchronized(线程共享对象){ // 线程同步代码块。}在实例方法上使用synchronized,例如:synchronize原创 2021-08-09 15:40:45 · 345 阅读 · 0 评论 -
并发的安全问题概述
并发的安全问题概述什么时候数据在多线程并发的环境下会存在安全问题呢?三个条件:条件1:多线程并发。条件2:有共享数据。条件3:共享数据有修改的行为。满足以上3个条件之后,就会存在线程安全问题。怎么解决线程安全问题呢?当多线程并发的环境下,有共享数据,并且这个数据还会被修改,此时就存在线程安全问题,怎么解决这个问题?线程排队执行。(不能并发)。用排队执行解决线程安全问题。这种机制被称为:线程同步机制。专业术语叫做:线程同步,实际上就是线程不能并发了,线程必须排队执行。原创 2021-08-09 15:39:06 · 612 阅读 · 0 评论 -
创建线程的三种方式
创建线程的两种方式实现线程的第一种方式:编写一个类,直接继承java.lang.Thread,重写run方法。实现线程的第二种方式:编写一个类实现java.lang.Runnable接口。实现run方法。怎么创建线程对象? new就行了。怎么启动线程呢? 调用线程对象的start()方法。注意:第二种方式创建的类不是一个线程类,是一个可运行的类。需要使用Thread类将其转换为一个线程类。注意:亘古不变的道理:方法体当中的代码永远都是自上而下的顺序依次逐行执行的。以下程序的输出结果有这样的特点原创 2021-08-09 09:42:18 · 192 阅读 · 0 评论 -
多线程的常用方法
多线程的常用方法static Thread currentThread() // 返回对当前正在执行的线程对象的引用。String getName() // 返回该线程的名称。void setName(String name) // 改变线程名称,使之与参数 name 相同。static void sleep(long millis) //静态方法,参数是毫秒,让当前线程进入休眠,进入“阻塞状态”,放弃占有CPU时间片,让给其它线程使用。void interrupt() // 中断线程。void原创 2021-08-09 09:40:44 · 111 阅读 · 0 评论 -
多线程概述
多线程概述什么是进程?什么是线程?进程是一个应用程序(1个进程是一个软件)。线程是一个进程中的执行场景/执行单元。一个进程可以启动多个线程。对于java程序来说,当在DOS命令窗口中输入:java HelloWorld 回车之后。会先启动JVM,而JVM就是一个进程。JVM再启动一个主线程调用main方法。同时再启动一个垃圾回收线程负责看护,回收垃圾。最起码,现在的java程序中至少有两个线程并发,一个是垃圾回收线程,一个是执行main方法的主线程。进程和线程是什么关系?举个例子原创 2021-08-09 09:39:39 · 76 阅读 · 0 评论 -
序列化与反序列化
序列化与反序列化Java的接口分为标志接口和普通借口。Serializable接口就是一个标志接口。序列化过程中出现java.io.NotSerializableException;异常,则说明,该类不支持序列化,该类需要实现Serializable接口,这样该类的对象才支持序列化!!!参与序列化和反序列化的对象,必须实现Serializable接口。注意:通过源代码发现,Serializable接口只是一个标志接口:public interface Serializable原创 2021-08-07 11:37:48 · 116 阅读 · 1 评论 -
PrintStream:标准的字节输出流
PrintStream:标准的字节输出流java.io.PrintStream:标准的字节输出流。默认输出到控制台。标准输出流不需要手动close()关闭。标准输出流可以改变输出的方向,向不同的地方进行输出。例如文件中。import java.io.*;public class Test { public static void main(String[] args) throws Exception { // 联合起来写 System.out.printl原创 2021-08-06 11:29:00 · 171 阅读 · 0 评论 -
File类
File类File类和四大家族没有关系,所以File类不能完成文件的读和写。File对象代表什么?文件和目录路径名的抽象表示形式。C:\Drivers 这是一个File对象C:\Drivers\Readme.txt 也是File对象。一个File对象有可能对应的是目录,也可能是文件。File只是一个路径名的抽象表示形式。File类中常用的方法boolean mkdirs() // 可以创建多重目录吗?boolean mkdir() // 创建此抽象路径名指定的目录。Str原创 2021-08-06 11:28:02 · 1549 阅读 · 0 评论 -
FileReader与FileWriter
FileReader与FileWriterFileReader文件字符输入流,只能读取普通文本。读取文本内容时,比较方便,快捷。import java.io.*;public class Test { public static void main(String[] args) { FileReader fr = null; try { // 创建文件字符输入流 fr = new FileReader("D:/原创 2021-08-06 11:26:54 · 62 阅读 · 0 评论 -
数据字节流
数据字节流DataInputStream:数据字节输入流。DataOutputStream写的文件,只能使用DataInputStream去读。并且读的时候你需要提前知道写入的顺序。读的顺序需要和写的顺序一致。才可以正常取出数据。DataOutputStream:数据字节输出流。这个流可以将数据连同数据的类型一并写入文件。注意:这个文件不是普通文本文档。(这个文件使用记事本打不开。)代码示例import java.io.*;public class Test { public st原创 2021-08-06 11:25:44 · 206 阅读 · 0 评论 -
BufferedReader与BufferedWriter
BufferedReader与BufferedWriter当一个流的构造方法中需要一个流的时候,这个被传进来的流叫做:节点流。外部负责包装的这个流,叫做:包装流/处理流。BufferedReader带有缓冲区的字符输入流。使用这个流的时候不需要自定义char数组,或者说不需要自定义byte数组。自带缓冲。BufferedReader:带有缓冲的字符输入流。InputStreamReader:转换流代码示例import java.io.*;public class Test { pub原创 2021-08-06 11:24:54 · 578 阅读 · 0 评论 -
FileOutputStream
FileOutputStream文件字节输出流,负责写。从内存到硬盘。import java.io.*;public class Test { public static void main(String[] args) { FileOutputStream fos = null; try { // myfile文件不存在的时候会自动新建! // 这种方式谨慎使用,这种方式会先将原文件清空,然后重新写入。原创 2021-08-06 11:24:03 · 113 阅读 · 0 评论 -
FileInputStream
FileInputStream文件字节输入流,万能的,任何类型的文件都可以采用这个流来读。以字节的方式,完成输入的操作,完成读的操作(硬盘—> 内存)FileInputStream类的其它常用方法:int read() // 从此输入流中读取一个数据字节。int read(byte[] b) // 从此输入流中将最多 b.length个字节的数据读入一个byte 数组中。int read(byte[] b, int off, int len) // 从此输入流中将最多 len 个字节的数据读原创 2021-08-06 11:22:47 · 96 阅读 · 0 评论 -
IO流概述
IO流概述IO流,什么是IO?I : Input,O : Output。通过IO可以完成硬盘文件的读和写。IO流的分类?一种方式是按照流的方向进行分类:以内存作为参照物,往内存中去,叫做输入(Input)。或者叫做读(Read)。从内存中出来,叫做输出(Output)。或者叫做写(Write)。另一种方式是按照读取数据方式不同进行分类:有的流是按照字节的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位。这种流是万能的,什么类型的文件都可以读取。包括:文原创 2021-08-06 11:15:29 · 60 阅读 · 0 评论 -
TreeSet集合
TreeSet集合TreeSet集合存储元素特点:无序不可重复的,但是存储的元素可以自动按照大小顺序排序!称为:可排序集合。无序:这里的无序指的是存进去的顺序和取出来的顺序不同。并且没有下标。TreeSet集合底层实际上是一个TreeMap,TreeMap集合底层是一个二叉树。放到TreeSet集合中的元素,等同于放到TreeMap集合key部分了。编写程序从数据库当中取出数据,在页面展示用户信息的时候按照生日升序或者降序。这个时候可以使用TreeSet集合,因为TreeSet集合原创 2021-08-04 13:51:35 · 567 阅读 · 0 评论 -
Collections集合工具类
Collections集合工具类java.util.Collection 集合接口java.util.Collections 集合工具类,方便集合的操作。常用方法Collections.synchronizedList(); // 变成线程安全的 Collections.sort(list); // 对list进行排序,前提是必须实现compareTo方法。代码示例import java.util.*;public class Test { public static void m原创 2021-08-04 13:08:47 · 51 阅读 · 0 评论 -
Properties属性类
Properties属性类Properties是一个Map集合,继承Hashtable,Properties的key和value都是String类型。Properties被称为属性类对象。Properties是线程安全的。两个方法:setProperty(String key, String value); // 存入数据。getProperty(String key) // 根据key取出相应的内容。代码示例import java.util.*;public class Test原创 2021-08-04 13:07:49 · 323 阅读 · 0 评论 -
Hashtable与HashMap的区别
Hashtable与HashMap的区别Hashtable的key可以为null吗?Hashtable的key和value都是不能为null的。HashMap集合的key和value都是可以为null的。Hashtable方法都带有synchronized:线程安全的。线程安全有其它的方案,这个Hashtable对线程的处理导致效率较低,使用较少了。Hashtable和HashMap一样,底层都是哈希表数据结构。Hashtable的初始化容量是11,默认加载因子是:0.75f,Hashtab原创 2021-08-04 12:44:39 · 68 阅读 · 0 评论 -
HashMap集合
HashMap集合HashMap集合底层是哈希表/散列表的数据结构。哈希表是一个怎样的数据结构呢?哈希表是一个数组和单向链表的结合体。数组:在查询方面效率很高,随机增删方面效率很低。单向链表:在随机增删方面效率较高,在查询方面效率很低。哈希表将以上的两种数据结构融合在一起,充分发挥它们各自的优点。哈希表/散列表:一维数组,这个数组中每一个元素是一个单向链表。(数组和链表的结合体。)HashMap集合底层的源代码:public class HashMap extends Ab原创 2021-08-03 17:51:16 · 121 阅读 · 0 评论 -
Map接口
Map接口Map和Collection没有继承关系。Map集合以key和value的方式存储数据:键值对key和value都是引用数据类型。key和value都是存储对象的内存地址。key起到主导的地位,value是key的一个附属品。Map接口中常用方法:V put(K key, V value) // 向Map集合中添加键值对,V是Value的意思V get(Object key) // 通过key获取valuevoid clear() // 清空Map集合boolean原创 2021-08-03 12:01:51 · 66 阅读 · 0 评论 -
HashSet集合
HashSet集合HashSet集合:无序不可重复。无序:存储时顺序和取出的顺序不同。不可重复。放到HashSet集合中的元素实际上是放到HashMap集合的key部分了。代码示例import java.util.*;public class Test { public static void main(String[] args) { Set<String> stringSet = new HashSet<>();原创 2021-08-02 21:30:34 · 48 阅读 · 0 评论 -
foreach的学习
foreach的学习增强for(foreach)语法for(元素类型 变量名 : 数组或集合){ System.out.println(变量名);}代码示例import java.util.*;public class Test { public static void main(String[] args) { // int类型数组 int[] arr = {1314,521,100}; // 遍历数组(普通for循环)原创 2021-08-02 21:15:59 · 48 阅读 · 0 评论