Java
文章平均质量分 81
石头dhf
三人行必有吾师!
展开
-
JAVA:避免重复的创建对象
在实际开发中,重复使用同一个对象要比每次需要的时候就创建一个对象要好的多; 作为一个比较极端的反面例子,看下面这个语句: String s = new String("haha"); 改语句每次被执行时都会创建一个新的String实例,如果这种用法是在一个循环中,或者是在一个被频繁调用的方法中,将会有成千上万个String实例被创建,这样的做法是没有必要的,可改进成如下这样:转载 2017-05-29 10:49:18 · 1499 阅读 · 0 评论 -
那些年系统开发经历的性能坑经历总结
程序开发走过的N多坑,影响了性能和稳定性、异常多发地方。原创 2017-05-29 09:12:24 · 358 阅读 · 0 评论 -
怎样解决内存溢出
一、内存溢出类型 1、java.lang.OutOfMemoryError:PermGen space JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超转载 2017-05-31 09:41:33 · 306 阅读 · 0 评论 -
深入数组
1、实际的数组元素存储在堆(heap)内存中,数组引用变量是一个引用性类型的变量,被存储在栈(stack)内存中。2、当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会被逐个放入这块内存中,随着方法的执行结束,这个方法的内存栈也将销毁。因此所有方法中定义的变量都是放到内存中的;当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用,这个运行时数据区原创 2017-06-04 12:20:28 · 178 阅读 · 0 评论 -
java对象总结(上)
1、面向对象方法的三个基本特征:封装、继承、多态,继承是面向对象实现软件的复用,封装是将对象的细节隐藏提升类的内部安全,多态是子类对象可以直接赋值给父类变量但运行时依然保存子类的行为特征。2、类是具有共同属性、方法的对象的集合,类是对象的抽象,对象是类的实例。3、Static 修饰成员表明它是属于这个类共有的方法;静态成员不能访问非静态成员。4、构造器不能定义返回值类型,编译时会通不过原创 2017-06-05 07:02:29 · 227 阅读 · 0 评论 -
泛型总结
1、泛型:就是允许在定义类和接口时指定类型参数,这个类型形参将在生命变量、创建对象时确定。2、从泛型派生子类:被派生的父类和接口不能再包含类型形参,必须指明父类的泛型类型或者不指定默认为object类型。3、静态修饰地方不允许使用泛型形参。原创 2017-06-12 21:47:25 · 177 阅读 · 0 评论 -
浮点数在计算机中存储方式
作者: jillzhang 联系方式:jillzhang@126.com 本文为原创,转载请保留出处以及作者, 谢谢 C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,转载 2017-06-18 12:19:51 · 264 阅读 · 0 评论 -
java运行环境总结
1、main参数的args 数组接受外界的输入:例如:Java Test xue xi "Java spring";如果参数本身包含空格用""括起来。2、String str = "java"+"struts"+"spring";会生成额外的javastruts和strutsspring额外的两个字符串变量;这个共在内存生成6个变量。3、string so="hello"; 存储在常量池中原创 2017-06-18 10:26:23 · 334 阅读 · 0 评论 -
java异常处理总结
1、Java异常分为两种:Checked异常和Runtime异常;java认为Checked异常都是可以在编译阶段被处理的异常,所以它强制进行处理;Runtime异常无须处理、2、Exception {1、SQLException //常用异常结构 2、IOEException 3、Runti原创 2017-06-18 19:14:36 · 272 阅读 · 0 评论 -
sql: where条件中AND、OR运算符的组合使用
AND、OR运算符的组合使用在WHERE子句中,通过AND、OR运算符可以同时连接多个条件,当然AND、OR运算符也可以同时使用。但是当AND、OR运算符同时存在时,其优先级如何确定呢?与大多数语言一样,SQL语言认为AND运算符的运算级别要高于OR运算符。即当出现condition1OR condition2 AND condition3转载 2017-06-21 11:14:55 · 61940 阅读 · 1 评论 -
java集合总结
1、set是一个罐子记不住放入元素的顺序,不允许元素重复;list集合像个数组可以记住元素的顺序;map只能存储键值对;queue表示队列。2、itretrator接口进行迭代时不可以修改集合里的元素,否则将引起运行异常。foreach遵循同样。3、hashset不是同步的,它的判断元素是否相等是通过equal方法和对象的hashCode方法判断的。原创 2017-06-10 22:37:27 · 209 阅读 · 0 评论 -
用Java实现非阻塞通信
用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式。这些服务器程序或客户程序在运行过程中常常会阻塞。例如当一个线程执行ServerSocket的accept()方法时,假如没有客户连接,该线程就会一直等到有了客户连接才从accept()方法返回。再例如当线程执行Socket的read()方法时,如果输入流中没有数据,该线程就会一直等到读入了足够的数转载 2017-07-13 15:56:28 · 2282 阅读 · 0 评论 -
java.lang.OutOfMemoryError: PermGen space及其解决方法
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同转载 2017-07-06 11:23:10 · 256 阅读 · 0 评论 -
java synchronized类锁,对象锁详解(转载)
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 二、然而,当一个线程访问object的一个synch转载 2017-07-31 00:22:05 · 499 阅读 · 0 评论 -
Java并发集合操作中对锁的应用
摘要: 通过锁解决在不同线程读取和修改集合引发的问题。下面以List结合为例子,先来看以下代码:public static ArrayListdatas=new ArrayList();//初始化数据 public static void initData(){ for(int i=0;i20;i++){ datas.add(""+i); } } //线转载 2017-07-30 23:40:10 · 584 阅读 · 0 评论 -
数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)
第1章 引言随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。水平切分数据库:可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失;负载均衡策略:可以降低单台机器的访转载 2017-08-17 11:08:14 · 177 阅读 · 0 评论 -
jvm内存GC详解
一、相关概念 a. 基本回收算法 1. 引用计数(Reference Counting) 比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。 2. 标记-清除(Mark-Sweep) 此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对转载 2017-08-21 09:20:38 · 194 阅读 · 0 评论 -
JVM(Java虚拟机)优化大全和案例实战
堆内存设置原理JVM堆内存分为2块:Permanent Space 和 Heap Space。Permanent 即 持久代(Permanent Generation),主要存放的是Java类定义信息,与垃圾收集器要收集的Java对象关系不大。Heap = { Old + NEW = {Eden, from, to} },Old 即 年老代(Old Generation),Ne转载 2017-08-21 09:04:32 · 168 阅读 · 0 评论 -
秒杀系统的架构解决之道
秒杀 架构2017-04-24 朱超 10203 阅读本文将会从三个方面来分别探讨如何设计应用架构以更好的支持“秒杀”类需求,包括秒杀带来的问题和挑战、产品架构解决之道、流量控制解决方案。秒杀场景下带来的海量用户所造成的流量突增对系统冲击力可想而知,瞬时流量之高一方面造成的读写冲突,数据库锁会非常严重,另一方面应用服务器能否撑住也是一个问题。同时由于秒杀业务一般是各转载 2017-08-20 17:01:14 · 254 阅读 · 0 评论 -
史上最清晰的红黑树讲解(上)
本文github地址本文以Java TreeMap为例,从源代码层面,结合详细的图解,剥茧抽丝地讲解红黑树(Red-Black tree)的插入,删除以及由此产生的调整过程。总体介绍Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也转载 2017-08-01 11:28:06 · 260 阅读 · 0 评论 -
《Thinking In Algorithm》06.Binary search tree(二叉查找树)
The search tree data structure supports many dynamic-set operations, includingSEARCH,MINIMUM,MAXIMUM,PREDECESSOR,SUCCESSOR,INSERT, andDELETE. Thus, we can use a search tree both as a dictionary and转载 2017-07-31 21:10:07 · 269 阅读 · 0 评论 -
JVM 的类初始化机制
文章目录1. Loading, Linking, and Initialization1.1. Loading1.2. Linking1.2.1. Verification1.2.2. Preparation1.2.3. Resolution1.3. Initialization2. 示例2.1. 属性在不同时期的赋值2.2. 主动调用 vs. 被动转载 2017-07-30 12:13:10 · 357 阅读 · 0 评论 -
JAVA并发编程学习笔记之CAS操作
CAS操作CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。我们常常做这样的操作[java] view plain copy print?if(a==b) { a++; } if(a==b) { a++;}试想一下如果在做a++之前a的值被改变了怎转载 2017-07-06 11:35:07 · 201 阅读 · 0 评论 -
【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313happen—before规则介绍 Java语言中有一个“先行发生”(happen—before)的规则,它是Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,其意思就是说,在发生操作B之前,操作A产生的影响都能被操作B观察到,“转载 2017-07-04 00:17:11 · 232 阅读 · 0 评论 -
Java中CAS详解
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制转载 2017-07-03 14:12:13 · 249 阅读 · 0 评论 -
Java 防SQL注入方法
Java 防SQL注入方法转载 2017-06-21 10:38:39 · 2487 阅读 · 0 评论 -
Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解
前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误。其实sql注入漏洞就是一个。作为一个菜鸟小程序员,我对sql注入的东西了解的也不深入,所以抽出时间专门学习了一下。现在把学习成果分享给大家,希望可以帮助大家学习。下面我们就来看一下。一、什么是sql注入呢? 所转载 2017-06-20 23:47:21 · 280 阅读 · 0 评论 -
深入类加载器----线程上下文类加载器
深入类加载器(四)----线程上下文切换类加载器 线程上下文类加载器 我们知道在Java中的加载器的加载模式是双亲委托模式,这种模式是遵从父类优先的原则。但是在一些场合中,这种双亲委托机制反而是行不通的。最典型的是JDBCApi:其实JDBCApi包括俩部分:一部分是oragle公司提供的接口类,一部分是转载 2017-07-23 19:44:16 · 275 阅读 · 0 评论 -
并发编程1-线程池实现原理解析
1、线程池的实现原理:1)、当线程池初始化时,线程池里没有线程,当提交一个任务到线程池后,判断核心线程池里的线程数是否达到corePoolSize,如果没有则进行创建一个新的工作线程来执行任务。2)、如果核心线程池已经满,则把任务准备添加到工作队列,判断工作队列是否已经满,如果没有满添加到工作队列等待线程来取;工作中的线程完成工作后会从工作队列取新的任务进行执行;3)、如果工作队列满了原创 2017-08-24 16:57:20 · 280 阅读 · 0 评论 -
JSP四种页面跳转的分析和总结
1、静态编译指令include 2、jsp forward指令 3、动态jsp 编译指令 4、response重定向区别:1、静态include导入是把整个页面都完全融入一个整体servlet,动态导入是用Servlet的include方法来引入的导入页面内容(body部分)。静态导入时被导入的页面的编译指令会起作用。2、forword是替代原理的界面,in原创 2017-08-26 17:38:19 · 396 阅读 · 0 评论 -
Spring事务传播机制
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务上下文的规则(是否要有独立的事务隔离级别和锁) 概述当我们调用一个基于Spring的Service接口方法(如UserService#addUser())时,它将运行于Sp转载 2017-09-22 20:33:02 · 255 阅读 · 0 评论 -
java web体系发展历史和未来
1、原始的web页面是HTML,原始的JAVA是用作嵌入式开发的。2、由于静态页面不会动态的更新信息,需要动态显示。java产生的servlet规范,可以动态的生成页面。3、由于servlet生成页面需要手工写很多不友好且重复的输出语句,发展了JSP规范来辅助servlet支持生成页面。4、由于jsp结合servlet开发的系统后期非常不便于维护、并且不能对很多重复代码公用,产生了MV原创 2017-09-01 23:22:59 · 680 阅读 · 0 评论 -
Java单例模式例子
Java 单例模式的实例代码原创 2017-06-08 12:16:34 · 1078 阅读 · 0 评论 -
Servlet生命周期与工作原理
大多数程序员都知道Servlet的生命周期,简单的概括这就分为四步:servlet类加载--->实例化--->服务--->销毁。对这个过程只是肤浅了解下,对于servlet何时被销毁,还是不太情楚。下面我们描述一下Tomcat与Servlet是如何工作的,首先看下面的时序图。Web Client 向Servlet容器(Tomcat)发出Http请求;Servlet容器接收Web Cli转载 2017-09-01 23:06:05 · 899 阅读 · 0 评论 -
servlet总结
1、servlet原创 2017-09-01 23:12:48 · 274 阅读 · 0 评论 -
ArrayList JDK9源码解读
1、modCount = 0; 属性记录容器修改的版本号,在进行Iterator的next时,检查list是否修改,如果修改抛出ConcurrentModificationException();public E next() { //检查list是否修改,如果修改抛出ConcurrentModificationException(); checkF原创 2017-10-06 23:38:17 · 529 阅读 · 0 评论 -
ThreadLocal的用法、原理和用途
一、何谓“ThreadLocal”ThreadLocal是一个线程局部变量,我们都知道全局变量和局部变量的区别,拿Java举例就是定义在类中的是全局的变量,各个方法中都能访问得到,而局部变量定义在方法中,只能在方法内访问。那线程局部变量(ThreadLocal)就是每个线程都会有一个局部变量,独立于变量的初始化副本,而各个副本是通过线程唯一标识相关联的。二、ThreadLoca转载 2017-09-30 10:50:00 · 923 阅读 · 0 评论 -
ThreadLocal封装Connection--事务统一管理
由于请求中的一个事务涉及多个 DAO 操作,而这些 DAO 中的 Connection 不能从连接池中获得,如果是从连接池获得的话,两个 DAO 就用到了两个Connection,这样的话是没有办法完成一个事务的。DAO 中的 Connection 如果是从 ThreadLocal 中获得 Connection 的话那么这些 DAO 就会被纳入到同一个 Connection 之转载 2017-10-01 11:12:21 · 415 阅读 · 0 评论 -
CGLIB介绍
CGLIB介绍与原理(部分节选自网络)一、什么是CGLIB?CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。二、CGLIB原理CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所转载 2017-11-11 22:47:53 · 566 阅读 · 0 评论 -
java安全管理器SecurityManager入门
一、文章的目的 这是一篇对Java安全管理器入门的文章,目的是简单了解什么是SecurityManager,对管理器进行简单配置,解决简单问题。 比如在阅读源码的时候,发现这样的代码,想了解是做什么的:SecurityManager security = System.getSecurityManager();if (security != null) { secur转载 2017-11-05 08:19:20 · 5430 阅读 · 2 评论