String
构造
// String 类有 11 种构造方法
// 用构造函数创建字符串:
String str =new String("Runoob");
// 使用关键字:
String str2 = "Runoob";
// 使用字符数组:
char[] helloArray = { 'r', 'u', 'n', 'o', 'o', 'b'};
String helloString = new String(helloArray); // runoob
// 。。。。。。
String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上:
String s1 = "Runoob"; // String 直接创建
String s2 = "Runoob"; // String 直接创建
String s3 = s1; // 相同引用
String s4 = new String("Runoob"); // String 对象创建
String s5 = new String("Runoob"); // String 对象创建
![https://www.runoob.com/wp-content/uploads/2013/12/java-string-1-2020-12-01.png](https://www.runoob.com/wp-content/uploads/2013/12/java-string-1-2020-12-01.png)
注意:String 类是不可改变的
,所以你一旦创建了 String 对象,那它的值就无法改变了。
如果需要对字符串做很多修改,应该选择使用 StringBuffer & StringBuilder 类。
字符串长度
String 类的一个访问器方法是 length()
方法,它返回字符串对象包含的字符数。
String site = "runoob";
int len = site.length();
// len = 6
连接字符串
string1.concat(string2);
"Hello," + " runoob" + "!"
创建格式化字符串
我们知道输出格式化数字可以使用 printf() 和 format() 方法。
String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象。
String 类的静态方法 format() 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。
System.out.printf("浮点型变量的值为 " + "%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + "is %s", floatVar, intVar, stringVar);
// 或
String fs;
fs = String.format("浮点型变量的值为 " + "%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + " %s", floatVar, intVar, stringVar);
String 方法
参考文档:https://www.runoob.com/manual/jdk11api/java.base/java/lang/String.html
StringBuffer 和 StringBuilder
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
![https://www.runoob.com/wp-content/uploads/2013/12/java-string-20201208.png](https://www.runoob.com/wp-content/uploads/2013/12/java-string-20201208.png)
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder
StringBuilder 类在 Java 5 中被提出,StringBuilder 的方法不是线程安全的。
由于 StringBuilder 相较于 StringBuffer 有速度优势。
所以多数情况下建议使用 StringBuilder 类。
StringBuilder 常用方法:https://www.runoob.com/manual/jdk11api/java.base/java/lang/StringBuilder.html
StringBuilder sb = new StringBuilder(10);
sb.append("Runoob..");
System.out.println(sb); // Runoob..
sb.append("!");
System.out.println(sb); // Runoob..!
sb.insert(8, "Java");
System.out.println(sb); // Runoob..Java!
sb.delete(5,8);
System.out.println(sb); // RunooJava!
StringBuffer
然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
StringBuffer sBuffer = new StringBuffer("www");
sBuffer.append(".runoob");
sBuffer.append(".com");
System.out.println(sBuffer); // www.runoob.com
StringBuffer 常用方法:
方法 | 描述 |
---|---|
public StringBuffer append(String s) | 将指定的字符串追加到此字符序列。 |
public StringBuffer reverse() | 将此字符序列用其反转形式取代。 |
public delete(int start, int end) | 移除此序列的子字符串中的字符。 |
public insert(int offset, int i) | 将 int 参数的字符串表示形式插入此序列中。 |
insert(int offset, String str) | 将 str 参数的字符串插入此序列中。 |
replace(int start, int end, String str) | 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
StringBuffer 其他方法:https://www.runoob.com/manual/jdk11api/java.base/java/lang/StringBuffer.html
日期时间
java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。
// 使用当前日期和时间来初始化对象
Date( )
// 接收一个参数,该参数是从 1970 年 1 月 1 日起的毫秒数
Date(long millisec)
Date 对象创建以后,可以调用下面的方法:
方法 | 描述 |
---|---|
boolean after(Date date) | 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。同样的还有方法 before(Date) |
long getTime( ) | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 |
boolean equals(Object date) | 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。 |
void setTime(long time) | 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。 |
String toString( ) | String: dow mon dd hh:mm:ss zzz yyyy [dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)] |
获取当前日期时间
Date date = new Date(); // 初始化 Date 对象
System.out.println(date.toString()); // Mon May 04 09:51:52 CDT 2013
日期比较
Java使用以下三种方法来比较两个日期:
- 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
- 使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
- 使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。
SimpleDateFormat 格式化日期
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
System.out.println(ft.format(dNow)); // 2018-09-06 10:16:34
SimpleDateFormat ft2 = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
System.out.println(ft2.format(dNow)); // Wed 2016.11.09 at 08:23:19 AM UTC
printf格式化日期
printf 方法可以很轻松地格式化时间和日期。使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾。
Date date = new Date(); // 初始化 Date 对象
// c 的使用
System.out.printf("全部日期和时间信息:%tc%n",date); // 全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012
// F 的使用
System.out.printf("年-月-日格式:%tF%n",date); // 年-月-日格式:2012-09-10
// D 的使用
System.out.printf("月/日/年格式:%tD%n",date); // 月/日/年格式:09/10/12
// r 的使用
System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date); // HH:MM:SS PM格式(12时制):10:43:36 上午
// T 的使用
System.out.printf("HH:MM:SS格式(24时制):%tT%n",date); // HH:MM:SS格式(24时制):10:43:36
// R 的使用
System.out.printf("HH:MM格式(24时制):%tR",date); // HH:MM格式(24时制):10:43
流(Stream)、文件(File)和IO
![https://www.runoob.com/wp-content/uploads/2013/12/iostream2xx.png](https://www.runoob.com/wp-content/uploads/2013/12/iostream2xx.png)
FileInputStream
File f = new File("C:/java/hello");
InputStream in = new FileInputStream(f);
创建的 InputStream对象,常见方法:
方法 | 描述 |
---|---|
public void close() throws IOException{} | 关闭此文件输入流并释放与此流有关的所有系统资源。 |
protected void finalize()throws IOException {} | 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。 |
public int read(int r)throws IOException{} | ** public int read(int r)throws IOException{}** 这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。 |
public int read(byte[] r) throws IOException{} | 这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。 |
public int available() throws IOException{} | 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。 |
FileOutputStream
该类用来创建一个文件并向文件中写数据。如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建 FileOutputStream 对象:
// 使用字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("C:/java/hello")
// 使用一个文件对象来创建一个输出流来写文件:
File f = new File("C:/java/hello");
OutputStream fOut = new FileOutputStream(f);
创建的 OutputStream 对象常用方法:
方法 | 描述 |
---|---|
public void close() throws IOException{} | 关闭此文件输入流并释放与此流有关的所有系统资源。 |
protected void finalize()throws IOException {} | 清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。 |
public void write(int w)throws IOException{} | 把指定的字节写到输出流中。 |
public void write(byte[] w) | 把指定数组中w.length长度的字节写到OutputStream中。 |
下面是一个演示 InputStream 和 OutputStream 用法的例子:
try {
byte bWrite[] = { 11, 21, 3, 40, 5 };
OutputStream os = new FileOutputStream("test.txt");
for (int x = 0; x < bWrite.length; x++) {
os.write(bWrite[x]); // writes the bytes
}
os.close();
InputStream is = new FileInputStream("test.txt");
for (int i = 0; i < is.available(); i++) {
System.out.print((char) is.read() + " ");
}
is.close();
} catch (IOException e) {
System.out.print("Exception");
}
文件和I/O
创建目录:
File类中有两个方法可以用来创建文件夹:
mkdir( )
方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。mkdirs()
方法创建一个文件夹和它的所有父文件夹。
如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory()
方法会返回 true。
通过调用该对象上的 list()
方法,来提取它包含的文件和文件夹的列表。
删除目录或文件
删除文件可以使用 java.io.File.delete() 方法。当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。
测试目录结构:
/tmp/java/
|-- 1.log
|-- test
public static void main(String[] args) {
// 这里修改为自己的测试目录
File folder = new File("/tmp/java/");
deleteFolder(folder);
}
// 删除文件及目录
public static void deleteFolder(File folder) {
File[] files = folder.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
deleteFolder(f);
} else {
f.delete();
}
}
}
folder.delete();
}
集合框架
https://www.runoob.com/java/java-collections.html
…更新中