Java
杨鲜生
纸上得来终觉浅,绝知此事要躬行。
展开
-
java设计模式之观察者模式
最近在学高级程序设计这门课,讲到了设计模式,于是整理一下。1.观察者模式的定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。2.观察者模式的类图:3.定义抽象主题package com.observer;import java.util.ArrayList;import java.util.List;publi原创 2017-03-31 15:18:42 · 179 阅读 · 0 评论 -
jAVA中静态初始化块、初始化块和构造方法的理解
在Java中,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。非静态初始化块:作用:给对象进行初始化。对象一建立就运行,且优先于构造函数的运行。与构造函数的区别:非静态初始化块给所有对象进行统一初始化,构造函数只给对应对象初始化。应用:将所有构造函数共性的东西定义在构造代码块中。静态初转载 2017-09-14 22:08:27 · 432 阅读 · 0 评论 -
List list = new ArrayList()等接口 new 实现类()的作用
List是一个接口,而ArrayList是List接口的一个实现类。ArrayList类继承并实现了List接口。因此,List接口不能被构造,不能创建实例对象,但是我们可以像下面这样为List接口创建一个指向自己的对象引用,而ArrayList实例对象就在这充当了这个指向List接口的对象引用。接口 a = new 实现类();这是多态的一种形式。我们知道父类或者接口中没有的方法,但是子原创 2017-09-27 11:35:35 · 4733 阅读 · 2 评论 -
类加载机制
昨天做java面试题时遇到一道题,说类方法中可以直接调用对象变量,判断对错。答案是错的,应为类方法(静态方法)中不能调用对象的变量,因为静态方法在类加载时就初始化,对象变量需要在新建对象后才能使用。于是把类加载机制学习一下(不会的就要多看)。类从被加载到虚拟机中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparatio原创 2017-09-11 11:44:05 · 212 阅读 · 0 评论 -
java中获取二维数组的行数和列数
二维数组其实是由一维数组组成,比如int[][] arr = { {2,3,4}, {4,5,6}, {7,8,9} };int rows = i.length;//行数int columns = i[0].length;//列数这就像从数据库中查出来的数据,都是二维数组,length就是行数,列数是具体到其中的一维里面在求length。原创 2017-09-19 22:02:31 · 40641 阅读 · 0 评论 -
java中队列的使用
import java.util.LinkedList;import java.util.Queue;public class Test { public static void main(String[] args) { Queue queue = new LinkedList();//定义一个队列 queue.offer("张三");//添加元素 queue.offer(原创 2017-10-28 11:21:17 · 338 阅读 · 0 评论 -
二叉树的层次遍历
二叉树的层次遍历就是从上到下,从左到右遍历,也就是广度优先遍历。二叉树的层次遍历,用队列实现,先将根节点入队列,只要队列不为空,然后出队,并访问,接着让节点的左右子树依次入队。public ArrayList PrintFromTopToBottom(TreeNode root) { ArrayList list = new ArrayList();//新建一个列表,用于存储数值原创 2017-10-28 11:46:23 · 371 阅读 · 0 评论 -
递归和非递归实现二叉树前序遍历
1.前序遍历就是根、左、右,按着这个顺序,先说递归实现//创建Node节点public class Node { private int data; private Node left; private Node right; public Node(int data, Node left, Node right){ this原创 2017-10-28 15:34:02 · 445 阅读 · 0 评论 -
java中打印数组的几种方法
做小练习的时候,经常用到数组的打印,下面总结一下。1.可以使用工具类ArraysSystem.out.println(Arrays.toString(arr));2.用比较原始的for循环for(int i=0;iSystem.out.println(i);}3.用增强for循环for(int each : arr){System.out.println原创 2017-10-15 22:00:23 · 2144 阅读 · 1 评论 -
java中堆、栈、方法区的理解
1.java中的栈(stack)和堆(heap)是java在内存(ram)中存放数据的地方.2.堆区:存储的全部是对象,每个对象都包含一个与之对应的class的信息。 jvm只有一个heap区,被所有线程共享,不存放基本类型和对象引用,只存放对象本身。堆的优劣势:堆的优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,java的垃圾收集器会自动收取这些不在使用的数据,但缺点是,由于要原创 2017-11-02 21:35:41 · 498 阅读 · 0 评论 -
方法重写(override)原则
方法的重写(override)两同两小一大原则:1.方法名相同,参数类型相同2.子类返回类型小于等于父类方法返回类型3.子类抛出异常小于等于父类方法抛出异常4.子类访问权限大于等于父类方法访问权限原创 2017-11-04 20:22:14 · 1516 阅读 · 0 评论 -
java中成员变量、局部变量、静态变量的区别
成员变量和局部变量的区别 成员变量: ①成员变量定义在类中,在整个类中都可以被访问。 ②成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。 ③成员变量有默认初始化值。 局部变量: ①局部变量只定义在局部范围内,如:函数内,语句内等,只在所属原创 2017-11-28 22:09:15 · 314 阅读 · 0 评论 -
java中产生随机数的方法
java中有时候需要用到随机数,所以就把产生随机数的方法总结一下。1.Math类有个静态方法random,Math.random()返回的是[0,1)之间的 double 类型的值,有时候用到了变形:(int)(Math.random()*n) 返回0到n-1的随机数。(int)(Math.random()*100)+1 返回1到100之间的随机数.2.Java中的Rand原创 2017-11-25 21:26:14 · 932 阅读 · 0 评论 -
优秀博客
1.资料下载http://cmsblogs.com/?page_id=19422.mysql资料http://www.cnblogs.com/lyhabc/p/3802704.html3.spring、springmvc、mybatis整合http://blog.csdn.net/zhshulin/article/details/379561054.git学习资料https://www...原创 2017-04-18 12:12:52 · 523 阅读 · 0 评论 -
shell命令之for循环
1.先看个小例子,打印出1-15#!/bin/bashfor i in `seq 15`do echo "NUM is $i"done seq 15是将1-15的数都列出来。关键字是for do done。2.求和#!/bin/bashsum=0for((i=1;i<=100;i++))do sum=`expr $i + $s...原创 2018-12-18 19:53:23 · 799 阅读 · 0 评论 -
动态语言、静态语言、脚本语言、解释型语言、编译型语言
本人是php程序员,也做过一年java的开发,学习过c语言,会JavaScript,再回想起来,感觉语言之间的区别有点迷惑,所以整理一下。1.动态语言动态语言是在运行时才确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。 例如PHP、ASP、Python、SQL、JavaScript、Unix Shell等等。动态语言的优势:思维不受束缚,可以任意发...原创 2019-01-04 22:02:00 · 6034 阅读 · 0 评论 -
剑指offer之查找
剑指offeroffer中有这样一道题,把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。初看这道题没有思路,而且也没有想到用二分法,看了解析,明白了,可以和以前学的二原创 2017-09-22 17:42:52 · 194 阅读 · 0 评论 -
eclipse里几个常用的快捷键
1.生成无参构造函数快捷键 ctrl+/2.生成有参构造函数 alt+shift+s +o(不是零)3.生成getter与setter快键键 alt+shift+s =>r => tab=>enter=>shift+tab=>enter4.清除没有用的引用包 快捷键 ctrl+shift+o(不是零)5.ctrl +shift +o 引入所有没有原创 2017-08-14 10:14:22 · 308 阅读 · 0 评论 -
折半查找
折半查找又叫二分查找,从中间开始查找,这个适用于有序的数据表。听别人说一个面试官,给面试者10次机会,猜他想到的一个词。这个也是用到了折半查找的思想(应该都玩过这个游戏吧,你问别人问题,别人只能回答是或者不是,是生物吗,能走路吗,有羽毛吗。。。),想想也没有那么难。// 非递归折半 int binary_search(int search_table[],int key) {原创 2017-04-14 10:11:11 · 1247 阅读 · 0 评论 -
java中打印数组
int[] arr = {1,5,6,12,35}; Arrays.toString(arr) //增强for循环for(int n: arr) System.out.println(n+", "); //for遍历for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + ", ");原创 2017-04-14 11:44:15 · 263 阅读 · 0 评论 -
java中equals和==的分析
前言遇到过好多次比较大小和是否相等的,对equal和==了解一些,但是不是很全面,今天就整理一下,梳理一下,没事了就常看一下。1.首先说“==”我们知道所有的对象都拥有标志(内存地址)和状态(数据),“==”就是用来比较两个对象的内存地址的,内存地址相同,则为同一个对象,system.out.println(a == b)就为ture。2.equalsequals的情况就有点复原创 2017-04-21 21:01:28 · 280 阅读 · 0 评论 -
Iterator和ListIterator比较
在使用java集合的时候,很多情况都能用到Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、LinkedList和Vector的时候可以使用。这两种迭代器有什么区别呢?下面我们详细分析。这里有一点需要明确的时候,迭代器指向的位置是元素之前的位置,如下图所示:这里假设集合List由四个元素List1、List2、Lis转载 2017-05-07 22:00:47 · 372 阅读 · 0 评论 -
Java多线程(一)
有好多面试题出关于多线程的,刚开始不是很清楚,很模糊,于是整理、总结一下。一、线程的生命周期及五种基本状态五种基本状态新建状态(new):当线程对象创建后,即进入了新建状态,如:Thread t = new MyThread();就绪状态(Runnable):当调用线程对象的start()方法,线程即进入就绪状态。处于就绪状态,只是说明此线程已经做好了准备,随时等待cpu调转载 2017-05-26 20:21:19 · 241 阅读 · 0 评论 -
自己实现数据库连接池
jdbc连接据库步骤中,最耗时的是建立连接的过程,所以可以把已经建立的连接存起来,等下回使用的时候在拿来使用,这样就能省好多时间。开源的数据库连接池也有很多,dbcp,c3p0等。下面自己简单实现数据库连接池建立和释放的过程。package com.datasource;import java.sql.Connection;import java.sql.DriverManager;i原创 2017-07-12 20:14:16 · 741 阅读 · 0 评论 -
多线程的两种方式
多线程的两种方式,第一种是继承Thread方法,重写run方法,第二种是实现Runnable接口,实现run方法。第一种Thread thread = new Thread(){ @Override public void run() { while (true) { try { Thread.sleep(500); } catch (Inter原创 2017-07-13 20:03:46 · 322 阅读 · 0 评论 -
多线程面试题
多线程面试题:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,主线程循环100次,如此循环50次。先出代码public class ThreadCommuication { public static void main(String[] args) { final Business business = new Business(); new Threa原创 2017-07-14 16:22:31 · 202 阅读 · 0 评论 -
冒泡排序之升华版
1.冒泡算法是依次比较两个相邻的位置,如果不符合规则,则交换,比较完这一趟后,在接着比较下一趟。用程序实现是这样的public static void main(String[] args) { int[] arr = new int[]{3,2,1,7,8,9}; maoPao(arr);} public static void maoPao(int[] ar原创 2017-06-28 11:24:14 · 245 阅读 · 0 评论 -
Tomcat8.0配置虚拟主机
一个tomcat里放多个项目,想把每个项目通过单独的域名来访问,这就需要将tomcat配置虚拟主机。网上找了好多例子,但是tomcat都不能启动了,试了好多方法,最后搞定了,现在分享出来,希望能帮到更多的人。1.首先是将域名解析到你的项目的ip地址。2.在conf/server.xml中有这样一段代码 <!--For clustering, please ta原创 2017-07-05 20:37:24 · 1179 阅读 · 0 评论 -
设计模式之装饰着模式
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。设计原则是多使用组合,少使用继承。装饰着模式的特点:1.装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。2.装饰对象包含一个真实对象的引用(reference)3. 装饰对象接受所有来自客户端的请求。它把这些原创 2017-08-01 20:00:59 · 189 阅读 · 0 评论 -
java日期转换
日期转换用到了SimpleDateFormat类,其中有两个方法format()和parse(),下面讲一下用法及可能出现的问题。parse方法:将字符串类型(java.lang.String)解析为日期类型(java.util.Date)format方法:将日期类型(Date)数据格式化为字符串(String)1.先说parse(),parse()是将字符串类型的解析为日期类型的原创 2017-08-10 15:40:05 · 400 阅读 · 0 评论 -
设计模式之静态代理模式
像平时租房子时,不用自己一间一间的找,一般都是找到中介,给中介说我要租什么样的房子,比如大小,房屋的朝向,有没有独卫等等,中介就直接帮我们找好了。中介在这里就扮演代理的角色,我们租房子的就是真实角色。静态代理也有一些要求:1.要有真实角色。2.要有代理角色。3.两者实现相同的接口,向代理传入真实角色的引用。4.调用代理的方法。写一个小例子package com.staticProxy;原创 2017-08-19 12:00:54 · 400 阅读 · 0 评论 -
单列设计模式几种写法的比较
单例模式有两种写法,懒汉式和饿汉式1.饿汉式:在程序启动或单列模式类被加载的时候,单例模式实例就已经被创建。2.懒汉式:当程序第一次访问单例模式实例时才进行创建。懒汉式实现了延迟加载的功能。选择:当单例模式在系统中经常被用到时,饿汉式是一个不错的选择。但如果单例模式在系统中很少使用或者几乎不会用到,那么可以选择懒汉式。好了,写代码吧。饿汉式代码public Si原创 2017-07-15 17:33:59 · 597 阅读 · 0 评论