![](https://img-blog.csdnimg.cn/20210223154102861.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
java
javase理论/代码
永不落后于人
永远相信美好的事情即将发生
展开
-
Java中的多态和Scala中多态的对比
JavaJava多态属性是静态绑定的(编译器绑定),方法是动态绑定的(运行期绑定)。运行时,属性输出的是父类的值,方法运行的是子类的方法。即编译看左边,运行看右边。Java多态不能访问子类特有的属性和方法。ScalaScala多态属性和方法都是动态绑定的。运行时,属性和方法都是子类的。Java多态同样不能访问子类特有的属性和方法。Java代码public class Java02_Dynamic { public static void main(String[] args)原创 2021-03-08 10:49:25 · 142 阅读 · 1 评论 -
Maven配置Spring MVC项目
1. 新建maven项目,注意选择war包方式。2. 调出web.xml文件。具体方法可以参考这篇文章:https://blog.csdn.net/FlatTiger/article/details/1136241173. 配置pom文件,加入spring mvc的依赖。<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:s原创 2021-02-05 16:00:37 · 451 阅读 · 1 评论 -
以注解的方式配置Spring项目
1. 创建Maven工程,导入pom文件中Spring-Context依赖。<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <原创 2021-02-04 16:25:51 · 170 阅读 · 0 评论 -
以xml方式的配置Spring项目
1. 创建Maven工程,导入pom文件中Spring-Context依赖。<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <原创 2021-02-04 16:10:55 · 123 阅读 · 0 评论 -
JavaWeb之JSP的使用
什么是JSP?JSP全称Java Server Pages,运行在java服务器中的动态页面,其本质也是一个Servlet。jsp支持HTML标签、java代码、代码片段。jsp比servlet更加擅长处理显示界面。一般情况下,servlet负责业务处理,jsp负责页面展示。一般情况下,我们使用servlet处理数据,转发到jsp,由jsp显示。servlet如何转发数据到jsp?// 下面是Servlet类中的doPost()方法,在此方法中示例转发protected void doPo原创 2021-02-01 16:02:04 · 159 阅读 · 0 评论 -
如何保证一个线程内只有一个mysql的连接?
可以使用ThreadLocal。将Connection对象存储到ThreadLocal中。具体实现:/** * */package cn.aura.web.login.utils;import java.sql.Connection;import java.sql.DriverManager;import java.util.Properties;/** * @author panghu * @description 连接mysql工具类 * @date 2021年1月3原创 2021-01-31 17:46:26 · 252 阅读 · 0 评论 -
Druid批处理
1.将数据库连接驱动、druid的jar包、dbutils包添加到项目库中。2.创建druid.properties#key=valuedriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/student?rewriteBatchedStatements=trueusername=rootpassword=rootinitialSize=10minIdle=5maxActive=20maxWait=500原创 2021-01-30 13:14:24 · 602 阅读 · 0 评论 -
Druid事务操作
1.首先我们创建bank表用于测试CREATE TABLE bank(id INT PRIMARY KEY,username VARCHAR(255),balance DOUBLE);INSERT INTO bank VALUES(1001,'郭靖',5000),(1002,'黄蓉',8000),(1003,'杨过',6000),(1004,'小龙女',9000);2.将数据库连接驱动、druid的jar包、dbutils包添加到项目库中。3.创建druid的utils类。pack原创 2021-01-30 13:09:45 · 2184 阅读 · 2 评论 -
Druid连接mysql
1.首先把druid的jar包和dbutils的jar包添加到工程库中。2.src下新建druid.properties文件。#key=valuedriverClassName=com.mysql.jdbc.Driver# 指定数据库,rewriteBatchedStatements=true代表支持批处理url=jdbc:mysql://localhost:3306/student?rewriteBatchedStatements=trueusername=rootpassword=root原创 2021-01-30 12:09:51 · 1121 阅读 · 0 评论 -
JDBC连接MySQL
1.首先需要把mysql的连接驱动添加到工程中。2.src目录下创建jdbc.properties文件。driver=com.mysql.jdbc.Driverusername=rootpassword=root# 指定mysql连接地址和数据库url=jdbc:mysql://localhost:3306/student3.创建JDBC工具类用于连接和关闭数据库。package cn.aura.jdbc.utils;import java.io.File;import java.i原创 2021-01-30 10:53:54 · 71 阅读 · 0 评论 -
Java反射调用运行时类的属性和方法
测试类:package com.aura.java;/** * @author panghu * @description * @create 2021-01-25-11:48 */public class Person { private String name; int age; public char gender; public Person() { } public Person(String name, int age, cha原创 2021-01-25 17:10:55 · 84 阅读 · 0 评论 -
Java中关于Map的理解
Map(接口):存储k-v键值对双列数据。主要实现类:HashMap:Map的主要实现类。线程不安全,效率高,可以存储null类型的key和value。LinkedHashMap:HashMap的实现类。保证在遍历map时,可以按照添加元素的顺序进行遍历。原因:在HashMap底层的基础上,添加了指针,一个指向前一个元素,一个指向后一个元素。对于频繁遍历的操作,效率高于HashMap。HashTable:Map的古老实现类。线程安全的,但是效率低。不可以存储null类型的key和valu原创 2021-01-19 11:45:15 · 201 阅读 · 0 评论 -
关于Java中List接口的理解
List接口:存储有序、可重复的数据。实现类:ArrayList:主要实现类,线程不安全的,效率高。底层使用Object[] elementData 存储。LinkedList:对于需要频繁操作插入、删除的数据,LinkedList比ArrayList效率要高。底层使用链表存储。Vector:List的古老实现类(jdk1.0版本就存在,而List接口1.2版本才出现),线程安全的,效率低。底层使用Object[] elementData存储。ArrayList的源码分析:JDK 7的情况下原创 2021-01-17 11:51:11 · 96 阅读 · 0 评论 -
Java枚举类的理解与代码实现
枚举类的使用场景:枚举类的对象是有限个时。特别的,当枚举只有一个对象时,可以作为单例模式的一种实现方式。枚举类的使用:JDK 5之前通过自定义类实现枚举。JDK 5之后可以通过enum关键字实现。代码实现:package cn.aura.java;/** * @author panghu * @description JDK 5.0之前自定义枚举类 * @create 2021-01-12-17:13 */public class EnumTest { public原创 2021-01-12 18:13:47 · 87 阅读 · 0 评论 -
线程的生命周期
原创 2021-01-11 15:47:54 · 68 阅读 · 0 评论 -
Java线程池的使用
使用线程池的好处:提高了响应速度(减少了创建新线程的时间)。降低资源的消耗(重复利用线程池中的线程,不需要每次都创建)。便于线程管理代码实现:import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ThreadPoolExecutor;/** * @author panghu * @description * @cre原创 2021-01-11 15:21:59 · 105 阅读 · 0 评论 -
Callable接口实现多线程的代码实现与优点
Callable接口是JDK 5.0新增的特性。对比Runnable接口的好处:Callable接口要重写的call()方法是可以有返回值的。call()方法可以抛出异常,供外部捕获。Callable接口支持泛型。代码实现:import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/** * @a原创 2021-01-11 14:09:43 · 562 阅读 · 0 评论 -
Java多线程间的通信
常用方法:wait():调用此方法的线程进入阻塞状态,并且释放同步锁。notify():唤醒被wait的线程,如果有多个线程被wait,那么唤醒优先级更高的。notifyAll():话逆行所有被wait的线程。注意:wait()、notify()、notifyAll()都只能在同步块或者同步方法中使用。wait()、notify()、notifyAll()是声明在Object类中的方法。wait()、notify()、notifyAll()的调用者必须是同步代码块或同步方法中的同步监视器原创 2021-01-10 10:39:49 · 90 阅读 · 0 评论 -
Java多线程使用Lock实现线程安全
JDK 5.0以后新增了Lock用来实现线程安全。注意:Lock是一个接口,我们常用它的实现类ReentrantLock。需要手动调用lock()上锁,unlock()解锁。代码实现:import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @description lock实现线程安全购票 * @author panghu * */public cl原创 2021-01-07 22:19:55 · 147 阅读 · 0 评论 -
Java单例设计模式
单例设计模式:在某个系统中,使用一定的方法使得一个类只能实例化一个对象。实现代码:/* * 单例设计模式 * 饿汉式 */public class SingleInstanceTest1 { public static void main(String[] args) { Bank b1 = Bank.getInstance(); Bank b2 = Bank.getInstance(); System.out.println(b1==b2); // true }}cla原创 2021-01-06 16:24:18 · 68 阅读 · 0 评论 -
Java多线程使用synchronized实现线程安全的两种方法
方法一:同步代码块:synchronized(同步监视器){ 需要被同步的代码块}注意:操作共享数据的代码,即为同步代码块。共享数据:即多个线程共同操作的变量。同步监视器:也称作“锁”,任何一个类的对象,都可以充当这个锁。但是多个线程必须共用同一把锁。在实现Runnable接口创建多线程的方式中,我们可以考虑用this来充当同步监视器。代码实现:/** * @author panghu * @description 实现Runnable接口方式实现线程安全多窗口卖票 * @原创 2021-01-06 15:58:34 · 182 阅读 · 0 评论 -
IDEA常用设置
1.显示工具栏快捷图标view-勾选toolbar和tool buttons2.设置主题:file - settings - appearance3.设置鼠标滚轮修改字体大小:file - settings - editor - general4.设置鼠标悬停提示:file - settings - editor - general5.设置自动导包:file - settings - eidtor - general - auto import6.设置方法间分隔符:file - set原创 2021-01-05 10:22:25 · 205 阅读 · 0 评论 -
Java接口的理解
接口的使用:接口通过interface关键字来定义。接口和类是并列的结构。接口中不能定义构造器。通过类去实现(implements)接口来使用。如果实现类中覆盖了接口中所有的方法,则此实现类是一个可实例化的类。如果实现类中没有覆盖接口中所有的方法,则此类是一个抽象类。java类可以实现多个接口,多个接口之间用空格分隔。弥补了单继承的局限性。格式:class A extends B implements C,D接口与接口之间可以继承,并且可以多继承。也是使用extends关键字。接口的使用,体原创 2021-01-05 09:33:54 · 97 阅读 · 0 评论 -
Java abstract的理解
abstract:抽象的,可以用来修饰类和方法。abstract修饰类:此类不能实例化。抽象类中一定有构造器,便于子类的调用。提供抽象类的子类,让子类实例化。abstract修饰方法:抽象方法只有方法声明,没有方法体。包含抽象方法的类一定是抽象类。(抽象方法不希望被调用,为了防止被调用,放在抽象类中就可以了)。如果子类重写了父类中所有的抽象方法后,子类才可以实例化。若子类中没有重写父类中全部的抽象方法,那么子类也是一个抽象类。abstract使用上的注意点:不能用来修饰属性、构原创 2020-12-30 18:53:58 · 354 阅读 · 0 评论 -
Java中关于final的理解
final:最终的final可以修饰类、属性、变量、方法。修饰类时:表示此类是最终类,不能被继承。修饰属性时:表示此属性一旦初始化就不能被修改。可以初始化的位置有:显式初始化、代码块中、构造器中。修饰变量时:表示此变量不可被重新赋值,也就是常量。修饰方法时:表示此方法不能被重写。static final 可以同时修饰属性,表示全局常量。...原创 2020-12-30 16:15:40 · 151 阅读 · 1 评论 -
代码块执行顺序面试题
1.下面的代码最终会输出什么class Root{ static{ System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public Root(){ super(); System.out.println("Root的无参数的构造器"); }}class Mid extends Root{ static{ System.out.println("Mid的静态初始化块")原创 2020-12-30 16:02:07 · 168 阅读 · 0 评论 -
java中关于static的理解
static可以修饰属性、方法、内部类、代码块。static修饰属性:被static修饰的属性称作静态变量(类变量)。不被static修饰的属性称作实例变量。static修饰属性时该属性是共用的。举个例子:实例化同一个类不同的两个对象时,通过任意一个类修改static修饰的静态变量,另一个对象访问该变量时,变量的值也会发生改变。public class StudentTest { public static void main(String[] args) { Student s1 =原创 2020-12-30 10:14:11 · 181 阅读 · 0 评论 -
java多态的理解
多态:父类引用指向子类对象。如:Person是父类,Student是子类Person p = new Student();多态的使用前提:要有类的继承关系方法一般要重写多态的使用(虚拟方法的调用):编译看左边,运行看右边。父类中存在的方法才能够调用,但是运行时执行的是子类重写后的方法。注意:对象的多态性只适用于方法,不适用于属性。访问属性时还是访问左侧父类的属性。多态是运行时的行为,也叫动态绑定。如何才能访问子类的属性和方法?强制类型转换,父类向子类转换也称作向下转型。但原创 2020-12-28 20:47:48 · 158 阅读 · 0 评论 -
Java权限修饰符
4种权限修饰符都可以用来修饰类的内部结构(属性、方法、构造器、内部类)。修饰类的话,只可以使用缺省和public。原创 2020-12-23 10:00:13 · 131 阅读 · 0 评论 -
Java 易错题(持续更新中)
易错题数组易错题数组易错题1.判断以下代码的输出结果:// 判断以下代码的输出结果int[] arr1 = new int[] {1 , 2 , 3};System.out.println(arr1); // 地址char[] arr2 = new char[] {'a' , 'b' , 'c'};System.out.println(arr2); // 遍历数组原因:PrintStream类中实现了print()方法的重写,只有char类型的数组会直接打印。...原创 2020-12-22 22:10:17 · 395 阅读 · 0 评论 -
Java可变参数方法的定义
public class VariableParameter { public static void main(String[] args) { print("abc" , "bcd"); } /* * 可变参数方法定义: * 权限修饰符 返回值类型 方法名(参数类型... 参数名){ * 方法体 * } */ public static void print(String... args) { for (String item : args) {原创 2020-12-22 21:13:45 · 80 阅读 · 0 评论 -
冒泡排序原理及代码实现
冒泡排序:字如其名,就像冒泡一样,泡泡从水中向上升起的过程中是有小逐层变大。实现原理:数组中前一位元素和后一位元素依次比较,如果前一位元素大于(或小于)后一位元素,就交换两元素的位置,这样就能保证最后在每一轮比较过后,后面的元素值是最大的。下面用图例详细的介绍 冒泡排序的实现过程。...原创 2020-12-22 09:45:37 · 282 阅读 · 0 评论 -
java随机数的使用
java生成随机数需要调用java.lang.Math类,使用Math类的random()方法。double num1 = Math.random() // 生成[0,1)区间的随机小数int num2 = int(Math.random() * 10 + 1) //生成[1,10]之间的整数int num3 = int(Math.random() * (99 - 10 + 1) + 10) // 生成[10,100)间的整数/两位数...原创 2020-12-20 21:20:16 · 135 阅读 · 0 评论