java学习笔记
1 开始使用
1.1 将java路径加到path变量
set path = (/tools/ctools/java/jdk1.8.0_131/bin $path)
1.2 编写HelloWorld程序
file HelloWorld.java
import java.util.* ;
public class HelloWorld { //注意, 这是个public class, 它所在的文件名必须是HelloWorld.java.
public static void main(String[] args){
System.out.println("HelloWorld.");
}
}
1.3 编译和运行
$ javac HelloWorld.java ;# 编译
$ java HelloWorld ;# 运行
HelloWorld.
1.4 多个文件的编译与运行:
程序文件结构和程序内容
scr
|---smsg
| \--Smsg.java
| > package smsg; //注意这个地方, import本class时会用到
| > public class Smsg{ ... }
|
|---sms_proc
| |--SmsProc.java
| | > package sms_proc;
| | > import sms_proc.SmsProcReg; //通package name导入其它模块
| | > public class SmsProc{ ... }
| |
| \--SmsProcReg.java
| > package sms_proc;
| > public class SmsProcReg{ ... }
|
|---sms_wrap
| |--SmsWrap.java
| | > package sms_wrap;
| | > import sms_wrap.SmsWrapReg; //通package name导入其它模块
| | > public class SmsWrap{ ... }
| |
| \--SmsWrapReg.java
| > package sms_wrap;
| > public class SmsWrapReg{ ... }
|
\---top
\--Top.java
> package top;
> import smsg.Smsg; //通package name导入其它模块
> import sms_proc.SmsProc; //通package name导入其它模块
> import sms_wrap.SmsWrap; //通package name导入其它模块
> public class Top{
> public static main(String[] args){ ... }
> }
编译
# -d ../bin, 将编译后的class files放到目录../bin/目录.
# ../scr/*/*.java, 待编译的java程序文件.
javac -d ../bin ../scr/*/*.java
编译后文件的目录结构为:
bin
|---smsg
| \---Smsg.class
|---sms_proc
| |--SmsProc.class
| \--SmsProcReg.class
|---sms_wrap
| |--SmsWrap.class
| \--SmsWrapReg.class
\---top
\--Top.class
运行:
# -cp ../bin, 设置class search path(class path, 简称cp). <class search path of directories and zip/jar files>
java -cp ../bin top/Top | tee ../log/run.log
2 控制执行流程
2.1 if - else if - else
public class ex {
public static void main(String[] args) {
int x = 78;
if (x>=90){
System.out.println("A");
} else if(x>=60){
System.out.println("B");
} else {
System.out.println("C");
}
}
}
2.2 switch-case
public class ex {
public static void main(String[] args) {
int opt = 2;
switch(opt){
case 1:
System.out.println("select 1");
break; //注意需要有break语句, 不然会把switch中后续语句都执行了.
case 2:
System.out.println("select 2");
break;
case 3:
System.out.println("select 3");
break;
default:
System.out.println("select none");
break;
}
}
}
switch语句选项还可以是字符串.
2.3 while
public class Main {
public static void main(String[] args) {
int sum = 0; // 累加的和,初始化为0
int n = 1;
while (n <= 100) { // 循环条件是n <= 100
sum = sum + n; // 把n累加到sum中
n ++; // n自身加1
}
System.out.println(sum); // 5050
}
}
2.4 for
public class Main {
public static void main(String[] args) {
int sum = 0;
for (int i=1; i<=100; i++) {
sum = sum + i;
}
System.out.println(sum);
}
}
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 4, 9, 16, 25 };
for (int i=0; i<ns.length; i++) {
System.out.println(ns[i]);
i = i + 1;
}
}
}
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 4, 9, 16, 25 };
for (int n : ns) { //类似于foreach
System.out.println(n);
}
}
}
2.5 break和continue
break : 跳出当前循环, 也就是整个循环都不会执行了.
continue: 提前结束本次循环, 直接继续执行下次循环.
3. 数组
3.1 遍历
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 4, 9, 16, 25 };
for (int i=0; i<ns.length; i++) {
int n = ns[i];
System.out.println(n);
}
}
}
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 4, 9, 16, 25 };
for (int n : ns) {
System.out.println(n);
}
}
}
3.2 打印数组
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 4, 9, 16, 25 };
System.out.println(ns); // [I@15bd9742, JVM中的引用地址
System.out.println(Arrays.toString(ns)); // [1, 4, 9, 16, 25]
}
}
3.3 排序
Arrays.sort(ns), 正序排序, 会修改数组本身
好像没有逆序的方法.
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] ns = { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 };
Arrays.sort(ns);
System.out.println(Arrays.toString(ns));
}
}
3.4 二维数组/多维数组
二维数组
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][] ns = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11 } //可以不等长
};
System.out.println(ns.length); // 3
int[] arr0 = ns[0];
System.out.println(arr0.length); // 4
System.out.println(Arrays.toString(arr0)); // [1, 2, 3, 4]
System.out.println(Arrays.toString(ns)); // [[I@xxxx, [I@xxxx, [I@xxxx]
System.out.println(Arrays.deepToString(ns)); // [[1, 2, 3, 4], [5,6,7,8], [9,10,11]]
}
}
三维数组
int[][][] ns = {
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
},
{
{10, 11},
{12, 13}
},
{
{14, 15, 16},
{17, 18}
}
};
3.5 main函数的参数是一个数组
public class Main {
public static void main(String[] args) {
for (String arg : args) {
//if ("-version".equals(arg)) {
if (arg.equals("-version")) {
System.out.println("v 1.0");
break;
}
}
}
}
运行
$ javac Main.java
$ java Main -version
v 1.0
4 集合 collection
4.1 简介
标准库java.util包提供了三种类型的集合:
list: 有序列表集合.
set : 无重复元素的集合.
map : key-value映射表集合.
以下集合类是遗留类, 最好不使用:
Hashtable:
vector
stack
以下接口是遗留接口, 最好不使用:
Enumeration
4.2 list
list与数组类型, 不过对数组添加/删除元素时, 会非常不方便.
使用最多的是ArrayList.
List
接口方法 | 作用 |
---|---|
booleen add (E e) | 在末尾添加一个元素 |
booleen add (int index, E e) | 在指定索引添加一个元素 |
booleen addAll(Collection c) | 添加给定集合的所有元素 |
booleen addAll(int index, Collection c) | 在指定索引添加给定集合的所有元素 |
E remove(int index) | 删除指定索引的元素 |
boolean remove(Object e) | 删除某个元素 |
E get(int index) | 获取指定索引的元素 |
int size() | 获取链表大小(元素的个数) |
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.Iterator;
public class ex {
public static main(String[] args){
List<String> l0 = new ArrayList<>();
l0.add("apple");
l0.add(null) ; //允许添加空值null
l0.add("pear") ;
l0.add("apple");
//在list初始化时赋初值
List<String> l1 = new ArrayList<String>(){ //这个大括号相当于new接口
{ //这个大括号是构造代码块, 会在构造函数前调用
System.out.println("在构造代码块中");
this.add("element0"); //第〇个元素, this 可以省略.
add("element1"); //第一个元素.
}
};
System.out.println(l0.size()); //4
String second = l0.get(1); //获取元素
System.out.println(second); //null
for(int i=0; i<l0.size(); i++){//使用idx遍历
String s = l0.get(i);
System.out.println(s);
}
for(Iterator<String> it=l0.iterator(); it.hasNext()){//使用it遍历
String s = it.next();
System.out.println(s);
}
for(String s: l0){//使用for each遍历
System.out.println(s);
}
}
}
4.3 Map
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Student s0 = new Student("Xiao Ming", 99);
Student s1 = new Student("Xiao Hone", 88);
Map<String, Student> m0 = new HashMap<>();
Map<String, Student> m1 = new HashMap<>();
m0.put(s0.name, s0); // 将"Xiao Ming"和Student实例映射并关联
m0.put(s1.name, s1);
m1.putAll(m0); //向map中添加另一个map的所有元素
Student target = m0.get("Xiao Ming"); // 通过key查找并返回映射的Student实例
System.out.println(target.name); // "Xiao Ming"
System.out.println(target.score); // 99
System.out.println(target == s0); // true,同一个实例
Student another = m0.get("Bob"); // 查找另一个key
System.out.println(another); // 未找到返回null
System.out.println(m0.containsKey("Bob)); // 判断是否存在key
for(String k: m0.keySet()){ //使用for each遍历
Student v = m0.get(k);
System.out.println(k + " => " + v.score);
}
for(Map.Entry<String, Student> en: m0.entrySet()){ //使用entry遍历
String k = en.getKey();
Student v = en.getValue();
System.out.println(k + " => " + v.score);
}
}
}
class Student {
public String name;
public int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
}
5. 读写文件
5.1 读取文件
import java.util.ArrayList ;
import java.util.List ;
import java.io.File ;
import java.io.InputStream ;
import java.io.Reader ;
import java.io.BufferedReader ;
import java.io.InputStreamReader;
import java.io.FileInputStream ;
import java.io.FileNotFoundException ;
import java.io.IOException ;
public class EX {
public static List<String> list_lines = new ArrayList<>();
public static void main(String[] args){
list_lines.addAll(readFileByLine("filename.txtx"));
}
public static List<String> readFileByLine(String filename){
List<String> _lines = new ArrayList<>();
File file = new File(filename);
InputStream is = null;
Reader rd = null;
BufferedReader bufrd = null;
try {
//必须要try, 如果不用try包起来, 会报告:
//"unreported exception EXCEP_NAME; must be caught or declared to be thrown."
is = new FileInputStream(file);
rd = new InputStreamReader(is);
bufrd = new BufferedReader(rd);
String _line = null;
while((_line=bufrd.readLine()) != null){
_lines.add(_line);
}
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} finally {
try {
if(bufrd != null) { bufrd.close(); }
if(rd != null) { rd.close() ; }
if(is != null) { is.close() ; }
} catch (IOException e){
e.printStackTrace();
}
}
return _lines;
}
}
5.2 写文件
public class EX {
public static List<String> list_lines = new ArrayList<>();
public static void main(String[] args){
list_lines.add("1. abc");
list_lines.add("2. defg");
writeFileByFileWriter("out.txt");
}
public static void writeFileByFileWriter(String filename){
File file = new File(filename);
FileWriter fw = null;
try {
if(!file.exists()){
file.createNewFile();
}
fw = new FileWriter(file);
for(String line: list_lines){
fw.write(line + "\n");
}
} catch (IOException e){
e.printStackTrace();
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e){
e.printStackTree();
}
}
}
}
}
6 正则表达式
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
public class EX{
public static void main(String [] args){
String s0 = "1. abc defg";
Pattern p = Pattern.compile("^\\s*(\\d+)\\s*\\.\\s*(\\w+)");
Matcher m = p.matcher(s0);
if (m.find()){
String s1 = m.group(1);
String s2 = m.group(2);
System.out.println(s1 + " -> " + s2); // 1 -> abc
}
}
}
7 琐碎操作
7.1 字符串操作
int msb = Integer.valueOf("123").intValue(); #string转int
String sig = " A B C ".replaceAll("\\s+", ""); #替换掉str中的所有空格.
String s0 = "abcdEFG";
System.out.println(s0.length()) ; //7 , 获取字符串长度
System.out.println(s0.toUpperCase()); //ABCDEFG, 小写转为大写, 返回修改后的str, 不修改原str.
System.out.println(s0.toLowerCase()); //abcdefg, 大写转为小写, 返回修改后的str, 不修改原str.
7.2 文件判断
String filename = "../rpt/a.tcl";
File file = new File(filename);
file.exists() ; // true , 文件是否存在
file.isDirectory() ; // false, 是否为目录
file.getName() ; // a.tcl, 返回文件名称, 如果filename带路径, getName()不包含路径
file.length() ; // 3965 , 返回文件长度
file.lastModified() ; // 1674873213000, 返回文件最后修改时间戳
file.getAbsolutePath() ; // /a/b/c/../rpt/a.tcl, 返回文件绝对路径, 但没有解析掉"../"
file.getParent() ; // ../rpt, 返回filename所在的目录名, String类型
file.getParentFile() ; // 返回filename所在的目录, File类型
file.delete() ; // 删除文件或目录, 如果目录不为空, 则删除不成功, 需要先删除目录中所有文件才可以
7.3 列出当前path下的文件
涉及两个函数: File.listFiles()和File.list().
区别是: File.listFiles()返回的是File对象, File.list()返回的是文件名.
以File.listFiles()为例说明:
如果File对象是一个路径, 则函数返回一个File数组;
如果File对象是一个文件, 则函数返回null值;
public File[] listFiles();
public File[] listFiles(FilenameFilter f);
public File[] listFiles(FileFilter f);
例1: listFiles()
import java.io.File ;
public class Test{
public static void main(String[] args){
File f = new File("/path/a/");
File[] files = f.listFiles(); //不给参数, 返回所有文件
for (int i=0; i<files.length; i++){
System.out.format("%d : %s", i, files[i].getName());
}
}
}
例2: listFiles(FilenameFilter f)
import java.io.File ;
import java.io.FilenameFilter;
public class Test{
public static void main(String[] args){
//创建一个filenamefilter
FilenameFilter filter = new FilenameFilter(){
public boolean accept(File f, String name){
return name.startsWith("12"); //只返回以12开头的文件.
}
}; //注意这里要有分号
File f = new File("/path/a/");
File[] files = f.listFiles(filter); //给参数FilenameFilter
for (int i=0; i<files.length; i++){
System.out.format("%d : %s", i, files[i].getName());
}
}
}
例3: listFiles(FileFilter f)
import java.io.File ;
import java.io.FileFilter ;
public class Test{
public static void main(String[] args){
//创建一个filefilter
FileFilter filter = new FileFilter(){
public boolean accept(File f){
return f.getName().endsWith("txt"); //只返回以txt结尾的文件.
}
};
File f = new File("/path/a/");
File[] files = f.listFiles(filter); //给参数FileFilter
for (int i=0; i<files.length; i++){
System.out.format("%d : %s", i, files[i].getName());
}
}
}
7.4 列出path及子path下的所有文件
File.walk() 当前版本不支持, 还没试
7.5 进制转换
String s = "20";
int i = Integer.valueOf(s).intValue(); // 20 字符串转整数
String b = Integer.toBinaryString(i); // 10100 整数转二进制
String h = Integer.toHexString(i); // 14 整数转十六进制
int w = 8;
String bw= String.format("%"+w+"s", b).replace(" ", "0");
// 00010100,
// 1) 通过变量指定宽度(通过拼接format实现)
// 2) 不足位数填充0(通过替换实现)
7.6 取整
int i = 9;
int j = (int)Math.ceil((double)i/4); //向上取整
7.7 乘方
int i = (int)Math.pow(2, 3); //8, 2^3, 默认返回double类型, 如果需要整数, 需要转换
https://geek-docs.com/java/java-tutorial/dom.html
7.8 读取xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- note -->
<tiles>
<tile name="t0" tile_dir="/a/b/c">
<ports>
<port name="p0"></port>
<port name="p1"></port>
<port name="p2"></port>
</ports>
</tile>
<tile name="t1" tile_dir="/a/b/c">
<ports>
</ports>
</tile>
<tile name="t2" tile_dir="/a/b/c">
<ports>
</ports>
</tile>
</tiles>
处理xml文件
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class A{
public static main(String[] args){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try{
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("../data/xx.xml");
//取Element tiles,
//注意, getElementsByTagName()返回的是list, 需要通过item(0)取出该节点.
Element ele_tiles = (Element)doc.getElementsByTagName("tiles").item(0);
//取出各个tile
NodeList node_list_tiles = ele_tiles.getElementsByTagName("tile");
//循环处理每个tile
for(int idx_tile=0; idx_tile<node_list_tiles.getLength(); idx_tile++){
//取第idx_tile个tile:
Element ele_one_tile = (Element)node_list_tiles.item(idx_tile);
//取属性
String tile_name = ele_one_tile.getAttribute("name");
String tile_dir = ele_one_tile.getAttribute("dir");
//取ports
List<String> list_ports = new ArrayList<>();
Element ele_ports = (Element)ele_one_tile.getElementsByTagName("ports").item(0);
NodeList node_list_port = ele_ports.getElementsByTagName("port");
for(int idx_port=0; idx_port<node_list_port.getLength(); idx_port++){
Element ele_one_port = (Element)node_list_port.item(idx_port);
String port_name = ele_one_port.getAttribute("name");
}
}
} catch (Exception e){
e.printStackTrace();
}
}
}