Category - JAVA

Java JFrame在去掉标题栏后实现拉大收缩边框的功能

By go - 星期四, 四月 27, 2017

 思路是把JFrame分成九个区域,八个boolean状态变量,当然,是虚拟的划分,注册mouse move事件,当鼠标进入不同区域的时候设置八个boolean状态变量的值,同时改变鼠标指针状态,然后注册mouse down事件,根据八个boolean状态变量的值确定应该如何Resize 详细例子…………………………………………………………………………………………………………………………………………………….package com.ljheee.frame;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ResizeFrame extends JFrame {

     private boolean isTopLeft;// 是否处于左上角调整窗口状态
        private boolean isTop;// 是否处于上边界调整窗口状态
        private boolean isTopRight;// 是否处于右上角调整窗口状态
        private boolean isRight;// 是否处于右边界调整窗口状态
        private boolean isBottomRight;// 是否处于右下角调整窗口状态
        private boolean isBottom;// 是否处于下边界调整窗口状态
        private boolean isBottomLeft;// 是否处于左下角调整窗口状态
        private boolean isLeft;// 是否处于左边界调整窗口状态
        private final static int RESIZE_WIDTH = 5;// 判定是否为调整窗口状态的范围与边界距离
        private final static int MIN_WIDTH = 20;// 窗口最小宽度
        private final static int MIN_HEIGHT = 20;// 窗口最小高度
         
        public ResizeFrame() {
            addMouseMotionListener(new ResizeAdapter(this));
        }
         
        private class ResizeAdapter extends MouseAdapter {
            private Component c;
             
            public ResizeAdapter(Component c) {
                this.c = c;
            }
             
            @Override
            public void mouseMoved(MouseEvent event) {
                int x = event.getX();
                int y = event.getY();
                int width = c.getWidth();
                int height = c.getHeight();
                int cursorType = Cursor.DEFAULT_CURSOR;// 鼠标光标初始为默认类型,若未进入调整窗口状态,保持默认类型
                // 先将所有调整窗口状态重置
                isTopLeft = isTop = isTopRight = isRight = isBottomRight = isBottom = isBottomLeft = isLeft = false;
                if (y <= RESIZE_WIDTH) {
                    if (x <= RESIZE_WIDTH) {// 左上角调整窗口状态
                        isTopLeft = true;
                        cursorType = Cursor.NW_RESIZE_CURSOR;
                    } else if (x >= width – RESIZE_WIDTH) {// 右上角调整窗口状态
                        isTopRight = true;
                        cursorType = Cursor.NE_RESIZE_CURSOR;
                    } else {// 上边界调整窗口状态
                        isTop = true;
                        cursorType = Cursor.N_RESIZE_CURSOR;
                    }
                } else if (y >= height – RESIZE_WIDTH) {
                    if (x <= RESIZE_WIDTH) {// 左下角调整窗口状态
                        isBottomLeft = true;
                        cursorType = Cursor.SW_RESIZE_CURSOR;
                    } else if (x >= width – RESIZE_WIDTH) {// 右下角调整窗口状态
                        isBottomRight = true;
                        cursorType = Cursor.SE_RESIZE_CURSOR;
                    } else {// 下边界调整窗口状态
                        isBottom = true;
                        cursorType = Cursor.S_RESIZE_CURSOR;
                    }
                } else if (x <= RESIZE_WIDTH) {// 左边界调整窗口状态
                    isLeft = true;
                    cursorType = Cursor.W_RESIZE_CURSOR;
                } else if (x >= width – RESIZE_WIDTH) {// 右边界调整窗口状态
                    isRight = true;
                    cursorType = Cursor.E_RESIZE_CURSOR;
                }
                // 最后改变鼠标光标
                c.setCursor(new Cursor(cursorType));
            }
             
            @Override
            public void mouseDragged(MouseEvent event) {
                int x = event.getX();
                int y = event.getY();
                int width = c.getWidth();
                int height = c.getHeight();
                // 保存窗口改变后的x、y坐标和宽度、高度,用于预判是否会小于最小宽度、最小高度
                int nextX = c.getX();
                int nextY = c.getY();
                int nextWidth = width;
                int nextHeight = height;
                if (isTopLeft || isLeft || isBottomLeft) {// 所有左边调整窗口状态
                    nextX += x;
                    nextWidth -= x;
                }
                if (isTopLeft || isTop || isTopRight) {// 所有上边调整窗口状态
                    nextY += y;
                    nextHeight -= y;
                }
                if (isTopRight || isRight || isBottomRight) {// 所有右边调整窗口状态
                    nextWidth = x;
                }
                if (isBottomLeft || isBottom || isBottomRight) {// 所有下边调整窗口状态
                    nextHeight = y;
                }
                if (nextWidth <= MIN_WIDTH) {// 如果窗口改变后的宽度小于最小宽度,则宽度调整到最小宽度
                    nextWidth = MIN_WIDTH;
                    if (isTopLeft || isLeft || isBottomLeft) {// 如果是从左边缩小的窗口,x坐标也要调整
                        nextX = c.getX() + width – nextWidth;
                    }
                }
                if (nextHeight <= MIN_HEIGHT) {// 如果窗口改变后的高度小于最小高度,则高度调整到最小高度
                    nextHeight = MIN_HEIGHT;
                    if (isTopLeft || isTop || isTopRight) {// 如果是从上边缩小的窗口,y坐标也要调整
                        nextY = c.getY() + height – nextHeight;
                    }
                }
                // 最后统一改变窗口的x、y坐标和宽度、高度,可以防止刷新频繁出现的屏闪情况
                setBounds(nextX, nextY, nextWidth, nextHeight);
            }
        }
         
        public static void main(String[] args) {
            // 一个简单的演示小例子
            JFrame frame = new ResizeFrame();
            frame.setSize(400, 300);
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            frame.setLocation((screenSize.width – frame.getWidth()) / 2, (screenSize.height – frame.getHeight()) / 2);
         
            //双击frame就退出
            frame.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent event) {
                    if (event.getClickCount() > 1) {
                        System.exit(0);
                    }
                }
            });
            frame.setUndecorated(true);
            frame.setVisible(true);
        }
 
}参引http://bbs.csdn.net/topics/350005772?page=1

JAVA

关于Java面试,你应该准备这些知识点

By go - 星期三, 四月 12, 2017

原文出处: 占小狼马老师说过,员工的离职原因很多,只有两点最真实:钱,没给到位 心,受委屈了当然,我是想换个平台,换个方向,想清楚为什么要跳槽,如果真的要跳槽,想要拿到一个理想的offer,除了运气,基本功也要足够的扎实,希望下面的面试经验能给你们能够提供一些帮助。项目经验面试官在一开始会让你进行自我介绍,主要是想让你介绍一下自己做过的一些项目,看看你对这些项目的了解程度,因为很多人简历上写的项目并非都是从头到尾都参与的,有些只是参与并实现了其中的一些模块而已,或是接手维护别人的项目,所以在你简历上所写的和面试过程中所说的项目经验,你自己必须能够了解来龙去脉,因为面试官肯定会根据你的项目描述,对项目中的实现原理,或为什么要这样实现进行提问,这时不至于木讷住而不知如何作答,如此局面只会大大降低面试分。场景对话:面试官:(拿着简历)讲讲你最近做的这个项目我:&……%¥#*&¥@%¥!,说了一大通(不知道面试官听进去多少,面试官会挑他会的进行提问)面试官:你说这个项目中用到了netty,能大概讲讲netty的线程模型么?我:(幸好我看过netty的源码)netty通过Reactor模型基于多路复用器接收并处理用户请求(能讲就多讲一点),内部实现了两个线程池,boss线程池和work线程池,其中boss线程池的线程负责处理请求的accept事件,当接收到accept事件的请求时,把对应的socket封装到一个NioSocketChannel中,并交给work线程池,其中work线程池负责请求的read和write事件(通过口述加画图的方式,把请求的执行过程大概描述了一遍,时间有限,也不可能把所有的细节都说完,挑重点讲,挑记忆深刻的讲)面试官:嗯,理解的还挺深入的…那你在做这个项目时有没有遇到什么困难,或者是觉得有挑战的地方?我:(这时面试官想让你自己出题自己回答了,所以一定要回答,不回答就突显不出你这个项目了,要是这个问题没有准备过,只能临时发挥了,当然我就是属于临时发挥的)稍微想一下,因为之前确实碰到了这个问题,当时做这个项目时,对netty的不过熟悉,把请求的业务逻辑放在work线程池的线程中进行处理,进行压测的时候,发现qps总是上不去,后来看了源码之后才发现,由于业务逻辑的处理比较耗时,完全占用了work线程池的资源,导致新的请求一直处于等待状态。面试官:那最后是如何解决的?我:最后把处理业务的逻辑封装成一个task提交给一个新建的业务线程池中执行,执行完之后由work线程池执行请求的write事件。面试官:好的,你知道nio中selector可能触发bug么?我:嗯,对的,selector的select方法,因为底层的epoll函数可能会发生空转,从而导致cpu100%。面试官:那如何解决该问题?我:这个问题在netty已经解决了,通过&^%&$^(把netty的解决方案说一遍)面试官:嗯,对了,你们这个项目有给自己定指标么?我:有的,&&…………¥¥##@,把自己项目的指标说了一通,如何进行AB实验,如何迭代优化指标面试官:嗯,好的 ,项目的问题先到这里,我们来考察一下java的基本点吧。如上只是本人所做的一个项目,当然了,具体项目具体分析,也不是每个面试官问的点都一样,如果面试官不懂netty,自然会挑别的问题进行提问,不过你也可以尝试着把问题往自己熟悉的方向去靠。面试知识点 1、线程池线程池的实现原理,这个知识点真的很重要,几乎每次面试都会被问到,一般的提问方式有如下几种:1、“讲讲线程池的实现原理”2、“线程池中的coreNum和maxNum有什么不同”3、“在不同的业务场景中,线程池参数如何设置”场景对话:面试官:平时线程池用的多么?我:嗯,我的*项目中就用到了面试官:那好,你讲讲线程池的实现原理我:(还好我之前看过源码,但是时间久远有点模糊了),能给我笔和纸么,我画图分析给你看看,&&¥&假设初始化一个线程池,核心线程数是5,最大线程数是10@@@面试官:嗯,好的,你继续…我:在纸上画了正方形,这个代表一个线程池,初始化的时候,里面是没有线程的面试官:嗯,好的,你继续…我:又画了一个细长的长方形,这个代表阻塞队列,一开始里面也是没有任务的面试官:嗯,好的,你继续…我:当来了一个任务时,在正方形中画了一个小圆圈,代表初始化了一个线程,如果再来一个任务,就再画一个圆圈,表示再初始化了一个线程,连续画了5个圆圈之后,如果第6个任务过来了…面试官:嗯,好的,你继续…我:这时会把第6个任务放到阻塞队列中..面试官:嗯,然后呢?我:现在线程池中不是有5个线程了么,如果其中一个线程空闲了,就会从阻塞队列中获取第6个任务,进行执行..面试官:嗯,对的,那如果任务产生的速度比消费的速度快呢?我:如果线程池的5个线程都在running状态,那么任务就先保存在阻塞队列中面试官:如果队列满了,怎么办?我:如果队列满了,我们不是设置了最大线程数是10么,而线程池中只有5个线程,这时会新建一个线程去执行不能保存到阻塞队列的任务,然后我又在正方形中画了5个圆圈。面试官:那如果线程池中的线程数达到10个了,阻塞队列也满了,怎么办?我:这种情况通过自定义reject函数去处理这里任务了,舒了一口去,以为问完了…面试官:好的,那如果运行一段时间之后,阻塞队列中的任务也执行完了,线程池中的线程会怎么样?我:…这个好像超过核心线程数的线程会在空闲一段时间内自动回收…因为有点不记得这个逻辑了,回答的有点虚…面试官:好的,那这种情况在什么场景下会发生?我:(有时候真是笨啊,很多东西都知道,但是在面试的时候一紧张,全忘记)这个…那个…我好像没有遇到过这样的情况面试官:嗯,好的,你回去之后再好好想想我:……..我居然忘记了秒杀这个场景线程池分析的文章:深入分析java线程池的实现原理2、锁的实现在关于锁的面试过程中,一般主要问Synchronized和ReentrantLock的实现原理,更有甚者会问读写锁。场景对话:面试官:都了解Java中的什么锁?我:比如Synchronized和ReentrantLock…读写锁用的不多,就没研究了(我就怕被问读写锁,因为一直没去看)面试官:那好,你先说说Synchronized的实现原理吧我:嗯,Synchronized是JVM实现的一种锁,其中锁的获取和释放分别是monitorenter和monitorexit指令,该锁在实现上分为了偏向锁、轻量级锁和重量级锁,其中偏向锁在1.6是默认开启的,轻量级锁在多线程竞争的情况下会膨胀成重量级锁,有关锁的数据都保存在对象头中…&&@@#,(嗯,说了一大堆,面试官也没打断我)面试官:哦,嗯,理解的还挺透彻,那你说说ReentrantLock的实现吧…我:ReentrantLock是基于AQS实现的面试官:什么是AQS?我:在AQS内部会保存一个状态变量state,通过CAS修改该变量的值,修改成功的线程表示获取到该锁,没有修改成功,或者发现状态state已经是加锁状态,则通过一个Waiter对象封装线程,添加到等待队列中,并挂起等待被唤醒&&&$$(又说了一堆)面试官:能说说CAS的实现原理么?我:CAS是通过unsafe类的compareAndSwap方法实现的(心里得意的一笑)面试官:哦,好的,那你知道这个方法的参数的含义的么?我:(这是在逼我啊…努力的回想,因为我真的看过啊)我想想啊,这个方法看的时间有点久远了,第一个参数是要修改的对象,第二个参数是对象中要修改变量的偏移量,第三个参数是修改之前的值,第四个参数是预想修改后的值….(说出来之后都有点佩服自己,这个都记得,不过面试官好像还是不肯放过我…)面试官:嗯,对的,那你知道操作系统级别是如何实现的么?我:(我去你大爷…)我只记得X86中有一个cmp开头的指令,具体的我忘记了…面试官:嗯,好,你知道CAS指令有什么缺点么我:哦,CAS的缺点是存在ABA问题面试官:怎么讲?我:就是一个变量V,如果变量V初次读取的时候是A,并且在准备赋值的时候检查到它仍然是A,那能说明它的值没有被其他线程修改过了吗?如果在这段期间它的值曾经被改成了B,然后又改回A,那CAS操作就会误认为它从来没有被修改过。面试官:那怎么解决?我:(有完没完了啊…我的心里是崩溃的)针对这种情况,java并发包中提供了一个带有标记的原子引用类”AtomicStampedReference”,它可以通过控制变量值的版本来保证CAS的正确性。面试官:嗯,好的,这个问题到此为止,我们再看看别的我:….我能喝口水么关于锁分析的文章,希望对大家有用:深入浅出java同步器AQSjava中的CAS深入浅出synchronized深入浅出ReentrantLockjava中的Unsafejava volatile关键字解惑深入分析Object.wait/notify实现机制深入分析synchronized的JVM实现3、ConcurrentHashMap当考察数据结构时,面试官一开始会问HashMap的实现原理,当你说出HashMap并非线程安全之后,会让你自己引出ConcurrentHashMap,接着就可能开始如下的对话。场景对话:面试官:谈谈ConcurrentHashMap实现原理我:@#¥@@基于分段锁的%%¥#@#¥,但是1.8之后改变实现方式了面试官:1.8啥方式我:把1.8的实现原理说了一通,其中提到了红黑树…面试官:能讲下红黑树的概念吗我:红黑树是一种二叉树,并且是平衡……%……¥……,面试官:能讲下红黑树的。。。。。我:打住,别问了,红黑树我只知道他是二叉树,比其他树多一个属性,其他的我都不知道面试官:好的,那换个,你知道它的size方法是如何实现的么?我:size方法?是想要得到Map中的元素个数么?面试官:对的….我:我记得好像size方法返回是不准确的,平时也不会用到这个方法…面试官:如果你觉得size方法返回值不准确,那如果让你自己实现,你觉得应该怎么实现呢?我:…@#¥@@…两眼一黑我:等等,让我想想…..应该可以用AtomicInteger变量进行记录…嗯,对的,每次插入或删除的时候,操作这个变量,我得意的一笑…面试官:哦,是么,那如果我觉得这个AtomicInteger这个变量性能不好,还能再优化么?我:懵逼脸…(当时居然把volitile变量给忘记了)…好像没有了,我想不出来了…面试官:哦,那回头你再看看源码吧,jdk中已经实现了…我:哦,是么….面试官:那今天的面试到此结束,我们后面会通知你。我:………………关于ConcurrentHashMap,本人也写过不少的分析文章,希望对大家有用:深入浅出ConcurrentHashMap(1.8)谈谈ConcurrentHashMap1.7和1.8的不同实现ConcurrentHashMap的红黑树实现分析深入分析ConcurrentHashMap1.8的扩容实现

SpringBoot的事务管理

By go - 星期二, 四月 11, 2017

原文出处: fangjian0423Springboot内部提供的事务管理器是根据autoconfigure来进行决定的。比如当使用jpa的时候,也就是pom中加入了spring-boot-starter-data-jpa这个starter之后(之前我们分析过springboot的自动化配置原理)。Springboot会构造一个JpaTransactionManager这个事务管理器。而当我们使用spring-boot-starter-jdbc的时候,构造的事务管理器则是DataSourceTransactionManager。这2个事务管理器都实现了spring中提供的PlatformTransactionManager接口,这个接口是spring的事务核心接口。这个核心接口有以下这几个常用的实现策略:HibernateTransactionManager DataSourceTransactionManager JtaTransactionManager JpaTransactionManager具体的PlatformTransactionManager继承关系如下:spring-boot-starter-data-jpa这个starter会触发HibernateJpaAutoConfiguration这个自动化配置类,HibernateJpaAutoConfiguration继承了JpaBaseConfiguration基础类。在JpaBaseConfiguration中构造了事务管理器:@Bean
@ConditionalOnMissingBean(PlatformTransactionManager.class)
public PlatformTransactionManager transactionManager() {
return new JpaTransactionManager();
}spring-boot-starter-jdbc会触发DataSourceTransactionManagerAutoConfiguration这个自动化配置类,也会构造事务管理器:@Bean
@ConditionalOnMissingBean(PlatformTransactionManager.class)
@ConditionalOnBean(DataSource.class)
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(this.dataSource);
}Spring的事务管理器PlatformTransactionManager接口中定义了3个方法:// 基于事务的传播特性,返回一个已经存在的事务或者创建一个新的事务
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

// 提交事务
void commit(TransactionStatus status) throws TransactionException;

// 回滚事务
void rollback(TransactionStatus status) throws TransactionException;其中TransactionDefinition接口表示跟spring兼容的事务属性,比如传播行为、隔离级别、超时时间、是否只读等属性。DefaultTransactionDefinition类是一个默认的TransactionDefinition实现,它的传播行为是PROPAGATION_REQUIRED(如果当前没事务,则创建一个,否则加入到当前事务中),隔离级别是数据库默认级别。TransactionStatus接口表示事务的状态,比如事务是否是一个刚构造的事务、事务是否已经完成等状态。下面这段代码就是传统事务的常见写法:transaction.begin();
try {

transaction.commit();
} catch(Exception e) {

transaction.rollback();
} finally {

}由于spring的事务操作被封装到了PlatformTransactionManager接口中,commit和rollback方法对应接口中的方法,begin方法在getTransaction方法中会被调用。细心的读者发现文章前面构造事务管理器的时候都会加上这段注解:@ConditionalOnMissingBean(PlatformTransactionManager.class)也就是说如果我们手动配置了事务管理器,Springboot就不会再为我们自动配置事务管理器。如果要使用多个事务管理器的话,那么需要手动配置多个:@Configuration
public class DatabaseConfiguration {

@Bean
public PlatformTransactionManager transactionManager1(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}

@Bean
public PlatformTransactionManager transactionManager2(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}

}然后使用Transactional注解的时候需要声明是哪个事务管理器:@Transactional(value=”transactionManager1″)
public void save() {
doSave();
}Spring给我们提供了一个TransactionManagementConfigurer接口,该接口只有一个方法返回PlatformTransactionManager。其中返回的PlatformTransactionManager就表示这是默认的事务处理器,这样在Transactional注解上就不需要声明是使用哪个事务管理器了。参考资料:http://www.cnblogs.com/davidwang456/p/4309038.htmlhttp://blog.csdn.net/chjttony/article/details/6528344

JAVA

高手整理JAVA程序员面试总结

By Lee - 星期五, 二月 24, 2017

第一阶段:三年我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人。这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本 上的内容迈向真正的企业级开发。我们知道如何团队协作、如何使用项目管理工具、项目版本如何控制、我们写的代码如何测试如何在线上运行等等,积累了一定的 开发经验,也对代码有了一定深入的认识,是一个比较纯粹的Coder的阶段。

10个经典的Java main方法面试题

By - 星期日, 二月 21, 2016

以下是笔者认为比较经典的关于Java main方法的面试题,与其说是Java面试题,其实也是Java的一些最基础知识问题,分享给大家,如有错误,请指出。1.不用main方法如何定义一个类?不行,没有main方法我们不能运行Java类。在Ja

关于java堆内存溢出的几种情况

By Lee - 星期一, 十一月 16, 2015

【情况一】: java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环; 如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决

常见的三种Java内存溢出详解

By Lee - 星期四, 八月 27, 2015

 一、常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space —-JVM Heap(堆)溢出 JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-X

JAVA

java开发web使用struts2,springMVC和spring,Jquery的理由?

By Lee - 星期二, 六月 16, 2015

今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑问无法得到正确的解释,为什么我们现在做

JAVA设计模式和程序设计的面试问题

By - 星期二, 六月 9, 2015

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎么把一个问题分割成一段段代码或者软件设计,但这些能力和技

java获取汉字拼音首字母的简单方法

By Lee - 星期一, 六月 8, 2015

在项目中要更能根据某些查询条件(比如姓名)的首字母作为条件进行查询,比如查一个叫“李晓明”的人,可以输入‘lxm’。写了一个工具类如下: [java] view plaincopyprint?import java.io.Unsupport

JAVA

40个Java集合类面试题和答案

By - 星期二, 六月 2, 2015

Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点。这里,我列出了一些关于Java集合的重要问题和答案。 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集

大公司最喜欢问的Java集合类面试题

By - 星期二, 五月 19, 2015

看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧。 java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合

程序员电话面试50问答题

By Lee - 星期四, 五月 7, 2015

今年是2015年,在过去几年中,电面(电话面试)是筛选程序员职位候选人的最流行的方式。它让雇佣双方很容易互相了解对方,候选人不需要去未来雇主的所在地,面试官也不用做额外的安排。这是我介绍程序员面试问题的文章的第二部分。我得到反馈说第一部分过

25个经典的Spring面试问答

By - 星期二, 五月 5, 2015

本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可能在你下次面试时就会被问到。对于本文中未提及的Spring其他模块,我会单独分享面试的问题和答案。 欢迎大家向我推荐你在面试过程中遇到关于Spring的问题。我

程序员编程面试取胜的8个技巧

By - 星期三, 四月 22, 2015

IT职位现在相当热门。程序员和软件开发人员在今年将有大量的就业机会。可是,面试成了招聘过程中的拦路虎,成为了很多程序员的噩梦。下面教你8个技巧,希望能有助于你成功取胜编程面试。 1.知道如何写算法 如果你申请的是软件工程师的工作,那么显然你

Java程序员面试失败的5大原因

By - 星期一, 四月 20, 2015

下面是Java程序员面试失败最有可能的5大原因,当然也许这5点原因适用于所有的程序员,所以,如果你是程序员,请认真阅读以下内容。 #1 说得太少 尤其是那些开放式的问题,如“请介绍下你自己”或“请讲一下你曾经解决过的复杂问题”。面试官会通过

如何用Java编写一段代码引发内存泄露

By - 星期一, 三月 30, 2015

本文来自StackOverflow问答网站的一个热门讨论:如何用Java编写一段会发生内存泄露的代码。 Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码。这个问题我一点思路都没有,好囧。 A1:通过以下步骤可以很容易产生

JVM性能优化,提高Java的伸缩性

By - 星期四, 三月 19, 2015

很多程序员在解决JVM性能问题的时候,花开了很多时间去调优应用程序级别的性能瓶颈,当你读完这本系列文章之后你会发现我可能更加系统地看待这类的问题。我说过JVM的自身技术限制了Java企业级应用的伸缩性。首先我们先列举一些主导因素。 主流的硬

JAVA

Java开发者写SQL时常犯的10个错误

By Lee - 星期三, 三月 18, 2015

我十分惊讶的发现,我最近的一篇文章——《Java开发者写SQL时常犯的10个错误》——最近在我的博客和我的合作伙伴DZone上非常的受欢迎。(这篇博客)的流行程度说明了几件事: SQL在专业的Java开发中多么重要。 基本的SQL知识被忘掉

Java 内存泄露的理解与解决过程

By - 星期二, 三月 17, 2015

本文详细地介绍了Java内存管理的原理,以及内存泄露产生的原因,同时提供了一些列解决Java内存泄露的方案,希望对各位Java开发者有所帮助。 Java内存管理机制 在C++ 语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生

国外程序员是如何准备面试的

By - 星期二, 三月 3, 2015

摘要:面试准备的重要性不用编者多言,大家都很清楚。本文是加拿大的一位程序员所写。大家可以看看国外程序员是怎么准备面试。不管你是否认同他的说法,《诗经》中有句话非常好——“它山之石,可以攻玉”。如果你还有其他面试准备方法,不妨在评论或微博中和

应聘互联网公司的简历应该是怎么样的?

By - 星期一, 二月 23, 2015

从去年到现在看了几百份简历,包括产品运营和产品设计师的职位。我不是 HR,只是想直接看到求职者的状况,看看是不是要换更准确的渠道去招聘对的人。我看简历的目的也很简单:找到没有什么问题且可能合适的人,然后约来聊聊看是否合适。 (我不是 HR

如何开始学习ADF和Jdeveroper 11g

By Lee - 星期一, 二月 16, 2015

作为第一篇博客,先给一些资料可以帮助初学者开始学习ADF和Jdeveloper11g 1.首先毫无疑问,你要懂java语言, 可以看看Thinking In Java, 或者原来sun的网上的一些文档 Sun‘s Online Docs.

技术人员如何去面试?

By Lee - 星期六, 十二月 6, 2014

每年3月-5月的离职跳槽高峰期,不论什么level的程序员们都开始纷纷去考虑勾兑猎头跳槽投递简历应聘面试等等关 […]