侧边栏壁纸
博主头像
王小木人个人技术文章记录

这是很长,很好的一生

  • 累计撰写 141 篇文章
  • 累计创建 43 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

java 笔记

王小木人个人技术文章记录
2021-05-26 / 0 评论 / 0 点赞 / 1,642 阅读 / 7,515 字

 java 1995年,sun公司创立,后由oracle收购
 java 之父,JamesGolsing
  
 java 应用领域
 
 开源,多线程,跨平台
 
 java 平台简介

 javase:java基础核心
 javaee:一般用于企业级的开发
 javame:微型版本

java运行环境
 
jdk java develop kit java开发工具包 包含jre
jre java runtime environment java运行时环境 包含 jvm,.class程序运行所需的必要环境,bin目录中包含jvm,lib包含所需的类库等
jvm java virtual  machine   java虚拟机 跨平台核心,执行.class文件,解释成所在平台所能识别的机器代码,本地机器不直接运行程序

不同环境jdk将源程序(.java)编译成统一中间代码(.class), 中间代码(.class)能被不同环境下的jvm识别,并翻译成相应环境下的机器代码(二进制文件),再由本地机器运行jvm翻译成机器语言后的程序

制表符 
空格 \t
换行 \n

包的规范
cn/com +域名+模块名 全部小写

java注释
文档注释 /**
       内容
         */

多行注释 /*
     内容
       */

单行注释 //

运行快捷键 ctrl+f11
创建的java文件后会在bin目录下生成class文件

变量

定义 表示在内存中开辟的一块空间

 数据类型
 1.基本数据类型  
               整数型 byte(1个字节),short(2) int(4) long (8)
               浮点型 double(8) float(4) 
               布尔型 boolean(1) 
               字符   char(2)
 2.引用数据类型
               数组,对象,String,类..
初始化float时要在数据后加f或F声明
初始化long时要在数据后加l或L声明

变量的定义

 1.声明并赋值 
 2.先声明后赋值

变量的命名规范
     
    合法的变量名 (可包含$或_,字母,数字,不能包含关键字,数字不能开头)
     
    驼峰命名法:
    1.一个单词时全小写
    2.多个单词时从第二个单词开始首字母大写
    3.具有实际含义
    4.不能使用关键字
    5.变量名在同一个作用域内不能重复
     
注意:java 的文件命名时或变量命名时允许使用中文但不推荐

赋值运算服符
  =
  +=
  -=
  ...    

注释选中内容 ctrl+shift+/ 
代码格式化  ctrl+shift+f
导包快捷键 ctrl+shift+o

运算符
  类型转换
  自动类型转换
  强制类型转换

算术运算符
++ -- 

三目运算符
 条件? 表达式一:表达式二
 
 逻辑运算符
 == > >= <= != ! 

 条件运算符
或  ||
且  && 
异或 ^

进制转换

调试

 f5进入方法
 f6单步执行
 f8跳到下一个断点
 f11

JAVA 内存分析
为了提高运行效率,做了内存管理

java内存主要划分了以下五个模块
栈:用于保存局部变量
堆:保存new出来的东西
方法区:存放类的所有加载信息.class(方法,静态变量,常量)
本地方法区:与系统相关,
寄存器:cpu使用,与cpu 相关

栈:使用后立刻释放
堆:保存new 内容,

abstract抽象
由abstract修饰的类不能实例化
有abstract修饰的方法没有方法体,且必须由子类重写该方法(除非子类也是抽象类)

抽象方法必须在抽象类中,抽象类中不一定有抽象方法

由 final 修饰的类不能被继承
由final 修饰的方法不能被重写
由final 修饰的属性变量不能被改变

继承的特点
java 中只能单继承,但是可以由接口实现多继承的功能
传递性 子类被继续继承后父类的方法属性传递下去

instanceof 判断对象的类型
对象 instanceof 类

多态 

方法重写
普遍方法 编译看左边,运行看右边
静态方法 编译看左边,运行看左边
属性     编译看左边, 运行看左边
构造方法 构造方法不能被继承,不存在重写

代码块

局部代码块

构造代码块
 类中的代码块,优先构造方法执行
静态代码块
 类加载时执行,只执行一次

接口,默认都是abstract方法
jdk1.8之后可以有static default 方法
方法只能是public修饰
在接口中所有变量默认是常量,默认由static final 修饰
一个类实现了一个接口必须实现该接口所有的方法(除非该类是抽象类)
接口之间可以用extends继承

抽象类和接口
1.抽象类是对类的抽象,类中属性和方法的抽象
2.接口是对类局部的抽象,类中方法方法的抽象

接口作为返回值和形参时,其实是对应接口的实现类

异常处理

try 可能异常的代码块

catch  异常处理代码块

finally 始终都会执行的代码块

throw  开发人员手动抛出异常

throws  在方法声明处抛出异常,交给调用者处理

throwable 所有异常的超类,

    error                                     exception 
在程序的运行过程                编译时异常                    运行时异常  
中出现的问题,这                未继承RuntimeException类      继承RuntimeException类
类问题不需要开发                的异常都是编译时异常           的异常
人员关心

throw 开发人员创建异常并抛出
throws 在方法声明出抛出异常,由调用者处理

log4j (log for java 4j)  错误日志

配置文件 log4j.properties
log4j三个组成部分
日志优先级 日志输出路径(控制台) 日志输出路径(本机文件)
日志优先级

error
wran
info
debug

使用
import org.apache.log4j.Logger
Logger log=Logger.getlogger(Test.class);
log.debug("日志信息 ");

生成jar包
jar -cvf 包名.jar 路径/*.class

常用类
枚举 enum
String 类
char    charAt(int index)
返回 char指定索引处的值。

String    concat(String str)
将指定的字符串连接到该字符串的末尾。

boolean    contains(CharSequence s)
当且仅当此字符串包含指定的char值序列时才返回true。

boolean    equals(Object anObject)
将此字符串与指定对象进行比较。

boolean    equalsIgnoreCase(String anotherString)
将此 String与其他 String比较,忽略案例注意事项。

static String    format(Locale l, String format, Object... args)
使用指定的区域设置,格式字符串和参数返回格式化的字符串。

static String    format(String format, Object... args)
使用指定的格式字符串和参数返回格式化的字符串。

boolean    isEmpty()
返回 true如果,且仅当 length()为 0 。

boolean    matches(String regex)
告诉这个字符串是否匹配给定的 regular expression 。

String    toLowerCase()
将所有在此字符 String使用默认语言环境的规则,以小写。

String    toUpperCase()
将所有在此字符 String使用默认语言环境的规则大写。

集合
对数据进行存储
list(列表) set(结果集) map(映射)

ArrayList 
实现接口List,由数组实现

TreeSet保存对象时需要实现Comparable接口并实现compareTo()方法
HashSet可以直接保存对象无需实现接口和方法
HsahSet可以有null存在(编译运行均通过),TreeSet不可以有null(编译通过,运行空指针异常)

Map 集合存储数据使用映射关系进行存储

HashMap 
红黑树特点:自平衡
1.每个节点或是黑色或是红色
2.根节点是黑色
3.每个叶子节点是黑色(为null的叶子节点                      ),
4.如果一个节点是红色,则它的子字节点必须是黑色
5.从一个节点到该节点的所有子孙节点的的所有路径上包含相同数目的黑节点0.

HashMap 允许null key 和 null value  线程不安全
Hashtable 不允许null key 和null value  synchronized修饰 线程安全的

创建线程安全的HashMap
方法一:通过调用Collections下的方法

ArrayList  初始长度10 增长因子 1.5  线程不安全
Vector  初始长度10 增长因子    2  线程安全

File 类

io流 :读取和写入文件
开始读取到文件结束
文件的输入和输出

输入流 InputStream Reader  (抽象)
输出流 Outputstream Writer (抽象)

字节流 InputStream OutputStream (抽象)
字符流  Reader Writer           (抽象)  

                 字节输入流  InputStream(虚类)
                                  
                                  FileInputStream  ObjectInputStream 
               
                 字节输出流  OutputStream(虚类)
                   
                                  FileOutputStream(可追加true append)  ObjectOutputStream 
 
                 字符输入流    Reader  (虚类)
               
                                BufferedReader      InputStreamReader

                                 LineNumberReader   FileReader
                 字符输出流      Writer(虚类)
                                BufferedWriter    OutputStreamWriter 
                                                                 
                                                   FileWriter (可追加true append)

Io OutputStream
   
   fileOutputStream (文件路径下的文件名不存在会自动创建文件)

Writer 

fileWriter 

flush 刷新缓存

多线程

每个进程中包含多个线程,是最小的执行单元

并行:同一个时间段内同时访问
并发:同一个时间点同时访问

线程中的run 方法如果手动调用的话等同与其他普通方法,通过启动start()方式启动才是启动多个线程

线程执行具有随机性

线程的调度分两种
分时调度模型:多个线程在程序中运行时,抢占cpu执行率是相同的
抢占式调度模型:多个线程在程序运行时按优先级抢占cpu

线程实现
1.继承Thread 重写run()
2.实现Runnable接口 重写run()
3.实现Callable接口(有返回值)重写call()
  通过类FutureTask(Runnable的实现类) 连接Callable

线程同步
1.是否存在共享数据
2.是否有多条语句在操作共享数据
3.是否是多线程环境
synchronized(锁对象)
{
   //代码块
}
synchronized修饰方法块时锁对象为this对象
当synchronized修饰的方法由static修饰时,锁对象是类文件(类名.class)

线程中的状态
线程睡眠 sleep() 
线程停止 stop() 已过时被interrupt()代替
线程中断 interrupt();
线程等待 join();等待该线程死亡后再执行其他线程
线程暂停 yield() 

线程中发生死锁后可以利用线程之间的通信解决
生产者-消费者
wait()
notify()
notifyAll()

sleep不会释放锁 wait()会释放锁

线程的生命周期
正常状态:
新建:创建线程对象
就绪:拥有执行资格,但没有执行权
运行:拥有执行资格,拥有执行权
死亡:使用完线程对象后,变成垃圾,等待回收

非正常状态:
  阻塞:1.没有抢到执行权
        2.执行中遇到sleep(),wait()方法进入等待状态

守护线程 setDaemon(boolean on)  随着用户线程执行,用户其他线程执行结束后自动结束,最大的守护线程GC
网络编程

volatile 多线程中由该关键字修饰的属性的操作不进行复制,直接操作

网络编程:建立计算机和计算机之间的连接,所谓计算机与计算机之间的通信
别称:Socket编程,套字节编程

网络连接的要素

1.ip地址
2.端口号
3.协议

查看ip地址: windows ipconfig
             linux   ifconfig

检查网络是否连接 ping 

互联网协议类 InetAddress 没有构造方法,不能创建对象,使用静态方法返回其对象 例如:
static InetAddress[]    getAllByName(String host)       给定主机的名称,根据系统上配置的名称服务返回其IP地址数组。

static InetAddress    getByAddress(byte[] addr)      给出原始IP地址的 InetAddress对象。

static InetAddress    getByAddress(String host, byte[] addr)   根据提供的主机名和IP地址创建InetAddress。

static InetAddress    getByName(String host)        确定主机名称的IP地址。

其他没有构造方法的类 Math Arrays

网络传输

1.建立计算机之间的连接
2.建立Socket连接
3.进行发送信息

UDP 通过udp协议进行发送数据,将信息封装为数据包,进行发送,每次发送大小最大64kb,不可靠

UDP协议发送数据步骤

1.创建发送端的Socket对象
  类 DatagramSocket
2.编写消息进行发送,将信息封装成数据包
  数据包类 DatagramPacket 
3.调用方法进行发送
4.关闭资源

接收步骤

1.创建接收端的Socket对象
  类 DatagramSocket
2.调用接收方法接收数据包
3.解析数据包
4.关闭资源.

Linux 通过命令发送一个 数据包
echo "hello">/dev/协议(udp或tcp)/ip地址/端口号

TCP 
1.建立连接
2.没有大小限制
3.可靠协议

tcp 协议发送的步骤
1.创建客户端的Sosket对象 类 Socket
2.发送消息,得到输出流
3.通过输出流进行写入信息
4.关闭资源

tcp 协议接收步骤
1.创建接收端的Socket对象 类 ServerSocket
2.得到输入流
3.通过输入流得到消息转换为字符串
4.关闭资源
lsof -i:端口号 查看指定端口号被那个d进程占用
netstat -nultp 查看所以端口号被那个进程占用

反射

反射:通过反射可以获得任何一个类中的成员,属性,方法,构造等,也可以操作任何一个对象下的方法等,获得类的class 文件

得到Class方式
1.Object对象.getClass()
2.类.class
3.Class.forName(类名);  不能直接写类名,需要从包名路径开始写

通过反射如何创建对象

注解

注解不是程序本身,简单理解注解跟注释差不多,注解可以通过程序或编译器进行读取,也就可以使用了。
注解是jdk 1.5之后进行引用的

注解可以使用在类上面,方法上面,属性上面...

注解的关键字 Annotation,使用注解时用@引用

@Override 表示方法是重写的
@interface :注解的标示--》元注解
@Target 声明注解用在什么位置
ElementType 枚举,里面定义了位置名称
@Retention :表示此注解的生命周期,
RetentionPolicy 枚举类,这个枚举类型的常量描述了保留注释的各种策略

@SuppressWarnings :去除警告
方法中 Value() 表示变量名称  String[]数据类型

@Deprecated

@Documented 文档注释

1.如果注解里只有一对{},使用@时不需要给参数
2.如果注解中只有一个参数,通常用value()
3.如果一个注解类型为数组,表示调用此注解可以给多个参数
4.同一个注解在一个方法或类等不能出现重复
5.只有一个参数时可以省略参数变量

自定义注解

关键字 @interface
 参数默认值 参数类型 变量名() default 值

crm 对象关系映射
可以通过注解方式,通过对象关系映射,创建数据表

设计模式

单例
内存中只允许创建一个对象
单例设计模式
a.饿汉式
 步骤:
  1.构造方法私有化
  2.本类中创建一个对象,私有静态创建对象
  3.提供方法给外界访问

b.懒汉式
   1.构造方法私有化
   2.本类中创建一个对象,私有静态(不创建)
   3.提供方法给外界访问(创建对象)
饿汉式操作操作具有原子性,线程安全
懒汉式线程不安全,所以方法要用synchronized加锁

代理
   代理目的:将程序设计与代码实现分离
   代理设计模式有三个角色
   1.真实角色
   2.代理角色
   3.抽象角色

工厂

jdbcL连接
1.通过反射机制加载数据库驱动程序类
2.数据库连接的连地址
oracle 数据库连接 jbbc:数据库:thin:@主机地址:端口号:SID
mysql  数据库连接 jdbc:mysql://localhosl:3306/数据库名?useSSL=false&serverTimezone=UTC  JDBC 8.0后才需要ssl验证和serverTimezone=UTC
3.数据库用户名
4.密码
类. DriverManager 获得Connection对象 每一个Connection描述一个用户连接

接口 Statement 在连接后对数据库操作的对像,每一个对数据库的操作都是一个Statement的对象
通过连接Connection对象创建数据库的操作对像(Statement) 

获得Statement 对象后便可以进行sql的处理了,
修改
executeUpdate(String sql) 通过执行sql语句修改操作

查询
executeQuery(String sql) 通过执行sql语句查询操作
返回 ResultSet对象 

在Statement对sql语句进行操作不能对字符引号进行操作,使用PreparedStatement进行操作
创建PreparedStatement 对象时传入带有站位符的sql语句

ResultSet    executeQuery()
执行此 PreparedStatement对象中的SQL查询,并返回查询 PreparedStatement的 ResultSet对象。
int    executeUpdate()
执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,如INSERT , UPDATE或DELETE ; 或不返回任何内容的SQL语句,例如DDL语句。

三层架构

表示层:与用户进行交互的 
业务逻辑层:进行有效的数据校验,验证数据的正确性
数据访问层:接受业务逻辑层的数据

代码实现三层
1.新建实体类,所有实体类放在包 entity 下
2.新建数据访问层接口,放在包dao下,类名与数据库中的一一对应
3.数据访问层实现类,放在dao下的包里
4.业务逻辑层实现类Services
5.表示层 类ui

连接池
通过连接池的连接使得数据访问层与数据库不直接访问
dbpc 
pool

1.声明本地连接
DataSource
2.创建线程本地变量
ThreadLocal threadlocal 
3.加载配置文件
properties prop
4.将连接放入DataSource中
dataSource=BasicDataSourceFactory.createSource(prop);  dbpc中

5.获得连接
dataSource.getConnection()

AWT和Swing

AWT :java 中老版本的桌面程序开发包
Swing :java 中新版本的桌面程序开发包

1.Frame是一个标题和边框的顶级窗口
 创建Frame窗口
 设置大小 setSize()
 设置窗体是否可见 setVisible()

2.Button 按钮
  创建Button
  创建Frame 的子集容器 Panel
  按钮放入Panel Panel的add方法放入控件
  再将Panel放入Frame中
3.文本框 TextField
4.标签 Label

Panel 默认流水式布局
布局方式
FlowLayout 流水式布局

GridLayout 网格布局  

BorderLayout 边框布局

流水式布局和网格布局在组件添加前后都可以,边框布局只能在组件添加前使用

添加窗体关闭

1.通过Frame的方法addWindowListener添加监听 ,实现接口WindowListener
2.通过Frame的方法addWindowListener添加监听 ,实现类WindowAdapter

键盘监听事件
Frame的方法addKeyListener

Swing区别与老版本Awt,Swing是新版本,没有兼容问题,写法上在Awt组件前加上“J”

JOptionPane 消息框
二次确认框
showConfirmDialog(Component parentComponent, Object message)
启动对话框,选择是 , 否和取消 ; 标题为“选择选项” 。

showMessageDialog(Component parentComponent, Object message)
提供一个名为“消息”的信息消息对话框。

单选按钮
JRadioButton

按钮分组
ButtonGroup 

获取单选框按钮的值
判断按钮是否被选中 isSelected() 

多选按钮
JCheckBox

多行文本框
JTextArea

滚动条

JScrollPane
当文本域添 加了滚动条后,向面板添加时直接添加滚动条即可

下拉列表
JComboBox

获取下拉列表的值

选项卡

JTabbedPane 通过方法addTab

列表 JList

菜单
1.创建菜单
JMenuBar
2.创建主菜单
JMenu
3.创建子菜单
JMenuItem

绝对布局 关键字 null
setBounds(int x, int y, int width, int height)
移动并调整此组件的大小。

JPanel 嵌套时,绝对布局会失效

Container 通过JFrame获取

卡片布局
CardLayout   

final JFrame jf = new JFrame();
        jf.setTitle("卡片布局");
        
        GridLayout gl = new GridLayout(2, 1);
        JPanel jp = new JPanel();
        jp.setLayout(gl);
        
        JPanel jp1 = new JPanel();
        JButton jbr = new JButton("红色");
        JButton jby = new JButton("黄色");
        jp1.add(jbr);
        jp1.add(jby);

        final JPanel jp2 = new JPanel();
        final CardLayout cl = new CardLayout();
        jp2.setLayout(cl);

        final JPanel jpr = new JPanel();
        jpr.setBackground(Color.RED);
        final JPanel jpy = new JPanel();
        jpy.setBackground(Color.YELLOW);

        jp2.add("red", jpr);
        jp2.add("yellow", jpy);

        jbr.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub
                cl.show(jp2, "red");
            }
        });
        jby.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub
                cl.show(jp2, "yellow");
            }
        });

        jp.add(jp1);
        jp.add(jp2);

        jf.add(jp);

        jf.setBounds(200, 150, 500, 500);
        jf.setDefaultCloseOperation(3);
        jf.setVisible(true);
设置背景图
所有容器设置为透明
setOpaque 为false
JFrame不能直接设置,需要通过getContentPane 转换才能设置

ImageIcon 

实例代码
JFrame jf = new JFrame();
        JPanel jp = new JPanel();
        
        JButton jbtn = new JButton("按钮");
        jp.add(jbtn);
        
        //设置容器为透明:false
        jp.setOpaque(false);
        
        //jf.seto 直接通过JFrame调用setOpaque,调用不到
        //设置JFrame窗体为透明
        ((JComponent)jf.getContentPane()).setOpaque(false);
        //获取图片路径
        ImageIcon img = new ImageIcon("images/111.jpg");
        //图片所放位置
        //JButton jbtn02 = new JButton(img); 图片按钮
        JLabel jl = new JLabel(img);
        jf.getLayeredPane().add(jl,new Integer(Integer.MIN_VALUE));

        
        jl.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());
        
        jf.add(jp);
        jf.setVisible(true);
        jf.setBounds(500, 100, 500, 500);
        jf.setDefaultCloseOperation(3);

文件选择器
JFileChooser 

JFileChooser jfc = new JFileChooser("文件导出");
                if (JFileChooser.APPROVE_OPTION == jfc.showOpenDialog(jpbtop)) {
                    File file = jfc.getSelectedFile();
                    System.out.println(file);
                }

0

评论区