JavaSE
文章平均质量分 53
包子卖完了啊
程序员
展开
-
Volatie 关键字
变量可见性问题问题:当一个线程修改某个共享变量后,其他线程拿到的可能不是最新值为什么存在该问题?CPU读取变量的流程:先从CPU缓存中读,再从Main Memory中读。CPU写变量的流程:先写到CPU缓存,再从写到Main Memory。多核处理器处理多线程时,可能会发生这种情况 Main Memory 中 counter 的值是 0 CPU1中正在运行Thread1 把 counter 的值修改成7 CPU1中缓存的值刷新到Main Memory之前,.原创 2021-02-01 17:38:09 · 196 阅读 · 0 评论 -
数据库连接池 Druid
数据库连接池与线程池类似,因为打开和关闭数据库连接比较耗费资源,所以可以提前打开一定数量的连接,放到连接池中,当需要访问数据库时,从连接池中取出一个连接,操作完毕后,把连接放回到连接池。这样可以节省资源,提高效率JDK中提供的标准接口是Datasource比较常见的连接池是C3P0:数据库连接池技术Druid:数据库连接池实现技术,由阿里巴巴提供的,具有强大的监控和扩展功能使用数据库连接池(以Druid为例)首先下载Druid的jar包:https://mvnrepository.com/原创 2021-01-11 22:44:49 · 141 阅读 · 0 评论 -
JDBC的使用
JDBCJDBC: java中用来访问数据库的一框架,JDK中定义了规范的接口,由各大厂商完成实现。常用包java.sql: 所有与访问数据库相关的接口和类javax.sql: 扩展包,提供如连接池之类的额外功能数据库驱动:由各大数据库厂商提供,JDK 中不包含需要另外下载核心类DriverManager: 管理和注册数据库驱动,连接数据库Connection:数据库的连接对象。使用它来执行SQL语句Statement, PreparedStatement:SQ原创 2021-01-11 22:44:03 · 159 阅读 · 0 评论 -
Java Datagram类的使用
什么是DatagramDatagram是UDP协议中的概念,它是通过网络发送的数据报。Datagram由两部分组成:要传输的数据,目的地。具体属性如下// 传输的数据byte[] buf; int offset; int length; int bufLength;// 目的地InetAddress address;int port;因为UDP协议不是面向连接的,所以它不会像TCP一样创建连接。因此使用UDP通信时需要把数据和目的地设置到Datagram 中。而不是像TCP的S原创 2021-01-10 14:07:44 · 488 阅读 · 1 评论 -
Java Socket编程
什么是SocketSocket代表通过互联网进行双向通信的两个程序的其中一端,Socket需要绑定一个端口,这样TCP层才能知道应该把数据发送给哪个进程。JAVA中的Socket是对TCP协议的封装。底层是使用TCP协议实现的以C/S架构为例在Server端,在创建Server时需要绑定一个端口号,例如8080。之后Server端监听这个端口收到的数据在Client端,Client需要使用Server的主机名和Server绑定的端口号来来创建一个Socket来代表Server端,并来发起连接请求。C原创 2021-01-10 14:06:58 · 267 阅读 · 0 评论 -
Java URL类的使用
什么是URLUniform Resource Locator: 代表某个资源在互联网中的位置URL的格式协议标识://资源名称, 如:http://www.baidu.com如何创建一个URL使用java.net.URL类public static void main(String[] args) { try { URL u1 = new URL("http://www.baidu.com"); URL u2 = new URL(u1, "pages/page1.ht原创 2021-01-10 14:06:20 · 412 阅读 · 0 评论 -
JAVA网络编程基础
协议通信的规则,不同层用到的协议不同网络模型一般分为五层:应用层,传输层,网络层,链路层,物理层应用层: 应用层主要是处理网络通信手法的数据。常见的协议有:HTTP,FTP, SMTP传输层: 传输层主要作用是把数据从一个端口发送到另一个端口。常见协议有TCP, UDPTCP: 面向链接的协议,提供可靠的数据传输三次握手C -> S: 请求链接S -> C:允许连接C -> S: 确认连接四次挥手C -> S: 请求关闭连接S -> C:原创 2021-01-10 14:05:28 · 103 阅读 · 1 评论 -
序列化与反序列化ObjectOutputStream, ObjectInputStream
什么是序列化,反序列化序列化就是把一个对象的写到输出流中。核心类:ObjectOutputStream反序列化就是从输入流中读取一个对象。核心类:ObjectInputStream为什么需要序列化,反序列化当两个JAVA程序运行在不同主机上,程序A想要调用程序B中的方法时。程序A和程序B需要一种能够通过网络传输对象的的方法,这时候序列化就派上用场了。如何使用序列化,反序列化首先我们需要一个实现了Serializable类,只有实现了Serializable的接口才可以被序列化,反序列化publ原创 2021-01-10 14:04:40 · 77 阅读 · 0 评论 -
编码解码流InputStreamReader/OutputStreamReader
什么是编码解码流编码解码流就是以特定的编码格式实现二进制数据和字符数据之间的转换。分为两类:InputStreamReader/OutputStreamReader例如FileReader就是InputStreamReader的子类。FileReader会使用InputStreamReader的默认编码格式"UTF-8"来把二进制的数据解析成字符数据。例如FileWriter就是OutputStreamReader的子类。FileWriter会使用OutputStreamReader的默认编码格式"U原创 2021-01-10 14:04:03 · 565 阅读 · 0 评论 -
缓冲流BufferedInputStream,BufferedOutputStream,BufferedReader, BufferedWriter
什么是缓冲流缓冲流就是为读写流的创建一个缓冲区,通过缓冲区进行读写。分为四类:BufferedInputStream,BufferedOutputStream,BufferedReader, BufferedWriter为什么需要缓冲流使用非缓冲流时,每次读写操作系统都会进行I/O操作,I/O操作是很耗时的。如果能为读写流的创建一个缓冲区,通过缓冲区进行读写,就能减少操作系统I/O的次数,从而提高读写六的速度。如何使用缓冲流BufferedInputStream,BufferedOutputS原创 2021-01-10 14:03:24 · 223 阅读 · 0 评论 -
Properties的使用
Properties可以用来保存属性集(类似Map, 以键值的形式保存数据,不同的是Properties都是String类型的)。这个类的优势是可以从流中加载属性集,或者把属性集报错到流中。基本使用public Object setProperty(String key, String value); // 新增或修改一个属性public String getProperty(String key); // 获得key对应的值public Set<String> stringPr原创 2021-01-10 14:02:49 · 4650 阅读 · 3 评论 -
try with resource
JDK 1.7中引入了try-with-resource语句用来确保每个资源在try-catch-finally结束后被关闭。使用格式如下:try (创建资源对象,如果多个,使用';'隔开) {// 读写数据} catch (IOException e) { e.printStackTrace();}使用方法如下:public static void main(String[] args) { try { InputStream in = new FileInput原创 2021-01-10 14:02:02 · 245 阅读 · 0 评论 -
I/O stream
I/O Stream:A stream is a sequence of data. A program uses an input/output stream to read/write data from a source.例如我们在读写文件的时候就需要通过文件的input/output stream来读/写文件。I/O的分类根据数据流向分为Input Stream: 把数据从目标source读到内存中的流Output Stream:把数据写道到目标source的流根据Steam中数.原创 2021-01-10 14:00:38 · 152 阅读 · 0 评论 -
浅析Java中的线程安全和线程同步
Java中的线程安全问题Java中的线程同步问题synchronized的使用Lock类的使用原创 2020-10-09 21:07:41 · 228 阅读 · 1 评论 -
Java中线程的使用(Thread类)
如何创建线程创建线程的两种方式:继承Tread类,实现Runnable接口继承Thread类需要基层Thread类,并重写run方法,run方法里的内容就是线程需要执行的。然后调用t.start()方法来开启这个线程。public class Test_1 extends Thread { @Override public void run() { System.out.println("abcde"); } public static void原创 2020-09-22 20:58:53 · 672 阅读 · 0 评论 -
初探并发
并发和并行线程和进程原创 2020-09-22 20:58:03 · 408 阅读 · 0 评论 -
HashMap的实现原理及源码浅析
HashMap的实现原理HashMap使用的数据结构是HashTable + 链表/红黑树。当创建一个HashMap时,会先创建出一个HashTable:Node<K,V>[] table;需要注意的是HashTable并不是一种特殊的类型,它本质上还是一个数组,只不过它是根据元素的hash值来决定元素在数组中的位置,所以叫做HashTable。当插入一对KeyValue时,会根据Key的Hash值来决定其在HashTable中的栏位:tab[i = (n - 1) & ha原创 2020-09-13 16:43:17 · 128 阅读 · 0 评论 -
初探Map
Map接口Map记录的是key和Value间的映射关系。例如男朋友和女朋友这种就能建立起映射关系,如小明(key)的女朋友(映射关系)是小红(Value)需要注意的一点是Map中的key是不能重复的,而Value是可以重复的。但是一个key只能和一个Value建立映射关系。也就是说,在JDK的世界里,小明的女朋友是小红,老王的女朋友也可以是小红,但是小明的女朋友不能既是小红,又是小兰。常用方法V put(K key, V value); // 向Map中添加一组映射关系,并返回这个key之前映射的v原创 2020-09-13 16:42:11 · 138 阅读 · 0 评论 -
LinkedList实现原理及源码浅析
LinkedList实现原理LinkedList是使用一个双向链表实现的。每个节点的数据结构如下private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { // 创建一个Node this.item = element;原创 2020-09-13 16:41:08 · 121 阅读 · 0 评论 -
ArrayList实现原理及源码浅析
ArrayList的实现原理ArrayList底层是用一个数组实现的。Object[] elementData;当elementData装满元素时,会通过扩容的方式来增加elementData的容量浅析ArrayList源码添加元素添加元素最常用的是boolean add(E e)方法,它实际上调用的是将元素插入的指定位置的方法void add(int index, E element)。所以我们只需要搞懂void add(int index, E element)就可以了public原创 2020-09-13 16:40:05 · 160 阅读 · 0 评论 -
初探List
List接口List: 有序的(按照在容器中的位置排序),允许元素重复的,具有线性结构的容器。List中常用的方法有以下几类根据元素索引操作元素(List中的索引指定就是元素的位置)E get(int index); // 返回指定位置元素E set(int index, E element); // 设置指定位置的元素,并返回之前在这个位置上的元素void add(int index, E element); // 在指定位置插入元素E remove(int index); //原创 2020-09-13 16:39:02 · 104 阅读 · 0 评论 -
如何遍历一个容器
遍历容器有三种方式:1. 使用for-each遍历容器2. 使用迭代器`Iterator`遍历容器3. 使用聚合操作遍历容器for-each使用方法如下:public static void testForeach(Collection<?> c) { for (Object o: c) { System.out.println(o); }}需要注意的是,在for-each中不能删除元素,否则会报错。public static void testFore原创 2020-09-13 16:38:06 · 306 阅读 · 0 评论 -
Collection接口概览
Collection接口是普通容器类型的根接口,它定义了容器需要实现的功能的最小集。它的直系子类有:Set, List, Queue, DequeCollection接口定义了以下几类API基本操作:int size(); // 容器大小boolean isEmpty(); // 容器是否为空boolean contains(Object element); // 是否包含某个元素boolean add(E element); // 添加一个元素boolean remove(原创 2020-09-13 16:37:03 · 254 阅读 · 0 评论 -
容器框架概览
容器:用来保存多个对象,并提供管理对象的方法。JDK中提供很多种类型的容器。这些容器类型被抽象为这几个接口:Collection, Set, List, Queue, Deque, SortedSet, Map, SortedMap. 这几个接口之间的继承关系如下:可看到JDK中的容器被分为两大类:Collection, MapCollectionCollection接口是普通容器类型的根接口,它定义了容器需要实现的功能的最小集。它的直系子类有:Set, List, Queue, Deque原创 2020-09-13 16:36:17 · 350 阅读 · 0 评论 -
一文读懂泛型
什么是泛型泛型:在定义类,接口,方法时,可以把类型当作参数。为什么需要泛型泛型是在JDK1.5中添加的新特性。在JDK1.5之前,为了让代码可以应用于多种类型,需要将参数设置为Object类。例如我们在创建一个ArrayList时,内部实际是用一个Object的数组实现的。(为了向上兼容,现在创建ArrayList时,不指定类型的话,还是会被当作Object类)。这样做的缺点是:任意类型的数据都可以存到这个ArrayList,在取出数据时,我们可能需要强制转型成目标类型,这样很容在运行期间出现转原创 2020-09-08 22:03:56 · 264 阅读 · 0 评论 -
隐藏在装箱拆箱中的缓存机制
首先让我们先来看一段代码,这段代码的输出和你想的一样吗?public class Test_1 { public static void main(String[] args) { int a = 1; Integer b = 1; Integer c = Integer.valueOf(1); Integer d = new Integer(1); System.out.println("a == b = " +原创 2020-09-02 20:08:24 · 117 阅读 · 0 评论 -
字符串(String, StringBuilder, StringBuffer)
StringJava提供了String类型来表示字符串保存字符串的方式String类中用来保存字符串的数据接口是一个byte[],并且用fianl修饰了这个数组。private final byte[] value;String类没有提供接口来修改字符串的值,所以String是不可以被修改的,而且是线程安全的。创建字符串创建字符串有两种方式:String str = “abc”。当使用这种方式创建字符串时,JVM会在堆内存中搜索看之前是否有用这种方式创建过"abc"字符串,如果有,就只直原创 2020-09-02 19:24:02 · 104 阅读 · 0 评论 -
为什么重写equals方法时,要重写hashcode方法
例如在HashMap中,key是不允许重复的,判断两个key是否重复,就是判断两个key的hashcode是否相同。如果重写了equals方法,但是没有重写hashcode方法,就会出现两个对象明明是相等的,但是却被HashMap视为是两个key的现象下面用代码说明下。首先,创建一个重写了equals但是没有重写hashcode的类public class B { int i; public B(int i) { this.i = i; } @O原创 2020-09-02 19:23:13 · 102 阅读 · 0 评论 -
比较两个对象(equals方法)
在比较基本类型时,我们可以使用==号来比较。但是比较两个对象的引用时,==比较的是两个引用是否引用的同一个对象。测试代码如下:public class Test_1 { public static void main(String[] args) { A a1 = new A(); A a2 = new A(); A a3 = a2; System.out.println(a1 == a2); System.ou原创 2020-09-02 19:15:48 · 6609 阅读 · 0 评论 -
内部类
什么是内部类内部类:定义在一个类里面的类,就是内部类。例如下面这个例子,Inner类就是内部类,Outer类就是外部类public class Outer { class Inner { } }如何创建一个内部类的对象分两种情况用static修饰的静态内部类,需要用类名作为前缀来创建public class Main { public static void main(String[] args) { Outer.I原创 2020-09-02 13:52:35 · 92 阅读 · 0 评论 -
接口(Interface)
生活中有很多接口的例子。例如USB口就是一个接口,我们在使用U盘的时候,要关心的是目标设备有没有USB口,而不是目标设备是什么设备。JAVA中的接口也是一样的,调用者不需要知道被调用的类到底是什么类,只需要知道它有没有实现这个接口。接口的定义格式如下:public interface 接口名称 { // 抽象方法,实现类需要实现这个方法 // 默认方法,实现类可以重写这个方法 // 静态方法 // 私有方法,只可以在接口内使用 // 静态变量,可以省略publi原创 2020-09-02 11:21:59 · 170 阅读 · 0 评论 -
面向对象的三大特征
面向对象三大特征:封装,继承,多态封装先看下封装的英语解释:encapsulation:the process of enclosing (封闭的过程 )JAVA中的封装就是隐藏具体的实现,把不希望暴漏出来方法和属性隐藏起来,只暴露出需要对外提供的信息。例如微信,微信把自己的实现方式隐藏起来了,我们并不知道微信底层是怎么运作的的。微信只是通过图形化的界面为用户提供各种功能。JAVA中实现封装的方法就是权限控制。权限控制分为四级:private, protected, default, public原创 2020-09-02 11:20:15 · 309 阅读 · 0 评论 -
什么是面向对象
面向过程和面向对象编程有两大流派:面向过程,面向对象面向过程面向过程强调的是做事情的步骤。例如把大象装进冰箱,用面向过程的思维考虑就是:打开冰箱门>把大象放到冰箱>关闭冰箱门面向对象面向对象强调的是做一件事情有哪几类东西参与进来,这些东西分别应该提供那些功能。例如把大象装进冰箱。用面向对象的思维考虑,首先要看有哪几类东西参与进来:人,大象,冰箱。这些东西需要提供的功能是:人:把大象放到冰箱,开冰箱门,关冰箱门大象:不需提供什么功能冰箱:开门,关门Class(类)JA原创 2020-09-02 11:16:54 · 86 阅读 · 0 评论 -
JAVA的八种基本数据类型
基本介绍编程实际上就是创建一组处理数据的规则。那么JAVA程序中是如何表示数据的呢?JAVA提供了八种基本数据类型来表示数据,用这八种基本数据类型可以组成更加复杂的数据类型。他们分别是:boolean, byte, char, short, int, long, float, double。这八种数据类型有被分为四类:布尔型:表示布尔类型(true/false),boolean字符型:表示使用Unicode编码的字符, char整型:表示整数, byte, short, int, long浮原创 2020-08-29 17:55:36 · 444 阅读 · 0 评论 -
JAVA代码是怎么运行起来的
运行一段JAVA代码的流程:JAVA程序是运行在JVM上的,但是JVM读不懂.java文件,需要一个翻译官把.java文件翻译成JVM能读懂的语言。把.java文件翻译成JVM能读懂的语言的过程就是编译,我们的翻译官(编译器)就是javac,编译出来的文件是.class文件。获得.class文件之后就可以拿来在JVM上运行了。下面用HelloWorld作为例子演示下这个流程的实际操作。编写HelloWorld程序首先编写一个HelloWorld.java的程序:public class Hel原创 2020-08-29 12:14:19 · 272 阅读 · 0 评论 -
搭建Java开发环境(安装JDK, 安装IDEA, 编写Hello World)
安装JDK JDK的全称是JAVA Development Kit, 是开发JAVA程序必备的开发工具。下载JDK打开(https://www.oracle.com/java/technologies/javase-downloads.html)根据操作系统选择对应的版本下载,我的是win10 64bit所以选jdk-14.0.2_windows-x64_bin.zip解压jdk-14.0.2_windows-x64_bin.zip (之后需要用解压路径配置环境变量)配置环境变原创 2020-08-28 17:04:46 · 258 阅读 · 0 评论