Java教程 第3页

完整的java数组操作应用知识汇总-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

完整的java数组操作应用知识汇总

数组是一种非常有用和常用的数据类型,存在于每种程序语言之中,java中的数组是一种最简单的复合数据类型,刚学习java数组的小白们大多都会听到一句这样的话:java是纯面向对象的语言,它的数组也是一个对象。所以很多人就按照一个对象的方式来使用数组,后来你会发现,将数组作为一个类来使用在实现上是多么的“不自然”。下面就来全面了解一下关于java中数组的知识。 什么是数组 数组是同一种类型数据的集合,其实就是一个容器。运算的时候有很多数据参与运算,那么首先需要做的是什么。不是如何运算而是如何保存这些数据以便于后期的运算,那么数组就是一种用于存储数据的方式,能存数据的地方我们称之为容器,容器里装的东西就是数组的元素,数组可以装任意类型的数据,虽然可以装任意类型的数据,但是定义好的数组只能装一种元素, 也就是数组一旦定义,那么里边存储的数据类型也就确定了。 数组的特点 1.在Java中,无论使用数组或集合,都有边界检查。如果越界操作就会得到一个RuntimeException异常。 2.数组只能保存特定类型。数组可以保存原生数据类型,集合则不能。集合不以具体的类型来处理对象,它们将所有对象都按Object类型处理,集合中存放的是对象的引用而不是对象本身。 3.集合类只能保存对象的引用。而数组既可以创建为直接保存原生数据类型,也可以保存对象的引用。在集合中可以使用包装类(Wrapper Class),如Integer、Double等来实现保存原生数据类型值。 4.对象数组和原生数据类型数组在使用上几乎是相同的;唯一的区别是对象数组保存的是引用,原生数据类型数组保存原生数据类型的值。 int a = 10; Integer integer = new Integer(a); int b = integer.intValue(); System.out.println(a = b); 数组的正确使用 如果需要存储大量的数据,例如如果需要读取100个数,那么就需要定义100个变量,显然重复写100次代码,是没有太大意义的。如何解决这个问题,Java语言提供了数组(array)的数据结构,是一个容器可以存储相同数据类型的元素,可以将100个数存储到数组中。这时候数组就有很大的帮助了~ 数组的格式 格式一: 元素类型[]数组名 = new元素类型[元素个数或数组长度]; int[] arr = new int[5]; arr[0] = 1; arr[1] = 2; 格式二: 元素类型[]数组名 = new元素类型[]{元素,元素,……}; int[] arr = new int[]{3,5,1,7}; int[] arr = {3,5,1,7}; 注意:给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小。创建数组之后不能修改数组的大小。可以使用length属性获取数组的大小。 声明数组变量 为了使用数组必须在程序中声明数组,并指定数组的元素类型=左半部分: 先写左边明确了元素类型 是int ,容器使用数组,那么如何来标识数组?.那么用一个特殊的符号[]中括号来表示。想要使用数组是需要给数组起一个名字的,那么我们在这里给这个数组起名字为arr .接着跟上等号。 代码体现:  int [] arr 示例: String[] aArray = new String[5]; String[] bArray = {"a","b","c", "d", "e"}; String[] cArray = new String[]{"a","b","c","d","e"}; 注意:int arr[] 也是一种创建数组的格式。推荐使用int [] arr 的形式声明数组。 创建数组的三种方式及区别 public static void main(String[] args) { // 1.方式一 声明 分配空间并赋值 int[] arr1 = {1,2,3}; // 2.方式二 显示初始化 int[] arr2; arr2 = new int[]{1,2,3}; // 3.方式三 显示初始化() int[] arr3;...

Java 接口

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。 接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在Java中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。 接口与类相似点: 一个接口可以有多个方法。 接口文件保存在.java结尾的文件中,文件名使用接口名。 接口的字节码文件保存在.class结尾的文件中。 接口相应的字节码文件必须在与包名称相匹配的目录结构中。  接口与类的区别: 接口不能用于实例化对象。 接口没有构造方法。 接口中所有的方法必须是抽象方法。 接口不能包含成员变量,除了static和final变量。 接口不是被类继承了,而是要被类实现。 接口支持多重继承。 接口的声明 接口的声明语法格式如下: [可见度] interface 接口名称 [extends 其他的类名] { // 声明变量 // 抽象方法 } Interface关键字用来声明一个接口。下面是接口声明的一个简单例子。 /* 文件名 : NameOfInterface.java */ import java.lang.*; //引入包 public interface NameOfInterface { //任何类型 final, static 字段 //抽象方法 } 接口有以下特性: 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。 接口中的方法都是公有的。 实例 /* 文件名 : Animal.java */ interface Animal { public void eat(); public void travel(); } 接口的实现 当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。 类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。 实现一个接口的语法,可以使用这个公式: ... implements 接口名称[, 其他接口, 其他接口..., ...] ... 实例 /* 文件名 : MammalInt.java */ public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel();...

JavaFX 区域图-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

JavaFX 区域图

JavaFX教程 – JavaFX区域图 区域图是另一种类型的双轴图表。 import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.StackedAreaChart; import javafx.scene.chart.XYChart; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { Group root = new Group(); final NumberAxis xAxis = new NumberAxis(1, 12, 1); final NumberAxis yAxis = new NumberAxis(); final StackedAreaChart<Number,Number> stackedAreaChart = new StackedAreaChart<Number,Number>(xAxis,yAxis); final XYChart.Series<Number,Number> series1 = new XYChart.Series<Number,Number>(); xAxis.setLabel("Month"); yAxis.setLabel("Value"); stackedAreaChart.setTitle("StackedAreaChart"); series1.setName("XYChart.Series 1"); series1.getData().add(new XYChart.Data(1, 100)); series1.getData().add(new XYChart.Data(2, 200)); series1.getData().add(new XYChart.Data(10, 150)); XYChart.Series<Number,Number> series2 = new XYChart.Series(); series2.setName("XYChart.Series 2"); series2.getData().add(new XYChart.Data(1, 50)); series2.getData().add(new XYChart.Data(2, 200)); series2.getData().add(new XYChart.Data(10, 260)); stackedAreaChart.getData().addAll(series1, series2); root.getChildren().addAll(stackedAreaChart); primaryStage.setScene(new Scene(root, 500, 400)); primaryStage.show(); } } 上面的代码生成以下结果。 创建区域图 要创建区域图,请使用AreaChart对象和使用XYChart.Series类创建一个或多个数据系列,并将数据分配给图表。 import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.chart.AreaChart;...

JavaFX 线-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

JavaFX 线

JavaFX教程 – JavaFX线 为了在JavaFX场景上渲染图形,我们需要基本的形状和颜色。 Node 类是所有JavaFX场景图形节点的基本基类。它提供了转换,翻译和应用效果到任何节点的能力。 javafx.scene.shape.Shape 类是 Node 类的后代。 所有较旧的JavaFX 2.x Builder类在JavaFX 8中已弃用。 JavaFX线 当在JavaFX场景图形上绘制时,使用屏幕坐标空间(系统)渲染线。 屏幕坐标系将(0,0)放在左上角。 x坐标沿x轴移动点。从上到下移动点时,y坐标值增加。 下图显示了右侧的屏幕坐标系。 在JavaFX中,场景图形对象(如线,圆和矩形)是Shape类的派生类。 所有形状对象可以在两个成形区域之间执行几何操作,例如减法,相交和并集。 要在JavaFX中绘制线条,我们将使用 javafx.scene.shape.Line 类。 要创建一个 Line 对象,我们需要指定一个开始(x,y)坐标和结束坐标。 创建线节点时,有两种方法来设置起点和终点。 第一种方法使用具有参数startX,startY,endX和endY的构造函数所有参数的数据类型为 double 。 以下代码使用构造函数创建具有起点(100,10)和终点(10,110)的线。 Line line = new Line(100, 10, 10, 110); 创建行节点的第二种方法是使用空构造函数来实例化 Line 类,然后使用setter方法设置每个属性。 以下代码显示如何创建线对象和使用setter方法设置行的起点和终点。 Line line = new Line(); line.setStartX(100); line.setStartY(10); line.setEndX(10); line.setEndY(110); 在场景图上绘制的线节点默认为1.0的笔触宽度和黑色的笔触颜色。 所有形状的笔触颜色都为null,这意味着除了Line,Polyline和Path节点之外没有颜色。 要创建不同种类的线,我们可以设置属性继承自父类 javafx.scene.shape.Shape 的属性。 下表显示了我们可以在一行上设置的属性。 要检索或修改每个属性,您将使用其适当的getter和setter方法。 属性 数据类型 / 说明 fill javafx.scene.paint.Paint用于填充形状内的颜色。 smooth BooleanTrue表示打开反锯齿,false表示关闭反锯齿。 strokeDashOffset Double将距离设置为虚线图案。 strokeLineCap javafx.scene.shape.StrokeLineCap 在线或路径的末尾设置帽样式。有三种样式: StrokeLineCap.BUTT StrokeLineCap.ROUND StrokeLineCap.SQUARE strokeLineJoin javafx.scene.shape.StrokeLineJoin当线相遇时设置装饰。有三种类型: StrokeLineJoin.MITER StrokeLineJoin.BEVEL StrokeLineJoin.ROUND strokeMiterLimit Double设置斜角接缝的限制以及斜角接缝装饰StrokeLineJoin.MITER。 stroke javafx.scene.paint.Paint设置形状的笔划线的颜色。 strokeType javafx.scene.shape.StrokeType设置在Shape节点的边界周围绘制描边的位置。有三种类型: StrokeType.CENTERED StrokeType.INSIDE StrokeType.OUTSIDE strokeWidth Double设置线的宽度。 例子 以下代码创建一个Line对象,并使用setter方法设置开始和结束坐标。 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.VBox; import javafx.scene.shape.Line; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage stage) { VBox box = new...

Java 8 Optional 类-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 8 Optional 类

Java 8 Optional 类 Java 8 新特性 Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。 Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。 Optional 类的引入很好的解决空指针异常。 类声明 以下是一个 java.util.Optional<T> 类的声明: public final class Optional<T> extends Object 类方法 序号 方法 & 描述 1 static <T> Optional<T> empty() 返回空的 Optional 实例。 2 boolean equals(Object obj) 判断其他对象是否等于 Optional。 3 Optional<T> filter(Predicate<? super T> predicate) 如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。 4 <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper) 如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional 5 T get() 如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException 6 int hashCode() 返回存在值的哈希码,如果值不存在 返回 0。 7 void ifPresent(Consumer<? super T> consumer) 如果值存在则使用该值调用 consumer , 否则不做任何事情。 8 boolean isPresent() 如果值存在则方法会返回true,否则返回 false。 9 <U>Optional<U> map(Function<? super T,? extends U> mapper) 如果存在该值,提供的映射方法,如果返回非null,返回一个Optional描述结果。 10 static <T> Optional<T> of(T value) 返回一个指定非null值的Optional。 11 static <T> Optional<T> ofNullable(T value) 如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。 12 T orElse(T other) 如果存在该值,返回值, 否则返回 other。 13 T orElseGet(Supplier<? extends...

细说java解析xml文档的常用方法(含实例)-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

细说java解析xml文档的常用方法(含实例)

XML (eXtensible Markup Language) 意为可扩展标记语言,被多数技术人员用以选择作为数据传输的载体,成为一种通用的数据交换格式,xml的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的便利。在不同的语言中,解析xml的方式都是一样的,只不过实现的语法不同而已。众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J。 这四种方法的jar包下载地址: ①DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 ②SAX:http://sourceforge.net/projects/sax/ ③JDOM:http://jdom.org/downloads/index.html ④DOM4J:http://sourceforge.net/projects/dom4j/ 下面以一个实例来具体说明这4种方法: xml文件: <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE>    <NO>A1234</NO>    <ADDR>四川省XX县XX镇XX路X段XX号</ADDR> </VALUE> <VALUE>    <NO>B1234</NO>    <ADDR>四川省XX市XX乡XX村XX组</ADDR> </VALUE> </RESULT> 1、使用DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。 实现方法: import java.io.*; import java.util.*; import org.w3c.dom.*; import javax.xml.parsers.*; public class MyXMLReader{  public static void main(String arge[]){   long lasting =System.currentTimeMillis();   try{    File f=new File("data_10k.xml");    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();    DocumentBuilder builder=factory.newDocumentBuilder();    Document doc = builder.parse(f);    NodeList nl = doc.getElementsByTagName("VALUE");    for (int i=0;i<nl.getLength();i++){     System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());     System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());    }   }catch(Exception e){    e.printStackTrace(); } 【优点】 ①允许应用程序对数据和结构做出更改。 ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。 【缺点】 通常需要加载整个XML文档来构造层次结构,消耗资源大。 2. 使用SAX SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。 选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说, 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。 DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。 SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。 实现方法: import org.xml.sax.*; import org.xml.sax.helpers.*; import javax.xml.parsers.*; public class MyXMLReader extends DefaultHandler {  java.util.Stack tags = new java.util.Stack();  public MyXMLReader() {   super();...

学习java数据结构的重要性及分类总结-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

学习java数据结构的重要性及分类总结

有一个问题困扰着许多初学java的新手们,那就是有必要去学习数据结构吗?虽然你可能没有特意去看一些数据结构的专业书籍,你仍然可以用java做一份还过得去的工作,不过并不是说你完全没有接触到数据结构,因为java已经在底层帮你做了太多,在你和数据结构打交道的时候,你所做更多的是在调用 API 。当你的代码量累积到一定程度的时候,就会想要去加强数据结构和算法的相关知识了。 打个比方,你可以把java看做是自动档轿车,数据结构呢就是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子开上路,而且未必就比懂得的人慢。写程序这件事,和开车一样,经验可以起到很大作用,但如果你不知道底层是怎么工作的,就永远只能开车,既不会修车,也不能造车。如果你对这两件事都不感兴趣也就罢了,数据结构懂得用就好。但若你此生在编程领域还有点更高的追求,数据结构是绕不开的课题。 此外,很重要的一点是,数据结构也是通向各种实用算法的基石,所以学习数据结构都是提升内力的事情。这里推荐一本书《Java数据结构和算法》,这本书以一种易懂的方式教授如何安排和操纵数据的问题,它使用java语言说明重要的概念,而避免了C/C++语言的复杂性,以便集中精力论述数据结构和算法。经验丰富的作者RorbertLafore先生提供了许多简单明了的例子,避免了对于这类例题常见的冗长、繁锁的数学证明。在本书的每一章后都有问题和练习,使读者有机会测试自己的理解程度。 点此下载电子书 java中的数据结构总结 线性表,链表,哈希表是常用的数据结构,在进行java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。下面通过简单的描述,为你阐述各个类的作用以及如何正确使用这些类。 Collection Map Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。 所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。 如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下: Iterator it = collection.iterator(); // 获得一个迭代子 while(it.hasNext()) { Object obj = it.next(); // 得到下一个元素 } 由Collection接口派生的两个接口是List和Set。 主要方法: 1、boolean add(Object o)添加对象到集合 2、boolean remove(Object o)删除指定的对象 3、int size()返回当前集合中元素的数量 4、boolean contains(Object o)查找集合中是否有指定的对象 5、boolean isEmpty()判断集合是否为空 6、Iterator iterator()返回一个迭代器 7、boolean containsAll(Collection c)查找集合中是否有集合c中的元素 8、boolean addAll(Collection c)将集合c中所有的元素添加给该集合 9、void clear()删除集合中所有元素 10、void removeAll(Collection c)从集合中删除c集合中也有的元素 11、void retainAll(Collection c)从集合中删除集合c中不包含的元素 List接口 List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 和下面要提到的Set不同,List允许有相同的元素。 除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。 实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。 主要方法: 1、void add(int index,Object element)在指定位置上添加一个对象 2、boolean addAll(int index,Collection c)将集合c的元素添加到指定的位置 3、Object get(int index)返回List中指定位置的元素 4、int indexOf(Object o)返回第一个出现元素o的位置. 5、Object removeint(int index)删除指定位置的元素 6、Object set(int index,Object element)用元素element取代位置index上的元素,返回被取代的元素 LinkedList类 LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。 注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List: List list = Collections.synchronizedList(new LinkedList(...)); ArrayList类 ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。 size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 和LinkedList一样,ArrayList也是非同步的(unsynchronized)。 主要方法: 1、Boolean add(Object o)将指定元素添加到列表的末尾 2、Boolean add(int index,Object element)在列表中指定位置加入指定元素 3、Boolean addAll(Collection c)将指定集合添加到列表末尾 4、Boolean addAll(int index,Collection c)在列表中指定位置加入指定集合 5、Boolean clear()删除列表中所有元素 6、Boolean...

java switch基础介绍及具体使用方法-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

java switch基础介绍及具体使用方法

在编写代码时,逻辑判断是避免不了的,switch case语句在很多编程语言中的功能都是用于条件判断,java中为多路分支选择流程专门提供了switch语句,switch语句根据一个表达式的值,选择运行多个操作中的一个。当需要对选项进行等值判断时,使用switch语句更加简洁明了。switch的case语句可以处理int,short,byte,char类型的值,但是不能处理long,String等类型。说起来你应该也会想到另一个常用的条件判断语句if else,本文重点介绍java中switch case语句的用法,但是会在篇末对两种语句的区别做一个总结。 java switch基础语法 switch(表达式){ case 表达式常量1:语句1; break; case 表达式常量2:语句2; break; ...... case 表达式常量n:语句n; break; [default:语句n+1;] } 其中,一个case表达式常量成为标号,代表一个case分支的入口。switch语句在运行时首先计算switch圆括号中“表达式”的值,这个值必须是整型或字符型的,同时后面各个case表达式常量的值的类型应与switch圆括号中“表达式”的值类型一致。一个case语句代表一个制定操作,然后转向结构出口。default子句是可选的,当表达式的值与case表达式常量的值都不匹配时,就运行default子句,转向结构出口。  java里switch的执行顺序 switch表达式的值决定选择哪个case分支,如果找不到相应的分支,就直接从”default” 开始输出。 当程序执行一条case语句后,因为例子中的case分支中没有break 和return语句,所以程序会执行紧接于其后的语句。   public class Switch { public static void main(String[] args) { int x=0; switch(x) { default: System.out.println("default"); case 1: System.out.println(1); case 2: System.out.println(2); } } }  输出结果如下: default 1 2 public class Switch { public static void main(String[] args) { int x = 0; switch (x) { default: System.out.println("default"); case 0: System.out.println(0); case 1: System.out.println(1); case 2: System.out.println(2); } } } 输出结果如下: 0 1 2 public class Switch { public static void main(String[] args) { int x = 0; switch (x) { case 0: System.out.println(0); case 1: System.out.println(1); case 2: System.out.println(2); default: System.out.println("default"); } } } 输出结果如下: 0...

实例助解java定时器设置及停止的方法-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

实例助解java定时器设置及停止的方法

在开发工作中,我们常常会需要一些周期性的操作,比如每5分钟执行一次某个程序,又比如定时检查数据库连接池中的连接数,每晚定时备份数据等等,在java中,最方便、最高效的实现方式就是用java.util.Timer工具类,再通过调度java.util.TimerTask任务,不过,使用这种方式虽然可以让你的程序按照某一个频度执行,但不能在指定时间运行。下面就具体了解一下java定时器设置的几种常用方法及使其停止的方法。 java.util.Timer和java.util.TimerTask基本介绍: Timer是一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。实际上是个线程,定时调度所拥有的TimerTasks。 TimerTask是一个抽象类,它的子类由 Timer 安排为一次执行或重复执行的任务。实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内。 java定时任务的基本方法: 1、创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果; 2、 用Timer和TimerTask与第一种方法相比有如下好处: 当启动和去取消任务时可以控制 第一次执行任务时可以指定你想要的delay时间 3、 用ScheduledExecutorService是从的java.util.concurrent里做为并发工具类被引进的,这是最理想的定时任务实现方式,相比于上两个方法,它有以下好处: 相比于Timer的单线程,它是通过线程池的方式来执行任务的 可以很灵活的去设定第一次执行任务delay时间 提供了良好的约定,以便设定执行的时间间隔 4、基于spring框架的定时任务来实现: 可以使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行。 从作业类的继承方式来讲,可以分为两类:作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask。作业类即普通的java类,不需要继承自任何基类。 注:比较推荐使用第二种方式,因为这样所以的类都是普通类,不需要事先区别对待。 从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种: 每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean 每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean 注:并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。Quartz和spring task都可以支持这两种触发条件。 用法说明: 第一种,作业类继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean。 第一步:定义作业类 Java代码 import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class Job1 extends QuartzJobBean { private int timeout; private static int i = 0; //调度工厂实例化后,经过timeout时间开始执行调度 public void setTimeout(int timeout) { this.timeout = timeout; } /** * 要调度的具体任务 */ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("定时任务执行中…"); } } 第二步:spring配置文件中配置作业类JobDetailBean Xml代码 <bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.gy.Job1" /> <property name="jobDataAsMap"> <map> <entry key="timeout" value="0" /> </map> </property> </bean> 说明:org.springframework.scheduling.quartz.JobDetailBean有两个属性,jobClass属性即我们在java代码中定义的任务类,jobDataAsMap属性即该任务类中需要注入的属性值。 第三步:配置作业调度的触发方式(触发器) Quartz的作业触发器有两种,分别是 org.springframework.scheduling.quartz.SimpleTriggerBean org.springframework.scheduling.quartz.CronTriggerBean 第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。 配置方式如下: Xml代码 <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="job1" /> <property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 --> <property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 --> </bean> 第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。 配置方式如下: Xml代码  <bean id="cronTrigger"...

java反射机制深入理解剖析-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

java反射机制深入理解剖析

在java开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的。java通常是先有类再有对象,有对象就可以调用方法或者属性,java中的反射其实是通过Class对象来调用类里面的方法。掌握了反射的知识,才能更好的学习java高级课程。 反射简介: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。 一个类有多个组成部分,例如:成员变量、方法、构造方法等, 反射就是加载类,并解剖出类的各个组成部分。 反射机制主要提供以下功能: ①在运行时判断任意一个对象所属的类; ②在运行时构造任意一个类的对象; ③在运行时判断任意一个类所具有的成员变量和方法; ④在运行时调用任意一个对象的方法; ⑤生成动态代理。 java中的反射及作用: 假如有两个程序员,一个程序员在写程序的时需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码是不能通过编译的。此时,利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。 Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的“自审”。如eclipse中,一按点,编译工具就会自动的把该对象能够使用的所有的方法和属性全部都列出来,供用户进行选择。这就是利用了Java反射的原理,是对我们创建对象的探知、自审。 java反射机制中有哪些类: java.lang.Class; java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier; 反射机制的相关API 通过一个对象获得完整的包名和类名 : package net.xsoftlab.baike; public class TestReflect { public static void main(String[] args) throws Exception { TestReflect testReflect = new TestReflect(); System.out.println(testReflect.getClass().getName()); // 结果 net.xsoftlab.baike.TestReflect } } 实例化Class类对象 package net.xsoftlab.baike; public class TestReflect { public static void main(String[] args) throws Exception { Class<?> class1 = null; Class<?> class2 = null; Class<?> class3 = null; // 一般采用这种形式 class1 = Class.forName("net.xsoftlab.baike.TestReflect"); class2 = new TestReflect().getClass(); class3 = TestReflect.class; System.out.println("类名称 " + class1.getName()); System.out.println("类名称 " + class2.getName()); System.out.println("类名称 " + class3.getName()); } } 获取一个对象的父类与实现的接口 package net.xsoftlab.baike; import java.io.Serializable; public class TestReflect implements Serializable { private static final long serialVersionUID = -2862585049955236662L; public static...