![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java语言
文章平均质量分 67
Marvel__Dead
这个作者很懒,什么都没留下…
展开
-
\r和\n的作用
\r : return 到当前行的最左边。\n: newline 向下移动一行,并不移动左右。Linux中\n表示回车+换行;Windows中\r\n表示回车+换行。Mac中\r表示回车+换行。...原创 2018-10-03 09:10:05 · 1385 阅读 · 0 评论 -
Java相对路径读取文件
Java相对路径读取文件不管你是新手还是老鸟,在程序中读取资源文件总会遇到一些找不到文件的问题,这与Java底层的实现有关,不能算bug,只要方法得当,问题还是可以解决的。项目的文件夹结构:repathtest ├─src │ └─com │ └─lavasoft │ ├─test │转载 2017-07-07 12:16:39 · 1913 阅读 · 0 评论 -
注解【定义+使用+读取】
注解的概述注释你还记得么?开个玩笑而已! 注释是给人看的,而注解是给程序看的! 注释是用来替代配置文件的!你回忆一下,我们以前总是要写一些配置文件,例如web.xml你还记得么?里面要写<servlet>和<servlet-mapping>!谁来读配置文件呢?当然是Tomcat!谁来写配置文件呢?当然是我们来写了!在Servlet3.0中就可以使用使用注解来代替配置文件,开发者就不用再写配置文件原创 2017-07-07 09:58:17 · 518 阅读 · 0 评论 -
线程工作内存与主内存
线程工作内存是cpu寄存器和高速缓存的抽象描述,使用频率高的数据从主存拷贝到高速缓存中,每个线程在cpu高速缓存中对拷贝的数据进行读取、计算、赋值,再在合适的时候同步更新到主存的该数据,如i=1,i+1=2,若2在更新到主存前,其他线程是不知道该值被改变了,其他线程高速缓存中该值依然为1.解决方法:需要各线程间可见的变量前加上volatile修饰,在一个线程的高速缓存中改变该值时,其他线程会获得该值转载 2017-07-16 19:51:37 · 587 阅读 · 0 评论 -
水到渠成的一个多线程安全案例【多窗口售票】别以为很简单,你看了绝对不会让你失望!
多线程安全问题分析在明白了多线程中会引发安全问题的几个重要点后,理解下面的程序你就会非常的轻松。个人理解总结会引发多线程安全问题的几个重要点:1.多线程中,每个线程都会从主内存中拷贝变量值到多线程工作内存中。 2.一个线程修改了工作内存的值,如果没有及时同步到主内存中,就会导致其它线程读取主内存的值时,发生脏读,即读取到了过时的值。 3.多个线程不互斥,会在i++等不是原子性操作的语句中,发生很原创 2017-07-16 19:43:43 · 392 阅读 · 0 评论 -
java 里面保留字volatile及其与synchronized的区别
1、锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是转载 2017-07-16 18:48:02 · 430 阅读 · 0 评论 -
Java异常分类
一、基本概念看java的异常结构图 Throwable是所有异常的根,java.lang.ThrowableError是错误,java.lang.ErrorException是异常,java.lang.Exception 二、Exception一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常转载 2017-03-31 15:01:18 · 675 阅读 · 0 评论 -
Java不可变对象
不可变对象是指一个对象的状态在对象被创建之后就不再变化。不可变对象对于缓存是非常好的选择,因为你不需要担心它的值会被更改。创建一个不可变类:将类声明为final,所以它不能被继承;将所有的成员声明为私有的,这样就不允许直接访问这些成员;对变量不要提供setter方法;将所有可变的成员声明为final,这样只能对它们赋值一次;通过构造器初始化所有成员,进行深拷贝(deep copy);在getter方转载 2017-07-05 16:46:05 · 430 阅读 · 0 评论 -
装饰者模式如何引入【c3p0,dbcp】以及IO流中。
要用到jar包下载!!!对象增强的手段* 继承 被增强的对象固定的 增强的内容也是固定的* 装饰者模式 被增强的对象是可以切换的 增强的内容是固定的* 动态代理(AOP) 被增强的对象可以切换:Service 增强的内容也可以切换:事务处理--------------------------继承:缺点:1. 增强的内容是死的,不能动!2. 被增强的对象也是死的!使用原创 2017-06-19 18:35:44 · 707 阅读 · 0 评论 -
类加载器【类加载器介绍+自定义类加载+Tomcat类加载器介绍】
什么是类加载器类加载器就是用来加载类(*.class)的东西!类加载器也是一个类:ClassLoader(继承该类) Java提供了三种类加载器,分别是:bootstrap classloader:引导类加载器,加载rt.jar中的类;sun.misc.Launcher$ExtClassLoader:扩展类加载器,加载lib/ext目录下的类;sun.misc.Launcher$AppCla原创 2017-07-02 19:36:56 · 353 阅读 · 1 评论 -
AOP思想个人理解以及实战静态代理、JDK动态代理、CGlib动态代理
AOP的介绍AOP(Aspect-Oriented Programming,面向切面编程[面向方面编程]),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并原创 2017-03-28 12:02:35 · 1023 阅读 · 0 评论 -
Java常用的数据库连接池【c3p0】【dbcp】
连接池介绍为什么使用数据库连接池??因为创建数据库connection对象,是一个非常浪费时间的过程,并且connection本来就是可以反复使用的。所以我们没必要关闭connection连接,既然不关闭连接,那就得让一个容器来进行管理了,继而有很多第三方提供了数据库连接的管理容器,比如c3p0,dbcp等等。用池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用原创 2017-06-19 18:26:46 · 1376 阅读 · 0 评论 -
ThreadLocal快速明白
ThreadLocal介绍这个介绍内容很重要,标志着你是否能够知道ThreadLocal出生的目的。 大家都知道,如果多个线程共享一份资源时,多个线程都有权限修改资源的条件下,极容易出现线程安全问题。但是如果这个资源不一定非得让多个线程共享时,即每个线程都能拥有一份属于自己资源的时候,为了方便的给每一个线程分配资源,即每个线程都有一份自己的资源,TreadLocal就提供了便利!!ThreadLo原创 2017-06-19 17:35:43 · 691 阅读 · 0 评论 -
ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系
ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系 看上面的框架图,先抓住它的主干,即Collection和Map。1 Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性。 Collection包含了List和Set两大分支。 (0转载 2017-06-06 15:38:48 · 895 阅读 · 0 评论 -
多线程通信【生产消费案例】
介绍:在多线程环境下,虽然,我们能够让两个线程安全的隔离的执行锁范围内所包含的代码块,但是还有个问题就是一个线程会在一个时间段类执行代码块很多次,但是我们的需求是让一个线程锁范围所包含的代码块在抢到CPU执行片后只执行一次,我们该怎么实现呢???等待和激活。那么在这种情况下,就非常需要两个东西了:等待和激活。notify();wait();注意:在wait()后,再次通过notify()激活线程时原创 2017-07-20 21:02:05 · 344 阅读 · 0 评论 -
一个经典例子让你彻彻底底理解java回调机制
以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式:Class A实现接口CallBack callback——背景1转载 2017-07-17 23:57:56 · 397 阅读 · 0 评论 -
Java和Python中的编码解码
# 注:\x為十六進制str_str = &amp;quot;中&amp;quot;# 編碼為 utf-8,返回為bytes類型str_bytes = str_str.encode(&amp;quot;utf-8&amp;quot;)# 獲取byte數組,相當於Java的byte數組str_list = []for x in str_bytes: print(x) str_list.append(x)原创 2018-10-02 23:25:55 · 1054 阅读 · 0 评论 -
RSA前后台加密解密
工具类都是无状态的,谨记前台公钥加密,后台用私钥解密。RSAUtils.java后台代码包含了分段加密用的是JDK的RSA加密/** * @Author 胡艺宝 * @Version 1.0 * @Date: 1/4/2018 * @Time: 1:09 PM */public class RSAUtils { protected static final Log log原创 2018-01-04 15:57:07 · 1998 阅读 · 2 评论 -
线程池的基本用法与相对定时+绝对定时的策略
一.线程池的概念与引入1.线程池的引入 首先介绍在tcp服务器变成模型的原理,每一个客户端连接用一个单独的线程为之服务,当与客户端的会话结束时,线程也就结束了,即每来一个客户端连接,服务器端就要创建一个新线程。这好比假设每个报名学员都要通过我来亲自接待,以便给每个学员一种好的感觉,但每个学员报名手续要花费半小时,对于50名同学,我一个个接待何为之办理手续,显然不实际,我会怎么做呢?我会闲接待每一转载 2017-12-11 11:31:38 · 570 阅读 · 2 评论 -
多个线程间共享数据的几种方式
第一种情况 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做public class MultipThreadShareData { public static void main(String[] args) {//买票系统 ShareData1 data1 = new Share转载 2017-12-11 10:53:55 · 3343 阅读 · 0 评论 -
util包下的Date和sql包下的Date的转换
数据库类型与java中类型的对应关系: DATE->java.sql.Date TIME->java.sql.Time TIMESTAMP->java.sql.Timestamp在写web项目的时候,在除DAO以外的地方是不允许出现java.sql包下的东西,但是往往我们会看到一些情况:域对象(domain)中的所有属性不能出现java.sql包下的东西!即不能使用java.sql.D转载 2017-11-12 16:56:19 · 1635 阅读 · 0 评论 -
JAVA多线程实现的四种方式
Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。 其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。1、继承Thread类创建线程 Thread类本质上是实现了Runnable转载 2017-10-19 18:16:07 · 344 阅读 · 1 评论 -
Java中反射的使用详解
在使用反射前要了解的基础知识:(虽然有几个,但是每个都内容少) 1.Java中类的加载概述和加载时机 2.Java中类加载器概述 3.Java中反射的概述反射获取class文件对象的几种方式1.Object类的getClass()方法 2.数据类型的静态属性class 3.Class类中的静态方法,public static Class forName(String className)p原创 2016-11-17 19:35:00 · 1172 阅读 · 1 评论 -
彻底理解ThreadLocal
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的转载 2017-07-25 10:40:37 · 378 阅读 · 0 评论 -
多线程【概述+基本使用】
多线程概述多线程概述进程:正在运行的程序,是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。线程:是进程中的单个顺序控制流,是一条执行路径一个进程如果只有一条执行路径,则称为单线程程序。一个进程如果有多条执行路径,则称为多线程程序。Java程序运行原理java 命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会原创 2017-07-22 20:47:34 · 394 阅读 · 0 评论 -
多线程面试题【一】
1:多线程有几种实现方案,分别是哪几种? 两种。继承Thread类实现Runnable接口扩展一种:实现Callable接口。这个得和线程池结合。2:同步有几种方式,分别是什么? 两种。同步代码块同步方法3:启动一个线程是run()还是start()?它们的区别? start();run():封装了被线程执行的代码,直接调用仅仅是普通方法的调用start():原创 2017-07-22 18:19:29 · 498 阅读 · 0 评论 -
Java中ArrayList和LinkedList区别
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayL转载 2017-07-10 10:51:01 · 376 阅读 · 0 评论 -
多线程死锁代码
死锁死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。代码实战:/** * Created by FireLang on 2017-07-18. */public class DieThread extends Thread{ /原创 2017-07-18 01:56:15 · 738 阅读 · 0 评论 -
多线程出现明显的抢占【ForYou】
/** * Created by FireLang on 2017-07-18. */public class TheardRunnable implements Runnable{ private static int count = 0; @Override public void run() { synchronized (this){原创 2017-07-18 01:41:23 · 373 阅读 · 0 评论 -
字节码指令级别从i++说到volatile,深入理解i++的线程安全问题
接下来的内容你可能会看得很恼火,但是请你仔细阅读,不懂的细节就百度,理解了这篇文章,对你的多线程安全将有很大幅度的提升,而不是只限于语法级别。笔者序很久都没有静下心写博客了,记得上次——也许没有上次。哈哈哈。为自己而活,不是为你喜欢的人,也不是为你觉得重要的人。他们在你脆弱、迷茫、孤独,最需要帮助的时候,他们可能不会想到你,但是你自己却是能够及时的想到自己,知道自己最需要什么。写博客地点:高新区文轩原创 2017-07-16 14:56:11 · 1954 阅读 · 0 评论 -
线程和进程、程序、应用程序之间的关系
看到一种说法是“一个程序至少有一个进程,一个进程至少有一个线程”,这种把程序与进程,进程与线程的关系混淆的说法是错误的。程序(program)只能有一个进程,一个进程就是一个程序。有人说,我打开一个程序,比如chrome,有十多个进程呢,这是咋回事。那就是十多个程序,操作系统给他们分配了彼此独立的内存,相互执行不受彼此约束,分配同样时间的CPU。对于用户而言,他们是一个整体,我们通常称之为应用程序转载 2017-06-05 11:53:29 · 1735 阅读 · 0 评论 -
Java继承中概念的混淆
介绍目的:充分理解到继承和实现的概念。 继承:Java中,继承只能继承一个类。 实现:Java中,一个类可以实现多个接口。实践interface Intera{}class Bimpl implements Intera{}class CExtend extends Bimpl{}public class ShowInterfaces { /* * 很多Java程序员把继承和实原创 2017-04-27 20:29:15 · 1139 阅读 · 4 评论 -
JAVA String对象和字符串常量的关系解析
JAVA String对象和字符串常量的关系解析1 字符串内部列表 JAVA中所有的对象都存放在堆里面,包括String对象。字符串常量保存在JAVA的.class文件的常量池中,在编译期就确定好了。虚拟机为每个被装载的类型维护一个常量池。常量池就是该类型所用常量的一个有序集合,包括直接常量(string、integer和float point常量)和对其他类型、字段和方法的符号引用。例如,S转载 2017-04-14 09:51:24 · 2614 阅读 · 0 评论 -
ArrayList和LinkedList效率解说
问题当ArrayList有1000容量,ArrayList和LinkedList里面都已经有了999条数据时, 分别向ArrayList和LinkedList里面加1条数据或者2条数据时,谁快,谁慢??向两个集合中添加一条数据,谁快,谁慢?ArrayList只是判断是否超过最小容量,没有超过就直接赋值到数组最后。 LinkedList是new Node()对象,把我们传进去的参数进行封装,然后直原创 2017-04-05 11:50:19 · 921 阅读 · 0 评论 -
Java构造器排序
二、构造器排序:java.util.Comparator 上篇博客(自然排序)我提到了之所以提供比较器排序接口,是因为有时需要对同一对象进行多种不同方式的排序,这点自然排序 Comparable 不能实现。另外, Comparator 接口的一个好处是将比较排序算法和具体的实体类分离了。 翻翻 API 会发现, Arrays.sort 还有种重载形式:sort(T[] a, Comp原创 2017-03-31 14:51:51 · 881 阅读 · 0 评论 -
Java自然排序
这里所说到的Java中的排序并不是指插入排序、希尔排序、归并排序等具体的排序算法。而是指执行这些排序算法时,比较两个对象“大小”的比较操作。我们很容易理解整型的 i>j 这样的比较方式,但当我们对多个对象进行排序时,如何比较两个对象的“大小”呢?这样的比较 stu1 > stu2 显然是不可能通过编译的。为了解决如何比较两个对象大小的问题,JDK提供了两个接口 java.lang.Comparabl原创 2017-03-31 14:47:43 · 1168 阅读 · 0 评论 -
Junit开始使用时报错
导入几个包就行了下载地址原创 2017-03-13 11:05:58 · 773 阅读 · 0 评论 -
JDBC:深入理解PreparedStatement和Statement
前言最近听一个老师讲了公开课,在其中讲到了PreparedStatement的执行原理和Statement的区别。当时听公开课老师讲的时候感觉以前就只知道PreparedStatement是“预编译类”,能够对sql语句进行预编译,预编译后能够提高数据库sql语句执行效率。但是,听了那个老师讲后我就突然很想问自己,预编译??是谁对sql语句的预编译??是数据库?还是PreparedStatement原创 2017-04-07 12:43:27 · 22416 阅读 · 18 评论 -
JavaMail登录163发送QQ邮箱
邮件协议1.收发邮件 发邮件大家都会吧!发邮件是从客户端把邮件发送到邮件服务器,收邮件是把邮件服务器的邮件下载到客户端。 我们在163、126、QQ、sohu、sina等网站注册的Email账户,其实就是在邮件服务器中注册的。这些网站都有自己的邮件服务器。2.邮件协议概述 与HTTP协议相同,收发邮件也是需要有传输协议的。SMTP:(Simple Mail Transfer Protocol原创 2016-12-22 22:46:33 · 6716 阅读 · 1 评论 -
Java中通过反射越过泛型检查
要想Java通过反射越过泛型检查,你就得先明白,泛型是在什么时候起作用的。泛型是在编译期间起作用的。在编译后的.class文件中是没有泛型的。所有比如T或者E类型啊,本质都是通过Object处理的。编译时是调用检查你的源程序是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。运行时是java虚拟机解释执行字节码文件。即泛型就是那些语法错误的规则。明白了上面的东西,标题提到的目标原创 2016-11-21 19:31:40 · 2074 阅读 · 2 评论