一、数组
1.数组的概念
数组,顾名思义就是一组数据。数组对于每一门编程语言来说都是重要的数据结构之一,当然不同的语言对数组的实现以及处理也不尽相同。Java语言中提供的数组用来存储固定大小的同类型元素。
在Java中,数组也可以认为是一种数据类型,它本身是一种引用类型。Java的数组可以存储基本类型的数据,也可以存储引用类型的数据。比如存储int类型:
//首先声明一个int[]类型的变量x,然后创建一个长度为100的数组。
int[] x;
x=new int[100];
2.一维数组
一维数组就是一组具有相同类型的数据的集合,一维数组中的元素是按顺序存放的。
2.1 数组的声明
要使用Java中的数组,必须先声明数组,再为数组分配内存空间。一维数组的声明有两种方式,语法格式如下:
数据类型 数组名[];
数据类型[] 数组名;
- 数据类型:指明数组中元素的类型
- 数组名:一个合法的java标识符
- 中括号‘[]’:表示数组的维数,一对中括号表示一维数组。
java语言使用new操作符来创建数组,语法格式如下:
arrayRefvar = new dataType[arraySize];
声明数组变量和创建数组可以用一条语句来完成,语法格式如下
dataType[] arrayRefvar = new dataType[arraySize];
另外,用户还可以使用以下的方式创建数组,语法格式如下
dataType[] arrayRefvar = {value0,value1,value2,...,valuek};
数组的元素是通过索引访问的,数组索引从零开始,索引为0到arrayRefVar.length-1。
例:声明数组应用实例
public class Test{
public static void main(String[] args){
int [] a1; //声明数组变量
a1 = new int [3]; //创建数组对象
System.out.println("a1[0]="+a1[0]); //访问数组中的第一个元素
System.out.println("a1[1]="+a1[1]); //访问数组中的第二个元素
System.out.println("a1[2]="+a1[2]); //访问数组中的第三个元素
System.out.println("数组的长度是"+a1.length); //数组的长度
}
}
运行结果如图
本例中,访问了数组的元素 但是没有给数组赋值,所有打印的是默认值0,数组对象有一个属性length,可以用来获取数组元素的个数,称为数组长度。
例:数组的声明,默认值和赋值应用实例
public class Test{
public static void main(String[] args){
int [] a1 = new int [3]; //创建数组对象
a1[0]=1; //为第一个元素赋值为1
a1[2]=3; //为第三个元素赋值为3
System.out.println("a1[0]="+a1[0]); //访问数组中的第一个元素
System.out.println("a1[1]="+a1[1]); //访问数组中的第二个元素
System.out.println("a1[2]="+a1[2]); //访问数组中的第三个元素
}
}
运行结果如图所示
2.2 初始化数组
在Java中,初始化数组有静态动态两种方式。
在定义数组时指定数组的长度,并由系统自动为元素赋初值,称为动态初始化。
例: 数组动态初始化应用实例
public class Test{
public static void main(String[] args){
int size = 10;
int[] mylist = new int[size];
mylist[0] = 5;
mylist[1] = 4;
mylist[2] = 3;
mylist[3] = 2;
mylist[4] = 18;
mylist[5] = 25;
mylist[6] = 34;
mylist[7] = 68;
mylist[8] = 102;
mylist[9] = 1000;
//计算所有元素的总和
int result=0;
for(int i=0;i<size;i++) {
result+=mylist[i];
}
System.out.println("总和为:"+result);
}
}
运行结果如下
数组的初始化还有一种静态方式,就是在定义数组的同时,就为每个数组的元素赋值。数组的静态初始化有两种方法,格式如下:
1. 类型[] 数组名 = new 类型[] {元素,元素,...};
2. 类型[] 数组名 = {元素,元素,元素,...};
例:数组静态初始化应用实例
public class Test{
public static void main(String[] args){
int [] a1 = {1,2,3,4};
String[] a2=new String[] {"java","PHP","Python"};
//访问数组的元素
System.out.println("a1[0]="+a1[0]);
System.out.println("a1[1]="+a1[1]);
System.out.println("a1[2]="+a1[2]);
System.out.println("a1[3]="+a1[3]);
System.out.println("a2[0]="+a2[0]);
System.out.println("a2[1]="+a2[1]);
System.out.println("a2[2]="+a2[2]);
}
}
运行结果如图
3. 多维数组
多维数组的声明与一维数组类似,一维数组要使用一个大括号,二维数组使用两个大括号,以此类推,常用的多维数组是二维数组
3.1 数组的声明
多维数组可以看出数组的数组。二维数组就是一个特殊的一维数组,其每个元素都是一个一维数组,如
String str[] [] =new String[3][4]
多维数组的初始化(以二维数组为例)有两种
(1)直接为每一维分配空间,格式如下:
type arrayName = new type[arraylength1] [arraylenght2];
type可以为基本数据类型和复合数据类型,arraylength1和arraylength2必须为正整数,arraylength1为行数,arraylength2为列数。例如
int a [] [] =new int[2][3];
二维数组a可以看成一个两行三列的数组。
(2)从最高维开始,分别为每一维分配空间。例如:
public class Test{
public static void main(String[] args){
String s[] [] =new String[2][3];
s[0] = new String[2];
s[1] =new String[3];
s[0][0] =new String("Good");
s[0][1] =new String("Luck");
s[1][0] =new String("to");
s[1][1] =new String("you");
s[1][2] =new String("!");
for(int i=0;i<s.length;i++) { //使用for循环遍历多维数组
for(int y=0;y<s[i].length;y++) {
System.out.println(s[i][y]);
}
}
}
}
二、文件流
文件流是用来对文件进行读写的流类,主要包括FileWriter类和FileReader类
1 FileReader类
FileReader类创建了一个可以读取文件内容的Reader类。它最常用的构造方法如下
FileReader(String filePath)
FileReader(File fileObj)
这两个方法都能引发一个FileNotFoundException异常。在这里filePath是一个文件完整的路径,fileObj是描述该文件的File对象。
2.FileWriter类
FileWriter创建一个可以写文件的Writer类。它最常用的构造方法如下:
FileWriter(String filePath)
FileWriter(String filePath,boolean append)
FileWriter(File fileObj)
它们可以引发IOException或者SecurityException异常。在这里filePath是文件的绝对路径,fileObj是描述该文件的File对象。如果append为true,输出是附加到文件尾的。FileWriter类的创建不依赖于文件存在与否。在创建文件之前,FileWriter将在创建对象时打开它 来作为输出。如果试图打开一个只读文件,将引发一个IOException异常。
例:利用文件流实现文件的复制功能
import java.util.Scanner;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
public class Test{
public static void main(String[] args)throws IOException{
Scanner scanner=new Scanner(System.in);
System.out.println("请输入原文件名和目的文件名,中间用空格隔开");
String s=scanner.next(); //读取源文件名
String d=scanner.next(); //读取目的文件名
File file1 = new File(s); //创建源文件对象
File file2 = new File(d); //创建目的文件对象
if(!file1.exists()) {
System.out.println("被复制的文件不存在");
System.exit(1);
}
InputStream input = new FileInputStream(file1); //创建源文件流
OutputStream output = new FileOutputStream(file2);//创建目的文件流
if(input !=null && output!=null) {
int temp=0;
while((temp=input.read())!=(-1)) {
output.write(temp);
}
}
input.close();
output.close();
System.out.println("复制文件成功");
}
}
运行结果如图:
三、JFreeChart图表
JFreeChart主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。
1.绘制
需要的jar包:jfreechart-1.0.13.jar jcommon-1.0.16.jar
官网:http://www.jfree.org/index.html
柱状图(CategoryPlot): CategoryPlot plot=chart.getCategoryPlot();
//获取图表区域对象 CategoryAxis domainAxis=plot.getDomainAxis();
//水平底部列表 domainAxis.setLabelFont(new Font(“黑体”,Font.BOLD,14));
//水平底部标题 domainAxis.setTickLabelFont(new Font(“宋体”,Font.BOLD,12));
//垂直标题 ValueAxis rangeAxis=plot.getRangeAxis();
//获取柱状 rangeAxis.setLabelFont(new Font(“黑体”,Font.BOLD,15)); chart.getLegend().setItemFont(new Font(“黑体”, Font.BOLD, 15));
饼图(PiePlot): JFreeChart chart = ChartFactory.createPieChart3D(“IT行业职业分布图”, dataset, true, false, false);
chart.getTitle().setFont(new Font(“黑体”,Font.BOLD,20));//设置标题字体
PiePlot piePlot= (PiePlot) chart.getPlot();//获取图表区域对象
piePlot.setLabelFont(new Font(“黑体”,Font.BOLD,10)); chart.getLegend().setItemFont(new Font(“黑体”,Font.BOLD,10));
例:折线图应用实例
package com.test;
import java.awt.Color;
import java.awt.Font;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
public class Test {
public static void main(String[] args) {
StandardChartTheme mChartTheme = new StandardChartTheme("CN");
mChartTheme.setLargeFont(new Font("黑体", Font.BOLD, 20));
mChartTheme.setExtraLargeFont(new Font("宋体", Font.PLAIN, 15));
mChartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 15));
ChartFactory.setChartTheme(mChartTheme);
CategoryDataset mDataset = GetDataset();
JFreeChart mChart = ChartFactory.createLineChart(
"折线图",
"年份",
"数量",
mDataset,
PlotOrientation.VERTICAL,
true,
true,
false);
CategoryPlot mPlot = (CategoryPlot)mChart.getPlot();
mPlot.setBackgroundPaint(Color.LIGHT_GRAY);
mPlot.setRangeGridlinePaint(Color.BLUE);//背景底部横虚线
mPlot.setOutlinePaint(Color.RED);//边界线
ChartFrame mChartFrame = new ChartFrame("折线图", mChart);
mChartFrame.pack();
mChartFrame.setVisible(true);
}
public static CategoryDataset GetDataset()
{
DefaultCategoryDataset mDataset = new DefaultCategoryDataset();
mDataset.addValue(1, "First", "2013");
mDataset.addValue(3, "First", "2014");
mDataset.addValue(2, "First", "2015");
mDataset.addValue(6, "First", "2016");
mDataset.addValue(5, "First", "2017");
mDataset.addValue(12, "First", "2018");
mDataset.addValue(14, "Second", "2013");
mDataset.addValue(13, "Second", "2014");
mDataset.addValue(12, "Second", "2015");
mDataset.addValue(9, "Second", "2016");
mDataset.addValue(5, "Second", "2017");
mDataset.addValue(7, "Second", "2018");
return mDataset;
}
}
运行结果如图所示: