Java技术杂记

本文是临时记录在本子上Java技术的初步整理, 一来举一反三, 二来练习双拼打字. 发现双拼方案里的自然码挺好用的. 搜狗双拼方案对单韵母的字采用”o+韵母”, 比如”安oj”, “二or”等. 自然码则是”安an”, “二er”, 符合传统拼音思维. 但是, 自然码美中不足的是”昂ang”为了兼容双拼2个键出字的规则, 强行将a作声母, 原本是”ang”的”H”键改为”ng”作韵母.


  • 小心你的代码里有NullPointerException
  • 你必须了解的5条关于成员内部类的事
  • mysql语法
  • Eclipse调试
    • Eclipse调试快捷键
    • 多线程调试
    • 服务器后端调试
      • 显示Server栏目 配置tomcat
      • 部署项目
  • springHibernateTemplate
  • 领导训话
  • 可热插拔的软件架构实践_基于Spring框架的DI
  • Java字符串处理之日期格式化
  • Java读取网页
    • 找不到网页时FileNotFoundException
  • JQuery语法
  • 最简单的多线程架构_Producer-Consumer BlockingQueue
  • 英语单词
  • javautilconcurrent
  • log4j2入门 配置 HelloWorld
  • java 15 不定长参数 17 switchString 调用equals
  • java没有unsigned int2开头的十位数 YYYYMMDD8位 int已够用
  • java synchronized多线程的本质
    • 夺权
  • Wizard项目管理
  • javaio
    • Reader和InputStream的区别
    • BufferedReaderWriterInputStreamOutputStream
  • Interface无修饰符 包访问权限
  • Serializeable Id用来保持和DB中的版本一致
  • Its never legal to start a thread more than once
  • 不考虑多线程安全 StringBuilder比StringBuffer快
  • 方法中定义的变量线程安全因为本质上是private的
  • 跨域CORS
  • web后端使用java 6语法是最佳实践
  • Java文件可以没有public class
  • 实际上静态内部类和外部类是一个级别的
  • ListMap实用初始化方法
  • try-catch块后的代码在catch了Exception后依然被执行 所以最佳实践是把整个方法代码放在try-catch块中
  • 两种线程安全的HashMap
  • java7的多个异常必须相互之间没有继承关系
  • Java读取Excel doc pdf 图片
  • java传引用数组collection类 普通对象
  • 删除满足条件的链表元素
  • jericho用来解析html
  • iteye Java社区的巅峰-SOFOSC站长红薯是Java程序员
  • Redis 32 kv数据库
  • OSC莆田系插件技术改变生活
  • Gone with the windMargaret Mitchell飘乱世佳人
  • Hadoop版本
  • Apache oozie
  • Apache赞助商目录
  • 排除合理怀疑
  • 做不到的人会告诉你你也不行
  • 跳坑做完一件事才会放你出来
  • 月入十万以上的靠信息和权利
  • 10年数据仓库3-5年Java开发
  • 信用卡利息2CPI每月01
  • by page存储过程 调用次数小粒度大 by function 便于重用
  • RESTFUL设计url规范
  • KPIKill person Idea
  • xml11和10区别
  • 如果不重用就不要写成方法
  • 区块连
  • 一切不logger的异常都是耍流氓

竹防水薄膜键盘

女生——彩虹键帽红轴键盘

专业——美商海盗船k65不发光



p1

Thread数量:

OS 32bit, Memory 2G, JDK 1.7

令堆内存大小在运行期间保持恒定:

-Xms=-Xmx=512MB

名称 32bitOS 64bitOS
-Xss线程栈 最小64KB 最小128KB
Thread数量 1737 31842

其他影响因素:

proc/sys/vm/max_map_count

proc/sys/kernal/thread-max

proc/sys/kernal/pid-max


小心!你的代码里有NullPointerException!

NullPointerException作为java程序员最常见的错误, 被亲切地称为NPE.

NPE往往能逃过javac的编译期间的语法检查, 在程序运行时才发生. 因此, 运行程序前, NPE很难被检查出来, 危害极大.

我个人总结了最容易发生NPE的几种情况:

1. field(类成员变量)不赋值, 却在方法中被使用, 编译过程不会报错. 但是, 应该注意到, 如果方法中的局部变量未赋值被使用, 编译器会报错. 事实上, 新手很容易混淆类成员变量和方法中的局部变量未初始化在编译中的差异.

2. Spring框架项目用@Autowired修饰static field varible时不报错, 但运行时报错.

原因是, 被@Autowired修饰的类会在后台自动生成不带static修饰符的getter和setter方法. 要解决, 必须手动添加 static 的 getter和setter.

3. 不了解Java原生类的方法, 很容易得到null且不自知.比如java.util.concurrent.LinkedBlockingQueuetake()方法在Queue为空时返回null, 且不报错.


你必须了解的5条关于成员内部类的事

  1. 静态内部类是用static修饰的一种特殊的成员内部类, 具有额外的几条性质:

String StringBuffer StringBuild都声明为final, 因此你无法创建一个类extends这些类.


mysql语法

  1. TRUNCATE TABLE tbDELETE FROM tb效率更高, 因为后者需要逐条删除. 不过后者比较灵活, 可以附上where子句. 此外, 前者属于DDL语言, 不能rollback.
  2. INSERT INTO tName VALUES ();
  3. where ID = 123 or 124; – 错误, 但仍执行, 且where子句无效

    where ID = 123 or ID = 124;


Eclipse调试

Eclipse调试快捷键

F5 进入当前行调用的函数内部

F6 下一行

F7 直接跳出当前方法

F8 继续运行, 直至下一个断点

多线程调试

某线程卡在断点不影响其他线程继续运行

Logger %t 输出线程名

原生的junit4 不能测多线程, 因为System.exit()杀死所有进程. 可以写main方法测. 也可以用第三方包.

服务器后端调试

1?显示Server栏目, 配置tomcat

打开Windows -> Show Views -> Servers栏目

默认已经下载了tomcat7

new server: 选择tomcat7文件夹

2?部署项目

右键Servers栏目下的tomcat服务器, 选择右键菜单的”Add and Remove”, 添加项目如下图

点击Servers栏目的debug按钮, 如下图

在src的Controller类添加断点

通过浏览器或测试类发送http请求, 会被断点捕获. 接下去就和普通的Java程序调试一样了.

spring.HibernateTemplate



台湾日月光 $84亿


领导训话

AB档

2000W买数据

编制有

不要推卸责任, 学到东西


可热插拔的软件架构实践_基于Spring框架的DI

Task定时运行

DI赋予了类A不显式调用类B的能力, AB之间弱耦合.

用数据库的一张表保存任务执行进度, 必须清楚地说明每个字段的含义.

把POJO的值保存为json字符串, 存入数据库

用不用Spring DI 必须在概设前决定, 对类依赖影响大



用Java内存模型管理博客



UUID文件名



Java最强字符串处理工具_Regex(正则表达式)

传统的, 我们使用str.replace(matcher, target)

String也支持用Regex表达式替换指定字符

str.replaceAll(regexMatcher, target)

str.replaceFirst(regexMatcher, target)

只需要记住”(anyString){n}”, 你已经入门了!

比如

"habubuv".replaceAll("(bu){2}", ""); // "hav"
"habubuv".replaceAll("(habu){1}", "") // "buv"

Regex元字符

简单来说, 元字符和Regex的关系, 就像if while return和java的关系

我们已经学会了”(anyString){n}”, 那么我们就用它来说明元字符* ? +的作用吧.

(anyString)*

(anyString)?

(anyString)+

比如,

正则式 java字符串写法 含义
(abc) “(abc)” 匹配”abc”
[abc] “[abc]” 匹配a或b或c
[a-d] “[a-d]” 匹配a,b,c,d
[a-zA-Z] “[a-zA-Z]” 匹配任何英文大小写字母

需要转义的原字符

\ . + * ? ^ $ ( ) { [ |


Java字符串处理之日期格式化

201441->20140401

String.format(“%4d%02d%02d”,year,month,date)


Java读取网页

用自带的URLConnection获得html页面,再配合jericho等html解析工具包提供的方法足矣.

POST请求的Head参数用properties方式保存.

Osgi包?

一串唯一字符串Boundary分割Head和

POST Form, 最后以Boundary+”–”表示请求结束.

java

找不到网页时FileNotFoundException


JQuery语法

$.fn.extend()拓展方法

$.fn.extend({
    searchBtn: function(){
        alter($(this).val());
    }
})
// call
$("#input".searchBtn();


PostgreSQL 9.4.5特性

免费开源(任何意义上)

NoSQL support(支持json)

全外链接

Mysql2013年被Oracle收购, 商用受限

sudo apt-get install prostgresql-client prostgresql



java三目必须在等式右边, 这也限制了它的用途.


最简单的多线程架构_Producer-Consumer + BlockingQueue

考虑的要点:

Producer-Consumer 各自的粒度: 按关键词, 页, 类生产/消费

只有I/O可以靠多线程提高效率.

Queue和Pro-Con的关系:

1. 不推荐. 告诉Pro-Con有Queue

2. 推荐. Pro-Con有类变量Queue

__

python类变量和”私有”变量

类变量:

class A:
    a1=0 //可省略
    def __init__(self, a2):
        delf.a2 = a2
    def set(self, a3):

“私有”变量

事实上, 仍然你可以通过类名."私有"变量名的方式访问到. python里没什么是私有的.


英语单词

deflate 缩小

any 后名词: 否定/疑问句any+s, 表任何 不加s.


java.util.concurrent

concurrent包的精髓就是用底层是乐观锁的Lock, 替代了底层是悲观锁的synchronized. 只对写加锁, 大大提高了效率.

ConcurrentHashMap LockStripping 原理:

BlockingQueue:

put()/take() - await()/signal()+Condition类

add()/remove()/element() - 基于offer()/poll()/peek() - ReentrantLock(可重入锁)类似递归. 前者报异常, 后者无异常.

volatile

线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A)


log4j2入门 配置 HelloWorld

简书

java 1.5 不定长参数 1.7 switch(String) // 调用equals?

java没有unsigned int<2开头的十位数 YYYYMMDD=8位 int已够用

java synchronized多线程的本质

任何时刻, 对象的控制权(monitor)可能被一个线程拥有, 且它是wait/notify/notifyall的前提.

JVM不保证线程的时序

IllegalMonitorStateException

夺权

  1. 执行对象的synchronized实例方法
  2. 执行类的 static synchronized方法
  3. 执行加锁的同步块(不能在块中修改synchronized(Object o)的实例o)
synchronized(flag) {
    flag="haha"; // lose monitor
    flag.notify(); // Exception
}

解决办法: 把flag作为数组/JavaBean的元素



太平人寿

机器学习工程师



讲礼貌

您, 夏总

Wizard项目管理


java.io

InputStreamRead(new FileInputStream(f, boolean isAppend),”utf-8”);

InputStreamReader

BufferedReader

FileWriter

BufferedWriter

Java读取Windows的记事本的txt文件第一行需要处理一个”“空字符

Reader和InputStream的区别

例子: FileReader按字符(一个中文是一个字符, 两个字节)读文件, FileInputStream按字节读文件. FileReader还能指定解码方式为utf-8, gb2312等, 处理中文文件很方便.

Buffered(Reader|Writer|InputStream|OutputStream)

BufferedInputStream依附于其它InputStream, 不能独立存在.

BufferedInputStream重写了InputStream的read()方法, 加入缓存机制提高了效率.

问: 为什么缓存提高效率呢?

答: 读内存数据比读硬盘数据快(即使硬盘是SSD也只有内存速度的一成). 换一个不太恰当的例子来说,您和您的朋友一起去登山,你朋友太不给力了,走一会儿就要休息,而您呢,您的体力比他要好的多,根本不需要休息,所以每当他休息的时候,您得等着他,您那时候什么也干不了,这就叫堵塞,堵塞就是说您有能力干某事,但是迫于某种原因您什么也干不了,只能干等。所以您朋友休息的次数越少,你们两个到达山顶所花费的时间就越少。

同样的, CPU访问硬盘的次数越少,程序就越快。BufferedInputStream在小型文件中的性能优势无法体现出来,假设您将以个2G大小的文件从D盘完全复制到E盘,性能之优势便展露无疑!

例子: FileInputStream对文件按字节输入, 每个字节都访问一次磁盘, 资源占用多, 效率低. 把FileInputStream的实例作为参数new BufferedInputStream(fileInputStream), 就是提供了一个默认8072字节的缓存区, 缓存满了或调用flush()方法才从缓存读入内存, 比原来节约了8071次写内存.

import java.io.*;
public class Test {
    public static void main(String[] args) throws Exception {
        File f = new File("d:\\大型数据库文件.mdf");
        FileInputStream fis = new FileInputStream(f);
        FileOutputStream fos = new FileOutputStream("e:\\" + f.getName());
        // 如果使用BufferedOutputStream来修饰则带来更好的性能现。
        // BufferedOutputStream bos = new BufferedOutputStream(fos);
        int length = 0;
        byte[] b = new byte[1024]; // BufferedOutputStream内置缓存,不用这样写
        while((length = fis.read(b)) != -1)
        {
            fos.write(b, 0, length);
        }
        fos.close();
        fis.close();
    }
}

Interface无修饰符 包访问权限

Serializeable Id用来保持和DB中的版本一致

It’s never legal to start a thread more than once

不考虑多线程安全, StringBuilder比StringBuffer快

10000条append()操作, 前者0ms, 后者16ms

方法中定义的变量线程安全,因为本质上是private的

跨域CORS

jsp: request.setHeader();

java的servlet(如Tomcat, WebLogic, WebSphere, Apache, JBoss)的Filter中: request.setHeader();

web后端使用java 6语法是最佳实践


Java文件可以没有public class?

即使没有public, 也能编译通过并运行

class A{
    public static void main(String[] args){
        System.out.println("s");
    }
}

实际上,静态内部类和外部类是一个级别的

内部类的应用:java.util.collection中的节点, 如LinkedList中的Entry.

减少了文件数目, 提高了高内聚.

List,Map实用初始化方法

new xxxList<Xxx>{{add();add();}}; //限制是必须显示制定<>中类型, 不能使用jdk7的diamond表达式

try-catch块后的代码在catch了Exception后依然被执行, 所以最佳实践是把整个方法代码放在try-catch块中.

推荐catch块中 throw Exception把问题暴露给调用方, 由调用方统一处理Exception并记录

catch中的return null需要额外的logger信息辅助记录Exception原因.

虽然System.exit()可以在catch中杀死程序, 但是在多线程程序中禁止使用, 因为exit命令会杀死jvm, 所有的线程都被杀死.

两种线程安全的HashMap:

  1. 不推荐 Collections.synchronizedMap() 悲观锁,独享对象
  2. 推荐 java.util.concurrent.ConcurrentHashMap 乐观锁.写时检查

    底层实现 JNI Java CAS LockSupport.park() unpark()

java7的多个异常必须相互之间没有继承关系

Java读取Excel, doc, pdf, 图片

excel/doc apache POI HSSF/XSSF

图像OCR tesseract 中文库39.5MB

PDF pdfbox

java传引用,数组,collection类, 普通对象

方法内不能=new修改传入参数的指向.

巧用这个性质简化List实现类的批量删除子List

parentList.sublist(0,parentList.size()-1+1).clean();
//parentList中也被删除了

删除满足条件的链表元素

for(int i=0;;i++){
    if(i>test.size()-1)
        break;
    if(/*judge*/){
        test.remove(i);
        i--;
    }
}

对ArrayList,每次都需要Arrays.copyOf(old, size), 效率低下

jericho用来解析html

getChildElements()

getFirstElementByClass()

getElementById()

getTextExtractor().toString()只获得标签内容

iteye Java社区的巅峰->SOF,OSC(站长红薯是Java程序员)

Redis 3.2 kv数据库

OSC莆田系插件,技术改变生活

Gone with the wind(Margaret Mitchell)飘,乱世佳人

Hadoop版本

1.x.x 支持hbase, hive

2.x.x 速度提升, HDFS NameNode, JobRacjer YARN

Apache oozie

Wordcount

Apache赞助商目录:

赞助金额/年 赞助厂商
$100,000 Google,MS,FB,yahoo
$40,000 IBM,hp,ARM
$20,000 redhat, aliyun, huawei
$ 5,000

排除合理怀疑

做不到的人会告诉你你也不行

跳坑,做完一件事才会放你出来

月入十万以上的靠信息和权利

10年数据仓库,3-5年Java开发

信用卡利息2%,CPI每月0.1%

by page存储过程 调用次数小,粒度大, by function 便于重用

RESTFUL设计url规范

Representational State Transfer

资源(内容)的位置由URI(Identifier)唯一确定

http无状态, 状态保存在服务端, 用户通过GET,POST,PUT,DELETE命令操作资源(内容)

不要把资源(内容)更新频率不同的api放在一起

KPI(Kill person Idea)

只适合缺乏自制,目标和公司目标不同的员工

A: 好代码

B: 差代码 - 加班 - 升职

点评: 要适应KPI, 适度犯错, 全力补救

xml1.1和1.0区别

如果不重用就不要写成方法

区块连

一切不logger的异常都是耍流氓

Exception还可能暴露敏感信息给客户端

时间: 2024-10-29 19:10:27

Java技术杂记的相关文章

Java技术的特点

Java技术是一套完整的IT行业解决方案,其中包含了很多技术.最初是从解决家电设备联网通讯的方案发展起来的,其特点适用于Internet,于是在Internet广泛应用的环境下,迅速发展成为一种计算机语言.一个平台.一个网络计算的架构. 从整体上划分,Java技术可分成Java编程语言和Java平台.Java编程语言是一种高级编程语言,Java平台是指程序运行的硬件或软件环境. Java编程语言的特征: 1.简单易用 2.面向对象 3.跨平台,可移植 4.多线程 5.健壮性 6.安全性 7.动态

【JAVA】基于MVC架构Java技术荟萃案例演练

基于JAVA-MVC技术的顾客管理项目案例总结 作者 白宁超 2016年6月9日22:47:08 阅读前瞻:本文源于对javaweb相关技术和资料汇总,涉及大量javaweb基础技术诸如:Servlet运行原理.Get/Post请求的区别.jsp的基本原理和运行框架.jsp的9大隐含对象的使用.MVC开发模式的使用.构建封装自己dao代码库.以及基于MVC的增删改查操作等:小结最后还有面向接口编程的多数据源配置与存储,以及工厂模式的使用.除此之外,后续文章会对cookie.session.Jav

JAVA技术专题综述之线程篇(1)

本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解. 一:run()和start() 示例1: public cla ThreadTest extends Thread{public void run(){for(int i=0;i<10;i++){Syste

java技术栈:一、java编程语言概述

Java是一种编程语言,起源于20世纪90年代初Sun公司的一个叫Green的项目,该项目主要目的是是开发嵌入家用电器的分布式软件系统,从而使电器更加智能化.因为项目小组成员皆为C++的高手(那个年代正式C++流行的年代),于是采用C++进行系统开发,但在开发过程中发现C++语言本身的特性所导致的问题无法有效的解决,比如:过于复杂.安全性差等.于是项目小组只好另辟蹊径,在"简单的.可靠的.紧凑的并易于移植的"的框架内开发了一个小型的计算机语言,用于编写消费者的电子产品中的程序,当时这款

Java技术综述

自己打算好好学习下Java,所以想先明晰Java开发中到底有哪些技术,以便以后学习的过程中,可以循序渐进,随着学习的深入,本文将不断更新. Java基础教程将Java的入门基础知识贯穿在一个实例中,逐步深入,可以帮助你快速进入Java编程的世界.万事开头难,逐步跟着这个教程走一遍,对Java应该就会有一种入门的感觉了.然后再去学习更高级的主题,或者更深入地学习其中的某些知识点. 首先学习Java的一些基础知识,包括: Java开发环境安装与配置 Eclipse的安装与使用 面向对象基础 基本数据

第01章 Java 技术概览

/**@前言: Java是Sun公司推出的程序设计语言,拥有面向对象.跨平台.分布式.高性能.可移植等优点和特性,是目前应用最广的编程语言之一.Java语言实现面向对象思想的三大特性:继承.多态.封装.Java语言可以制作网站后台.大型网络游戏.多媒体开发,而且还能够操作各种操作系统(linux.Android等) @第一章 Java 技术概览 Java由两部分组成:Java API + Java VM -- Java编程接口 + Java虚拟机.Java特性:跨平台.面向对象.分布式.多线程.

(转)如何学习Java技术?谈Java学习之路

51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领域其他技能的学习. [在原先<学好Java之我见>的基础上重新整理而成] Java - 近10年来计算机软件发展过程中的传奇,其在众多开发者心中的地位就如“屠龙刀”.“倚天剑”. Java是个平台,我只想说说我对学好Java的一点看法,希望对初学者有所帮助. 1. 思考一下 学习Java之前,先别

《深入理解Java虚拟机》第一部分(Java技术体系,Java虚拟机,Java技术趋势)

第一部分 走进Java 1.Java技术体系 Sun官方定义的Java技术体系包括一下几个组成部分: Java程序设语言 各种硬件平台上的Java虚拟机 Class文件格式 Java API类库 第三方Java类库 JDK是用于支持Java程序开发的最小环境,Java程序设计语言.Java虚拟机.JavaAPI类库统称为JDKJRE是支持Java程序运行的标准环境,JavaAPI类库中的JavaSEAPI子集和Java虚拟机统称为JRE 按照Java技术关注的重点业务领域来分,Java技术体系可

Java技术之垃圾收集

Java中垃圾收集Garbage Collection GC提供了内存管理机制,使得应用程序不需要关注内存时如何释放,内存用完之后,垃圾收集会进行收集,这样就减轻了因人为管理内存而造成的内存错误. 1.常见的垃圾收集策略 所谓的垃圾收集算法都面临一个问题,那就是找出应用程序不可到达的内存块,然后将其释放.这里不可到达主要指应用程序中没有内存块的引用了,而可到达主要指这个对象被跟引用或者被另一个可到达的对象引用.常见的策略有引用计数,跟踪收集器. Java技术之垃圾收集,布布扣,bubuko.co