当前位置:首页 > 编程问答 >

java培训班达内免费吗

时间:2020-10-09 22:22:27已被216人关注

码农之家
达内java培训要钱吗

达内教育java软件开发培训机构是中国一家著名的高端培训知名品牌,着眼于塑造在我国it行业的优秀人才,尤其是塑造大量高档java软件开发设计方案工程师。达内教育企业选用多种计划方案课堂教学,优秀的教学器材,一流的师资队伍,获得了愈来愈多的学生的信任。现阶段,java工程师是很有市场前景的一份工作中,学习java,就来达内教育java培训机构吧,java培训机构达内教育完全免费试学,就是你的不二之选。

最先,这全世界沒有免费午餐。次之,说白了的免费试用也copy便是试学,这基本上是因此培训机构的标准配置。最百后是如今许多培训机构也有那类国家助学贷款,这度种也仅仅学习的情况下不还款,可是大学毕业以后還是得还的。因此在看这类免费试用的情况下得明确清晰,然知后在考虑到去不道去。

现阶段大家生活品质日趋提升,it行业已经快速发展趋势,它是个互联网技术联接的时期。在软件开发,企业网站建设乃至是一些手机游戏的程序流程都不可或缺java语言的撰写设计方案,因而各大it公司已经高薪职位急聘高档java工程师。一些学习电子计算机java技术专业的学员去公司面试,却沒有被入取,这是由于她们在学习学习不精。要想学好java,实际上java培训机构比院校更合适大伙儿。

费用都不低,尤其是一线城市的Java培训费百用,所以,在决定去学习之前一定要多考度察,多对比,三思后行,看课程,看老师,看口碑,综合多方面。

除此之外还要知道自知己适不适合学习Java,别到时候后悔都道没地去后悔,建议你了回解一下Java实验班,是一个单独的,不收学费的,通过专业手段帮助你自己了解自己适不适合学答习Java的学习班。

嗯,的确有,我来过,最佳答案显而易见是以奸险小人知己度君子之腹了;实际上,一开始见到这一主题活动我觉得的和最佳答案里一样,只不过便是骗我去学习的招数罢了,但按耐不住女友死缠烂打,恰好她也准备到北京玩下,又追上这一完全免费,就决策来到,来到院校,先给分配的寝室,公寓楼种类,copy住的房间和大学寝室类似,一个屋四个人,屋子里别的三个人是早已在学的学生,以后便是历时四天的检测了,院校的主管承担,他也是java程序猿出生,处世很率真随和,我跟他zhidao很聊得来,我要去的实验班那批一共21本人,有13本人不宜学习,院校简洁明了的告之,这我很钦佩,并不是以便挣钱硬给你学习。其他合适的别人都不凑合;再说了,别人办这一主题活动原本便是以便招收,但起码别人做的技术专业,有心态,承担责任,这就充足了。

已被260人点赞
实例解析Java Chaos Game噪声游戏
实例解析Java Chaos Game噪声游戏

[简介]

最近一直在读《深奥的简洁》,里面有一章介绍了几种使用噪声产生分形图的方法,感觉很有意思,于是尝试使用计算机模拟了一下,效果还不错(噪声法比传统迭代法在编程上好实现一些,后来发现这类算法还不少,搜索chaosgame可以找到更多)。

[Sierpinski三角形的噪声产生法]

Java Chaos Game噪声游戏实例代码

在这些噪声游戏中,Sierpinski(谢尔宾斯基)三角形的生成规则可谓是最简单的:

1.在平面上选取三个点,标记为1、2、3,作为大三角形的顶点。

2.选择其中一点,作为“当前点”(比如选择1号)。

3.产生1~3的随机数,在该数表达的顶点与“当前点”的中点绘制一个新点,并将新点作为“当前点”。

4.重复步骤3,即可逼近图案。

*.注意随机数最好不要使用以时间作为种子的产生方式。

[模拟程序]

package com.geiv.chaos;
import java.awt.event.KeyEvent;
import com.thrblock.util.RandomSet;
import geivcore.DefaultFactor;
import geivcore.KeyFactor;
import geivcore.KeyListener;
import geivcore.R;
import geivcore.UESI;
import geivcore.enginedata.obj.Obj;
public class Sierpinski extends DefaultFactor implements KeyListener{
	UESI UES;
	Obj[] basePoint;
	Obj crtPoint;
	public Sierpinski(UESI UES,int times){
		this.UES = UES;
		basePoint = new Obj[3];
		//创建三个基准点 
		for (int i = 0;i < 3;i++){
			basePoint[i] = UES.creatObj(UESI.BGIndex);
			basePoint[i].addGLPoint("70DBDB",0,0);
			basePoint[i].show();
		}
		basePoint[0].setCentralX(400);
		//设置三点位置 
		basePoint[0].setCentralY(60);
		basePoint[1].setCentralX(60);
		basePoint[1].setCentralY(550);
		basePoint[2].setCentralX(740);
		basePoint[2].setCentralY(550);
		crtPoint = basePoint[0];
		//将0号点作为当前点 
		this.setKeyListener(this);
		UES.pushKeyBoardIO(this);
		for (int i = 0;i < times;i++){
			generateNew();
		}
	}
	@Override 
	  public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) {
		//挂载回调 
		if(ispressed){
			if(keyCode == KeyEvent.VK_SPACE){
				//空格对应创建一个新点 
				generateNew();
			} else if(keyCode == KeyEvent.VK_A){
				//A对应创建100个新点 
				for (int i = 0;i < 100;i++){
					generateNew();
				}
			} else if(keyCode == KeyEvent.VK_B){
				//B对应创建1000个新点 
				for (int i = 0;i < 1000;i++){
					generateNew();
				}
			}
		}
	}
	public void generateNew(){
		Obj flagPoint = basePoint[RandomSet.getRandomNum(0, 2)];
		//随机选择基准点之一 
		float nx = (flagPoint.getCentralX() + crtPoint.getCentralX())/2f;
		//计算中点 
		float ny = (flagPoint.getCentralY() + crtPoint.getCentralY())/2f;
		Obj newPoint = UES.creatObj(UESI.BGIndex);
		//创建新点 
		newPoint.addGLPoint("70DBDB",0,0);
		newPoint.setColor(RandomSet.getRandomColdColor());
		newPoint.setCentralX(nx);
		//设置坐标 
		newPoint.setCentralY(ny);
		newPoint.show();
		crtPoint = newPoint;
		//置为当前点
	}
	public static void main(String[] args) {
		UESI ues = new R();
		new Sierpinski(ues,0);
		//后面的构造参数可以设置初始点数。
	}
}

[模拟结果]

在B键按下时

Java Chaos Game噪声游戏实例代码

Java Chaos Game噪声游戏实例代码

Java Chaos Game噪声游戏实例代码

[Barnsleyfern的噪声产生法]

Java Chaos Game噪声游戏实例代码

相比于Sierpinski三角的简单规则性,Barnsleyfern(分形羊齿草)给人以更加复杂的印象,出于它的复杂性,混沌学科经常拿出它来证明“简单规则也可产生复杂对象”的结论。

它的产生规则也不是很复杂:

1.首先给定”当前点”(0,0),我们用ox,oy表示横纵坐标。

2.计算下一点(nx,ny)需要以一定随机规则选择下列四种迭代公式之一:

1)以%1的概率选择此迭代公式:

nx=0;

ny=0.16f*oy;

2)以%85的概率选择此迭代公式:

nx=0.85*ox+0.04*oy;

ny=-0.04*ox+0.85*oy+1.6;

3)以%7的概率选择此迭代公式:

nx=0.2*ox-0.26*oy;

ny=0.23*ox+0.22*oy+1.6;

4)以%7的概率选择此迭代公式:

nx=-0.15*ox+0.28*oy;

ny=0.26*ox+0.24*oy+0.44;

3.绘制(nx,ny),并将其设为当前点,重复2,即可无限逼近结果。

↑以上公式摘自Wiki:http://en.wikipedia.org/wiki/Barnsley_fern。在编程时,我发现一个问题,Wiki并未指明这个坐标的决对值与屏幕大小的关系,也并未说明x、y轴的方向,在我自己定义的坐标系下绘制总是不成功,后来我按照公式搜索,找到了这个面:http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp。这是一个C++下的OPENGL程序,而里面用了与Wiki相同的公式,也就是说,这组公式是以Opengl的坐标系为基准的,在做了对应变换后终于成功绘制。

[模拟程序]

package com.geiv.chaos;
import geivcore.DefaultFactor;
import geivcore.KeyFactor;
import geivcore.KeyListener;
import geivcore.R;
import geivcore.UESI;
import geivcore.enginedata.obj.Obj;
import java.awt.Color;
import java.awt.event.KeyEvent;
import com.thrblock.util.RandomSet;
public class Barnsleyfern extends DefaultFactor implements KeyListener{
	UESI UES;
	Obj crtPoint;
	public Barnsleyfern(UESI UES,int times){
		this.UES = UES;
		crtPoint = UES.creatObj(UESI.BGIndex);
		crtPoint.addGLPoint("70DBDB",0,0);
		crtPoint.show();
		crtPoint.setCentralX(0);
		crtPoint.setCentralY(0);
		UES.setViewOffsetX(90);
		this.setKeyListener(this);
		UES.pushKeyBoardIO(this);
		for (int i = 0;i < times;i++){
			generateNew();
		}
	}
	@Override 
	  public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) {
		//键盘IO的方式同上例 
		if(ispressed){
			if(keyCode == KeyEvent.VK_SPACE){
				generateNew();
			} else if(keyCode == KeyEvent.VK_A){
				for (int i = 0;i < 100;i++){
					generateNew();
				}
			} else if(keyCode == KeyEvent.VK_B){
				for (int i = 0;i < 1000;i++){
					generateNew();
				}
			}
		}
	}
	public void generateNew(){
		float nx,ny;
		float ox = crtPoint.getCentralX()/150f,oy = (600 - crtPoint.getCentralY())/60f;
		//这里做了OPENGL坐标转换,在设置新点位置时对应反转。 
		double code = 100.0 * RandomSet.getRandomFloatIn_1();
		//随机浮点数数0~100 
		if(code >= 0&&code <= 1){
			nx = 0;
			ny = 0.00f * ox + 0.16f * oy;
		} else if(code > 1&& code <= 86){
			nx = 0.85f*ox + 0.04f*oy;
			ny = -0.04f*ox + 0.85f*oy + 1.6f;
		} else if(code > 86&& code <= 93){
			nx = 0.2f*ox - 0.26f*oy;
			ny = 0.23f*ox + 0.22f*oy + 1.6f;
		} else{
			nx = -0.15f*ox + 0.28f*oy;
			ny = 0.26f*ox + 0.24f*oy + 0.44f;
		}
		Obj newPoint = UES.creatObj(UESI.BGIndex);
		newPoint.addGLPoint("70DBDB",0,0);
		newPoint.setColor(Color.GREEN);
		newPoint.setCentralX(nx*150f);
		//将之前的坐标变换抵消 
		newPoint.setCentralY(600 - ny*60f);
		newPoint.show();
		crtPoint = newPoint;
		//设置新点为当前点。
	}
	public static void main(String[] args) {
		UESI ues = new R();
		new Barnsleyfern(ues,0);
	}
}

[模拟结果]

Java Chaos Game噪声游戏实例代码

Java Chaos Game噪声游戏实例代码

Java Chaos Game噪声游戏实例代码

总结

以上就是本文关于Java Chaos Game噪声游戏实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

已被942人点赞
实例详解Java日志相关技术_动力节点Java学院整理
实例详解Java日志相关技术_动力节点Java学院整理

Java日志相关技术

作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用、WEB应用以及移动应用。然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug;在运行维护阶段,日志系统又可以帮我们记录大部分的异常信息,从而帮助我们更好的完善系统。本文要来分享一些Java程序员最常用的Java日志框架组件。

1、log4j – 最受欢迎的Java日志组件

Log4j是一款基于Java的开源日志组件,Log4j功能非常强大,我们可以将日志信息输出到控制台、文件、用户界面,也可以输出到操作系统的事件记录器和一些系统常驻进程。更值得一提的是,Log4j可以允许你非常便捷地自定义日志格式和日志等级,可以帮助开发人员全方位地掌控日志信息。

Java日志相关技术_动力节点Java学院整理

官方网站:http://logging.apache.org/log4j/2.x/

下面是使用Log4j的一个简单例子:

package com.mai.test;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Log4jTest {

public static void main(String[] args) {

Logger log = Logger.getLogger(Log4jTest.class);
PropertyConfigurator.configure("src/log4j.properties");
log.debug("yes,debug");
log.info("yes,info");
log.error("yes,error");
log.warn("yes,warn");
}

}

2、gclogviewer – Java日志查看工具

gclogviewer是一个支持jdk 6的gc log可视化工具,和gcviewer相比,gclogviewer支持根据gc log生成GC的趋势图,也支持生成调优建议所需的数据趋势图。

官方网站:http://code.google.com/p/gclogviewer/

3、SLF4J – 基于API的Java日志框架

SLF4J提供了一个简单统一的日志记录接口,开发者在配置和部署时只需要实现这个接口即可实现日志功能。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。

Java日志相关技术_动力节点Java学院整理

官方网站:http://www.slf4j.org/

4、Flume – Apache日志服务器

之前介绍的都是一些日志记录工具,Flume则是一个日志分析系统,Flume是分布式的,它有一个非常灵活的架构,用来收集、聚合以及移动大量日志数据,并且提供可靠、容错的系统架构。

Java日志相关技术_动力节点Java学院整理

官方网站:http://flume.apache.org/

5、zLogFabric – 日志存储系统

zLogFabric 是一个集成的跨平台日志解决方案,通过消息系统收集各个应用的日志信息存储到一个集中式的系统中。模块化的设计使得服务器可对日志进行存储、转发、警报以及生成日志统计信息。

zLogFabric 可收集来自文件、syslog、log4j、log4net 以及 Windows 事件的数据。

Java日志相关技术_动力节点Java学院整理

官方网站:http://www.zlogfabric.com/

6、logstash – Java日志管理工具

logstash是一款功能非常强大的日志管理工具,利用logstash,你可以对日志进行传输、处理、管理和检索,并且提供Web接口以便开发者统计和查询日志信息。

官方网站:http://www.logstash.net/

7、Commons Logging

Commons Logging的实现不依赖于具体的日志实现工具,仅仅提供一些日志操作的抽象接口,它对其他的日志工具做了封装,比如Log4J, Avalon LogKit, 和JDK 1.4等。

官方网站:http://commons.apache.org/proper/commons-logging/

8、Darks Logs

Darks Logs和log4j类似,也适用于Java、Android等项目,但是Darks Logs使用更加简单,而且对Android端做了非常大的改善。Darks Logs对Sqlite的日志保存增加了Appender。其旨在解决Android日志无法灵活控制日志等级、格式、保存或显示目标等常用操作等的问题。

官方网站:https://github.com/liulhdarks/darks-logs

已被661人点赞
java中Class.getMethods()和Class.getDeclaredMethods()用法区别
java中Class.getMethods()和Class.getDeclaredMethods()用法区别

在java中,可以根据Class类的对象,知道某个类(接口)的一些属性(成员 ,方法,注释,注解)等。由于最近的工作中用到了这些,其中需要在代码中格局反射知道某些类的方法,查看文档的时候,看到了getMethods()和getDeclaredMethods()的差异。虽然两者都能实现目的,但个人觉得还是有必要区分下。

  JDK API(1.6)文档中是这样翻译两个方法的:

getMethods():

  返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。数组类返回从 Object 类继承的所有(公共)member 方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果此 Class 对象表示没有公共成员方法的类或接口,或者表示一个基本类型或 void,则此方法返回长度为 0 的数组。类初始化方法 <clinit> 不包含在返回的数组中。如果类声明了带有相同参数类型的多个公共成员方法,则它们都会包含在返回的数组中。

getDeclaredMethods():

  返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。类初始化方法 <clinit> 不包含在返回数组中。如果该类声明带有相同参数类型的多个公共成员方法,则它们都包含在返回的数组中。

  大致上来看,两个方法的区别主要在于:getMethods()返回的是该类以及超类的公共方法。getDeclaredMethods()返回该类本身自己声明的包括公共、保护、默认(包)访问和私有方法,但并不包括超类中的方法。比如如下列子:

public class TestObject
{
  private void method1()
  {
  }
  public void method2()
  {
  }
  void method3()
  {
  }
  protected void method4()
  {
  }
}
public class TestClass
{
  public static void main(String[] args)
  {
    Method[] methods = TestObject.class.getMethods();
    System.out.println("getMethods():");
    for (Method method : methods)
    {
      System.out.println(method.getName());
    }
    Method[] methods2 = TestObject.class.getDeclaredMethods();
    System.out.println("===========================");
    System.out.println("getDeclaredMethods():");
    for (Method method : methods2)
    {
      System.out.println(method.getName());
    }
  }
}

运行TestClass结果:

getMethods():
method2
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
===========================
getDeclaredMethods():
method1
method2
method3
method4

  很明显getMethods()就返回一个自己声明的method2()方法,其余的方法全部是来自Object类。getDeclaredMethods()返回了自生声明的四个方法。两个方法的主要区别就在这里吧。

另外,返回Method数组为0 的情况也是JDK按照文档上介绍的一样。比如”空”接口,基本类型:

public interface TestInterface
{
}
//两种方法返回的都是空

以及基本类型:两种方法返回的也都是空

Method[] methods = int.class.getMethods();
Method[] methods2 = int.class.getDeclaredMethods();

总结:其实Class中有很多相似的方法比如:getAnnotations()getDeclaredAnnotations(),以及getFields()和getDeclaredFields()等等,不同之处和上面基本一样

已被293人点赞
Java实现获取mp3时长及播放mp3文件的方法总结
Java实现获取mp3时长及播放mp3文件的方法总结

本文实例讲述了Java编程实现获取mp3时长及播放mp3文件的方法。分享给大家供大家参考,具体如下:

所需包为jaudiotagger-2.2.6-SNAPSHOT.jar 和jl1.0.1.jar 。

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;
import javazoom.jl.player.Player;
public class MusicUtil {
 public static void play(String position) {
  try {
   BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(position));
   Player player = new Player(buffer);
   player.play();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 public static int getDuration(String position) {
  int length = 0;
  try {
   MP3File mp3File = (MP3File) AudioFileIO.read(new File(position));
   MP3AudioHeader audioHeader = (MP3AudioHeader) mp3File.getAudioHeader();
   // 单位为秒
   length = audioHeader.getTrackLength();
   return length;
  } catch (Exception e) {
   e.printStackTrace();
  }
  return length;
 }
 public static void main(String[] args) {
  String position = "逃跑计划-夜空中最亮的星.mp3";
  getDuration(position);
  play(position);
 }
}

 

已被925人点赞
javascript的写法总结
javascript的写法总结

javascript的几种写法总结

javascript的几种写法总结

<title>几个JavaScript</title>
<script language="javascript">
	//变量
	var greeting;//变量名
	greeting = "Welcome to the JS!";//为变量赋值
</script>
</head>

<body>
<script language="javascript">
document.write(greeting);//输出变量值
</script>

</body>

以上就是小编为大家带来的javascript的几种写法总结的全部内容了,希望对大家有所帮助,多多支持码农之家~

已被625人点赞
Java语言中一个字符占的字节数详解
Java语言中一个字符占的字节数详解

题主要区分清楚内码(internal encoding)和外码(external encoding)就好了。

内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;
外码是程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String,或者外部的文件、命令行参数之类的。

Java语言规范规定,Java的char类型是UTF-16的code unit,也就是一定是16位(2字节);

char, whose values are 16-bit unsigned integers representing UTF-16 code units (§3.1).

然后字符串是UTF-16 code unit的序列:

The Java programming language represents text in sequences of 16-bit code units, using the UTF-16 encoding.

这样,Java规定了字符的内码要用UTF-16编码。或者至少要让用户无法感知到String内部采用了非UTF-16的编码。

另举一例:

Java标准库实现的对char与String的序列化规定使用UTF-8作为外码。Java的Class文件中的字符串常量与符号名字也都规定用UTF-8编码。这大概是当时设计者为了平衡运行时的时间效率(采用定长编码的UTF-16)与外部存储的空间效率(采用变长的UTF-8编码)而做的取舍。

首先,你所谓的“字符”具体指什么呢?

如果你说的“字符”就是指 Java 中的 char,那好,那它就是 16 位,2 字节。

如果你说的“字符”是指我们用眼睛看到的那些“抽象的字符”,那么,谈论它占几个字节是没有意义的。

具体地讲,脱离具体的编码谈某个字符占几个字节是没有意义的。

就好比有一个抽象的整数“42”,你说它占几个字节?这得具体看你是用 byte,short,int,还是 long 来存它。用 byte 存就占一字节,用 short 存就占两字节,int 通常是四字节,long 通常八字节。当然,如果你用 byte,受限于它有限的位数,有些数它是存不了的,比如 256 就无法放在一个 byte 里了。

字符是同样的道理,如果你想谈“占几个字节”,就要先把编码说清楚。

同一个字符在不同的编码下可能占不同的字节。

就以你举的“字”字为例,“字”在 GBK 编码下占 2 字节,在 UTF-16 编码下也占 2 字节,在 UTF-8 编码下占 3 字节,在 UTF-32 编码下占 4 字节。

不同的字符在同一个编码下也可能占不同的字节。

“字”在 UTF-8 编码下占3字节,而“A”在 UTF-8 编码下占 1 字节。(因为 UTF-8 是变长编码)
而 Java 中的 char 本质上是 UTF-16 编码。而 UTF-16 实际上也是一个变长编码(2 字节或 4字节)。

如果一个抽象的字符在 UTF-16 编码下占 4 字节,显然它是不能放到 char 中的。换言之, char 中只能放 UTF-16 编码下只占 2 字节的那些字符。

而 getBytes 实际是做编码转换,你应该显式传入一个参数来指定编码,否则它会使用缺省编码来转换。

你说“ new String("字").getBytes().length 返回的是3 ”,这说明缺省编码是 UTF-8.如果你显式地传入一个参数,比如这样“ new String("字").getBytes("GBK").length ”,那么返回就是 2.

你可以在启动 JVM 时设置一个缺省编码,

假设你的类叫 Main,那么在命令行中用 java 执行这个类时可以通过 file.encoding 参数设置一个缺省编码。比如这样:java -Dfile.encoding=GBK Main这时,你再执行不带参数的 getBytes() 方法时,new String("字").getBytes().length 返回的就是 2 了,因为现在缺省编码变成 GBK 了。当然,如果这时你显式地指定编码,new String("字").getBytes("UTF-8").length 返回的则依旧是 3

否则,会使用所在操作系统环境下的缺省编码。

通常,Windows 系统下是 GBK,Linux 和 Mac 是 UTF-8.但有一点要注意,在 Windows 下使用 IDE 来运行时,比如 Eclipse,如果你的工程的缺省编码是 UTF-8,在 IDE 中运行你的程序时,会加上上述的 -Dfile.encoding=UTF-8 参数,这时,即便你在 Windows 下,缺省编码也是 UTF-8,而不是 GBK。

由于受启动参数及所在操作系统环境的影响,不带参数的 getBytes 方法通常是不建议使用的,最好是显式地指定参数以此获得稳定的预期行为。

以上所述是小编给大家介绍的Java语言中一个字符占几个字节详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

已被255人点赞
java邮件通知工具类代码详解
java邮件通知工具类代码详解

工作中很难避免会有一些需要邮件通知的情况,网络上也有很多邮件模板和工具类,在此给出一个工具类供参考

 前面一篇文章重新封装了工具给出更好的适应项目需要但为提供原始工具类作参考这里给出。

下面引入架包

工具类

package com.leon.isoftstoneweb.commen.utils.email;
 
import java.util.Date;
import java.util.Properties;
 
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
 
/**
 * @author leon
 * @createDate 2018年6月22日 上午9:32:05
 * @version v1.0
 * @classRemarks 邮件工具类
 */
public class SendEmailUtil {
 
 
 
 /**
  * 以文本格式发送邮件
  *
  * @param mailInfo
  *   待发送的邮件的信息
  */
 public boolean sendTextMail(MailBody mailInfo) throws Exception {
  // 判断是否需要身份认证
  MailAuthenticator authenticator = null;
  Properties pro = mailInfo.getProperties();
  if (mailInfo.isValidate()) {
   // 如果需要身份认证,则创建一个密码验证器
   authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
  }
  // 根据邮件会话属性和密码验证器构造一个发送邮件的session
  Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
  // logBefore(logger, "构造一个发送邮件的session");
 
  // 根据session创建一个邮件消息
  Message mailMessage = new MimeMessage(sendMailSession);
  // 创建邮件发送者地址
  Address from = new InternetAddress(mailInfo.getFromAddress());
  // 设置邮件消息的发送者
  mailMessage.setFrom(from);
  // 创建邮件的接收者地址,并设置到邮件消息中
  Address to = new InternetAddress(mailInfo.getToAddress());
  mailMessage.setRecipient(Message.RecipientType.TO, to);
  // 设置邮件消息的主题
  mailMessage.setSubject(mailInfo.getSubject());
  // 设置邮件消息发送的时间
  mailMessage.setSentDate(new Date());
  // 设置邮件消息的主要内容
  String mailContent = mailInfo.getContent();
  mailMessage.setText(mailContent);
  // 发送邮件
  Transport.send(mailMessage);
  // System.out.println("发送成功!");
  return true;
 }
 
 /**
  * 以HTML格式发送邮件
  *
  * @param mailInfo
  *   待发送的邮件信息
  */
 public boolean sendHtmlMail(MailBody mailInfo) throws Exception {
  // 判断是否需要身份认证
  MailAuthenticator authenticator = null;
  Properties pro = mailInfo.getProperties();
  // 如果需要身份认证,则创建一个密码验证器
  if (mailInfo.isValidate()) {
   authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
  }
  // 根据邮件会话属性和密码验证器构造一个发送邮件的session
  Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
 
  // 根据session创建一个邮件消息
  Message mailMessage = new MimeMessage(sendMailSession);
  // 创建邮件发送者地址
  Address from = new InternetAddress(mailInfo.getFromAddress());
  // 设置邮件消息的发送者
  mailMessage.setFrom(from);
  // 创建邮件的接收者地址,并设置到邮件消息中
  Address to = new InternetAddress(mailInfo.getToAddress());
  // Message.RecipientType.TO属性表示接收者的类型为TO
  mailMessage.setRecipient(Message.RecipientType.TO, to);
  // 设置邮件消息的主题
  mailMessage.setSubject(mailInfo.getSubject());
  // 设置邮件消息发送的时间
  mailMessage.setSentDate(new Date());
  // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
  Multipart mainPart = new MimeMultipart();
  // 创建一个包含HTML内容的MimeBodyPart
  BodyPart html = new MimeBodyPart();
  // 设置HTML内容
  html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
  mainPart.addBodyPart(html);
  // 将MiniMultipart对象设置为邮件内容
  mailMessage.setContent(mainPart);
  // 发送邮件
  Transport.send(mailMessage);
  return true;
 }
 
 /**
  * @param SMTP
  *   邮件服务器
  * @param PORT
  *   端口
  * @param EMAIL
  *   本邮箱账号
  * @param PAW
  *   本邮箱密码
  * @param toEMAIL
  *   对方箱账号
  * @param TITLE
  *   标题
  * @param CONTENT
  *   内容
  * @param TYPE
  *   1:文本格式;2:HTML格式
  */
 public static boolean sendEmail(String SMTP, String PORT, String EMAIL, String PAW, String toEMAIL, String TITLE,
   String CONTENT, String TYPE) {
 
  // 这个类主要是设置邮件
  MailBody mailInfo = new MailBody();
 
  mailInfo.setMailServerHost(SMTP);
  mailInfo.setMailServerPort(PORT);
  mailInfo.setValidate(true);
  mailInfo.setUserName(EMAIL);
  mailInfo.setPassword(PAW);
  mailInfo.setFromAddress(EMAIL);
  mailInfo.setToAddress(toEMAIL);
  mailInfo.setSubject(TITLE);
  mailInfo.setContent(CONTENT);
  // 这个类主要来发送邮件
 
  SendEmailUtil sms = new SendEmailUtil();
  try {
   if ("1".equals(TYPE)) {
    return sms.sendTextMail(mailInfo);
   } else {
    return sms.sendHtmlMail(mailInfo);
   }
  } catch (Exception e) {
   return false;
  }
 
 }
 
 public static void main(String[] args) {
  SendEmailUtil.sendEmail("smtp.isoftstone.com", "25", "441053249@qq.com",
    "whkay+11F", "441053249@qq.com", "系统邮件测试",
    "******审批流程 已审核!", "2");
 }
 
}

邮件需要使用的基本信息

package com.leon.isoftstoneweb.commen.utils.email;
 
import java.util.Properties;
 
 
/**
 * @author leon
 * @createDate 2018年6月22日 上午9:35:05
 * @version v1.0
 * @classRemarks 发送邮件需要使用的基本信息
 */
 
public class MailBody {
 
 // 发送邮件的服务器的IP和端口
 private String mailServerHost;
 private String mailServerPort = "25";
 // 邮件发送者的地址
 private String fromAddress;
 // 邮件接收者的地址
 private String toAddress;
 // 登陆邮件发送服务器的用户名和密码
 private String userName;
 private String password;
 // 是否需要身份验证
 private boolean validate = false;
 // 邮件主题
 private String subject;
 // 邮件的文本内容
 private String content;
 // 邮件附件的文件名
 private String[] attachFileNames;
 
 /**
  * 获得邮件会话属性
  */
 public Properties getProperties() {
  Properties p = new Properties();
  p.put("mail.smtp.host", this.mailServerHost);
  p.put("mail.smtp.port", this.mailServerPort);
  p.put("mail.smtp.auth", validate ? "true" : "false");
  return p;
 }
 
 public String getMailServerHost() {
  return mailServerHost;
 }
 
 public void setMailServerHost(String mailServerHost) {
  this.mailServerHost = mailServerHost;
 }
 
 public String getMailServerPort() {
  return mailServerPort;
 }
 
 public void setMailServerPort(String mailServerPort) {
  this.mailServerPort = mailServerPort;
 }
 
 public boolean isValidate() {
  return validate;
 }
 
 public void setValidate(boolean validate) {
  this.validate = validate;
 }
 
 public String[] getAttachFileNames() {
  return attachFileNames;
 }
 
 public void setAttachFileNames(String[] fileNames) {
  this.attachFileNames = fileNames;
 }
 
 public String getFromAddress() {
  return fromAddress;
 }
 
 public void setFromAddress(String fromAddress) {
  this.fromAddress = fromAddress;
 }
 
 public String getPassword() {
  return password;
 }
 
 public void setPassword(String password) {
  this.password = password;
 }
 
 public String getToAddress() {
  return toAddress;
 }
 
 public void setToAddress(String toAddress) {
  this.toAddress = toAddress;
 }
 
 public String getUserName() {
  return userName;
 }
 
 public void setUserName(String userName) {
  this.userName = userName;
 }
 
 public String getSubject() {
  return subject;
 }
 
 public void setSubject(String subject) {
  this.subject = subject;
 }
 
 public String getContent() {
  return content;
 }
 
 public void setContent(String textContent) {
  this.content = textContent;
 }
}

邮件服务器身份认证实体类

package com.leon.isoftstoneweb.commen.utils.email;
 
import javax.mail.*; 
 
/**
 * @author leon
 * @createDate 2018年6月22日 上午9:35:05
 * @version v1.0
 * @classRemarks 身份认证实体类
 */
 
public class MailAuthenticator extends Authenticator{ 
 String userName=null; 
 String password=null; 
  
 public MailAuthenticator(){ 
 } 
 public MailAuthenticator(String username, String password) { 
  this.userName = username; 
  this.password = password; 
 } 
 protected PasswordAuthentication getPasswordAuthentication(){ 
  return new PasswordAuthentication(userName, password); 
 } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

已被338人点赞
java中如何实现两个线程同时写一个文件
java中如何实现两个线程同时写一个文件

本文实例为大家分享了java两个线程同时写一个文件的具体代码,供大家参考,具体内容如下

1.多线程   

线程是程序执行流的最小单元。是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

多线程的意义就在于使得一个应用程序有多条执行路径,从而提高进程(程序)的执行效率。

2.JAVA中的多线程

2.1概述实现

JAVA实现多线程的方法有三种: 1)继承Thread实现多线程。2)通过实现Runnable接口方式实现多线程。3)使用ExecutorService、Callable、Future实现有返回结果的多线程。这三种方法的具体实现,在此先不一一赘述,网上有很多有关的博客,不明白的朋友可以去看看。

JAVA程序的运行原理便是命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程。然而JVM的启动必然也是多线程的,一般情况下,它最低有两个线程启动了:主线程和垃圾回收线程。

2.2线程生命周期

1)新建        2)就绪        3)运行        4)阻塞        5)死亡

java两个线程同时写一个文件

2.3线程的优先级

线程的调度有两种方式:1)分时调度。2)抢占式调度。JAVA采用的是后者,默认情况下,线程去抢占资源(CPU执行权)。我们可以通过setPriority方法,设置线程的优先级,默认是5,范围为1-10。但是一般情况下,光是设置线程的优先级,不能使得线程有序且高效执行,所以我们还需要学习更多的方法与原理机制。

2.4线程的控制(常见方法)

1)休眠线程        2)加入线程        3)礼让线程        4)后台线程        5)终止线程

2.5多线程的安全问题

在多线程的环境下,大多时候都是会共享数据,存在多条语句操作共享数据,这样很多时候会出现脏数据。所以为了解决线程的安全的问题,我们可以通过synchronized同步锁对象达到我们的目的。

1)同步代码块

synchronized(对象)

{

 需要被同步的代码块
}

2)同步方法

把同步加在方法上,这里的锁对象是this。

3)静态同步方法

把同步加在方法上。这里的锁是当前类的字节码文件。

PS:JDK5以后的针对线程的锁定操作和释放操作: Lock锁。

3.多线程写一个文件

如何实现多线程同时或读或写一个文件呢?我们都知道,一个文件在同一时间只能被一个线程读(写),如果要两个线程同时写一个文件,如何有效有序的分配这个临界资源呢?

下面我将通过一个例子,阐述我的解决方法 -——沉睡唤醒机制。

需求:两个线程写一个TXT文件,线程1:I love you  线程2:so do I 。保证线程1、2有序执行,一句I love you,对应一句so do I。

第一步,先创建WRFile类。这一步是关键的。

package cn.Thread.love;
 
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
 
public class WRFile {
 //String str;
 boolean flag;
 public WRFile()
 {
 
 }
 public synchronized void read1()
 {
 if(this.flag)
 {
 try {
 this.wait();
 } catch (InterruptedException e) {
 
 e.printStackTrace();
 }
 }
 RandomAccessFile ra = null;
 try {
 ra = new RandomAccessFile("love.txt", "rw");
 ra.seek(ra.length());
 
 ra.writeBytes("I love you");
 ra.writeBytes("\r\n");
 } catch (Exception e) {
 
 e.printStackTrace();
 }
 finally {
 try {
 ra.close();
 } catch (IOException e) {
 
 e.printStackTrace();
 }
 }
 //修改标记 唤醒线程
 this.flag = true;
 this.notify();
 }
 public synchronized void read2()
 {
 if(!this.flag)
 {
 try {
 this.wait();
 } catch (InterruptedException e) {
 
 e.printStackTrace();
 }
 }
 RandomAccessFile ra = null;
 try {
 ra = new RandomAccessFile("love.txt", "rw");
 ra.seek(ra.length());
 
 ra.writeBytes("so do I");
 ra.writeBytes("\r\n");
 } catch (Exception e) {
 
 e.printStackTrace();
 }
 finally {
 try {
 ra.close();
 } catch (IOException e) {
 
 e.printStackTrace();
 }
 }
 //修改标记 唤醒线程
 this.flag = false;
 this.notify();
 }
 
}

第二步,创建我们的两个线程类,第一个FirstThread。

package cn.Thread.love;
 
public class FirstThread implements Runnable {
private WRFile wr = new WRFile();
 
 public FirstThread(WRFile wr) {
 this.wr = wr;
 } 
 @Override
 public void run() {
 
 while(true)
 {
 wr.read1();
 }
 
 }
 
}

第二个SecondThread

package cn.Thread.love;
 
public class SecondThrad implements Runnable{
 private WRFile wr = new WRFile();
 public SecondThrad(WRFile wr) {
 this.wr = wr;
 }
 @Override
 public void run() {
 while(true)
 {
 wr.read2();
 }
 }
 
 
}

第三步,main方法启动线程

package cn.Thread.love;
 
public class LoveDemo {
 
 public static void main(String[] args) {
 //创建数据对象
 WRFile wr = new WRFile();
 //设置和获取类
 FirstThread ft = new FirstThread(wr);
 SecondThrad st = new SecondThrad(wr);
 //线程类
 Thread th1 = new Thread(ft);
 Thread th2 = new Thread(st);
 //启动线程
 th1.start();
 th2.start();
 }
 
}

即可实现两个线程同时(有序)写一个文件,两个以上,或是其他操作也可参考这种思想去实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

已被665人点赞
Java常用排序算法整理分享
Java常用排序算法整理分享

排序算法常用的有冒泡排序,选择排序和插入排序,下面将用Java语言实现这三种排序方式,并且介绍一种由插入排序拓展出来的希尔排序。

1、冒泡排序(BubbleSort)是一种最简单的排序算法。它的基本思想是迭代地对输入序列的第一个元素到最后一个元素进行俩俩比较,当满足条件时交换这俩个元素的位置,该过程持续到不需要执行上述过程的条件时。

总结Java常用排序算法

2、我们自定义一个排序的函数为sorter(int[]array);

  private static void sorter(int[] array)     for(int i=0;i<array.length-1;i++) {      for(int j=0;j<array.length-i-1;j++) {        if(array[j]>array[j+1]) {          int temp = array[j];          array[j] = array[j+1];          array[j+1] = temp;        }      }    }  }

 

完整代码如下图:

总结Java常用排序算法

3、运行结果如下:

总结Java常用排序算法

1、选择排序

选择排序(SelectSort)是一种原地(in-place)排序算法,适用于小文件。选择排序是基于键值并且交换是发生在需要交换时才执行,所以选择排序常用于数值较大和键值较小文件。

总结Java常用排序算法

2、

private static void sorter(int[] array)     for(int i=0;i<array.length-1;i++) {      int index = i;      for(int j=index;j<array.length-1;j++) {        if(array[index]>array[j+1]) {          index = j+1;        }      }      int temp = array[index];      array[index] = array[i];      array[i] = temp;    }  }

  

总结Java常用排序算法

3、运行结果

总结Java常用排序算法

1、插入排序

插入排序(InsertionSort)是一种简单且有效的比较排序算法,在每次迭代过程中算法随机的从输入序列中移除一个元素,并将该元素插入到排序序列中正确的位置,重复该过程,知道所有元素都被选择一次。

总结Java常用排序算法

 

2、

 

private static void sorter(int[] array)     for(int i=1;i<array.length;i++) {      int temp = array[i];      int j = i;      while(j>0&&temp<array[j-1]) {        array[j] = array[j-1];        j--;      }      array[j] = temp;    }  }

总结Java常用排序算法

3、运行结果

总结Java常用排序算法

1、希尔排序

希尔排序(ShellSort)又称缩小增量排序,该算法是一个泛化的插入排序。

总结Java常用排序算法

2、

public static void sorter(int[]array) {    for(int gap=array.length/2;gap>0;gap/=2) {      for(int i=gap;i<array.length;i++) {        int temp = array[i];        int j = i;        if(array[j]<array[j-1]) {          while(j-gap>=0&&temp<array[j-gap]) {            array[j] = array[j-gap];            j-=gap;          }          array[j] = temp;        }      }    }  }

 

总结Java常用排序算法

3、运行结果

总结Java常用排序算法

已被609人点赞
Java操作MongoDB插入数据进行模糊查询与in查询功能的方法
Java操作MongoDB插入数据进行模糊查询与in查询功能的方法

由于需要用MongoDB缓存数据,所以自己写了一套公共的存放和读取方法

具体如下:

存放mongodb:

/**
   * 公共方法:设置Object类型缓存
   * @author shijing
   * @param param
   * @param sysGuid
   */
  public void setObjData(Map<String,Object> param, String sysGuid, String enumBpd){
    DBObject dbObject = new BasicDBObject();
    dbObject.putAll(param);
    String collectionName = EnumBpd.getBpdType(enumBpd) + sysGuid;
    mongoDao.insertToCol(dbObject,collectionName);
  }
  /**
   * 公共方法:设置List缓存
   * @author shijing
   * @param paramList
   * @param sysGuid
   */
  public void setListData(List<Map<String,Object>> paramList, String sysGuid, String enumBpd){
    List<DBObject> list = new ArrayList<>();
    if(CollectionUtils.isNotNull(paramList)){
      for (Map<String,Object> param : paramList){
        DBObject dbObject = new BasicDBObject();
        dbObject.putAll(param);
        list.add(dbObject);
      }
    }
    String collectionName = EnumBpd.getBpdType(enumBpd) + sysGuid;
    mongoDao.insertToCol(list,collectionName);

mongoDao里面的方法:

public void insertToCol(DBObject document, String collectionName) {
    dropCol(collectionName);
    DBCollection dbCollection = mongoTemplate.createCollection(collectionName);
    dbCollection.insert(document);
  }
  public void insertToCol(List<DBObject> documents, String collectionName) {
    dropCol(collectionName);
    DBCollection dbCollection = mongoTemplate.createCollection(collectionName);
    dbCollection.insert(documents);
  }

读取方法

/**
   * 通过关键字模糊查询问题和答案库
   * @param param
   * @return
   */
  @Override
  public List<Map<String, Object>> searchQuestionAndAnswerByKeyword(Map<String, Object> param) {
    List<Map<String,Object>> searchList = new ArrayList<>();
    Map<String,Object> userInfo = SessionUtils.getUserInfo();
    String sysGuid = userInfo.get("sys_guid").toString();
    String collectionName = EnumBpd.getBpdType(EnumBpd.HELP_PAGE_LIST.getType())+sysGuid;
    //注释里面这种方式虽然能模糊查询,但是容易漏掉数据,切记切记!!!
    //Pattern pattern = Pattern.compile("^.*" + param.get("keyword") +".*$", Pattern.CASE_INSENSITIVE);
    BasicDBObject query= new BasicDBObject();
    //模糊查询的字段设置
    query.put("page_html", Pattern.compile((String) param.get("keyword")));
    DBCursor dbCursor = mongoDao.findAll(query,collectionName);
    List<DBObject> list = dbCursor.toArray();
    for (DBObject dbObject: list){
      searchList.add(dbObject.toMap());
    }
    //模糊查到的数据进行组装
    return getQuestionAndAnswerList(searchList);
  }
  /**
   * 公共方法:批量—— in方法查询List数据
   * @author shijing
   * @param ids id集合
   * @param paramMap 其他参数
   * @param columnName in字段列名
   * @param collectionName 表名
   * @return
   */
  @Override
  public List<Map<String, Object>> batchSearchPageListByIds(List<String> ids, Map<String,
      Object> paramMap, String columnName, String collectionName) {
    List<Map<String,Object>> searchList = new ArrayList<>();
    BasicDBObject query= new BasicDBObject();
    //批量查询,in
    if (CollectionUtils.isNotEmpty(ids)){
      BasicDBList values = new BasicDBList();
      values.addAll(ids);
      query.put(columnName, new BasicDBObject("$in",values));
    }
    //拼接参数
    if(MapUtils.isNotEmpty(paramMap)){
      for (String mapKey: paramMap.keySet()){
        query.put(mapKey, paramMap.get(mapKey));
      }
    }
    DBCursor dbCursor = mongoDao.findAll(query,collectionName);
    List<DBObject> list = dbCursor.toArray();
    if (dbCursor!=null && dbCursor.size()>0){
      for (DBObject dbObject: list){
        searchList.add(dbObject.toMap());
      }
    }
    return searchList;
  }
  /**
   * 公共方法:通过参数获取List数据
   * @author shijing
   * @param paramMap 参数
   * @param collectionName  表名
   * @return
   */
  @Override
  public List<Map<String, Object>> getListByParam(Map<String, Object> paramMap,String collectionName){
    List<Map<String,Object>> searchList = new ArrayList<>();
    BasicDBObject query= new BasicDBObject();
    //拼接参数
    if(MapUtils.isNotEmpty(paramMap)){
      for (String mapKey: paramMap.keySet()){
        query.put(mapKey, paramMap.get(mapKey));
      }
    }
    DBCursor dbCursor = mongoDao.findAll(query,collectionName);
    List<DBObject> list = dbCursor.toArray();
    if (dbCursor!=null && dbCursor.size()>0){
      for (DBObject dbObject: list){
        searchList.add(dbObject.toMap());
      }
    }
    return searchList;
  }
  /**
   * 公共方法:通过参数获取Object数据
   * @author shijing
   * @param paramMap
   * @param collectionName 表名
   * @return
   */
  @Override
  public Map<String, Object> getObjectByParam(Map<String, Object> paramMap, String collectionName) {
    Map<String,Object> webSiteInfo = new HashMap<>();
    BasicDBObject query= new BasicDBObject();
    //拼接参数
    if(MapUtils.isNotEmpty(paramMap)){
      for (String mapKey: paramMap.keySet()){
        query.put(mapKey, paramMap.get(mapKey));
      }
    }
    DBObject dbObject = mongoDao.findOne(query,collectionName);
    if(dbObject!=null){
      return dbObject.toMap();
    }
    return webSiteInfo;
  }

注意事项:

mongodb模糊查询时

Pattern pattern = Pattern.compile("^.*" + param.get("keyword") +".*$"

这种方式存在bug, 容易漏掉数据

应该使用下面这种方式:

query.put("page_html", Pattern.compile((String) param.get("keyword")));

先记录到这吧,有需要在补充,批量in方法也在上述代码里面。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对码农之家的支持。如果你想了解更多相关内容请查看下面相关链接

已被624人点赞
达内培训多少钱
达内培训多少钱

目前人们生活质量日渐提高,计算机行业正在迅速发展,这是个互联网连接的时代。在软件开发,网站建设甚至是一些游戏的程序都离不开java语言的编写设计,因此各大it企业正在高薪急聘高端java工程师。一些学习计算机java专业的学生去企业应聘,却没有被录取,这是因为他们在学习学习不精。要想学精java,其实java培训班比学校更适合大家。那么,java培训班哪家好呢?

达内java软件开发培训机构是国内一家知名的高端培训品牌,致力于培养我国计算机行业的杰出人才,尤其是培养大批高端java软件开发设计工程师。达内公司采用多重方案教学,先进的教学设备,一流的师资力量,赢得了越来越多的学员的信赖。目前,java工程师是很有前景的一份工作,学习java,就来达内java培训机构吧,java培训班达内免费试学,是你的不二之选。

java培训班3个月的培训效果怎么样呢?3个月的时间可以学好java嘛?一般java培训机构的时间只有短短的几个月,通常是四个月的时间,但也有的仅仅只有三个月,这不禁让很多人产生了疑惑,这么短的时间,足够我们学会java,学好java吗?这些担心并不是没有道理的,众所周知,java是一门枯燥难学的计算机专业课程,而java培训班则仅用几个月时间完成教学,但教学质量却比学校好得多。

俗话说“学到老,活到老。”学无止境,现如今人们的生活已经离不开互联网了,通过互联网建立的网站,开发的软件等等都能够带给人们不论是生活上的还是学习上的又或者是娱乐方面的便利。在互联网的每一个角落,其实都存在着java的身影。目前,越来越多的人加入到学习java的这个行列中来了,有些人会选择进入java培训机构学习,也有否定的。那么,在java培训班学习4个月有用吗?

三明市处于我国福建省的西北部地区,这个地方绿化做的很好,拥有几家国家级的地质公园等等,是许多人想要去旅游的好地方。在三明,不仅风景秀丽,那里的学生也是积极上进的,在这个java软件开发设计工程师是最热门的职业之一的时代,三明市自然也少不了开设了许多java培训机构。那么,java培训班三明有哪些呢?接下来,我就来给大家介绍几家三明java培训班吧。

已被867人点赞
参考资料
Java编程思维
Java编程思维 全书中文版

本书从编程基础知识入手,用Java代码示例诠释计算机科学概念,教读者掌握“解决问题”的思维方式,具备Java编程思想,实用的计算机入门教程,无任何编程经验者的理想选择

立即下载
Java线程与并发编程实践
Java线程与并发编程实践 超清中文版

本书全面介绍Java多线程编程技术,针对Java 8中的线程特性和并发工具的快速学习和实践指南,适合有一定基础的Java程序员阅读学习,尤其适合想要掌握Java线程和并发工具的读者阅读参考

立即下载
Java 8基础应用与开发
Java 8基础应用与开发 超清扫描版

《 Java8基础应用与开发 》包含Java8特点,知识结构图从入门到精通逐层加强,Q-DMS数据挖掘项目围绕本书,重视內容和实践活动,说道关键点和方式。结合实际成才全书的特性: 基础理论基础

立即下载
Java微服务
Java微服务 高清版

微服务是利用云平台开发企业应用程序的最新技术,它是小型、轻量和过程驱动的组件。微服务适合设计可扩展、易于维护的应用程序。它可以使开发更容易,还能使资源得到最佳利用。本书

立即下载
你不知道的JavaScript 下卷
你不知道的JavaScript 下卷 影印版

本书讲解JavaScript开发人员不求甚解的大趋势,深入理解语言内部的机制,全面介绍JavaScript中常被人误解和忽视的重要知识点,分为上中下三套,欢迎下载

立即下载

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com