在Java中,List 接口是集合框架中非常重要的一个接口,它提供了存储和操作有序集合的方法。List 是一个接口,因此不能直接实例化,但可以通过其实现类(如 ArrayList, LinkedList, Vector 等)来使用。
List 接口的主要实现类
import java.util.ArrayList;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
// 创建一个空的 ArrayList
List names = new ArrayList<>();
// 或者创建一个带有初始容量的 ArrayList
List namesWithInitialCapacity = new ArrayList<>(10);
// 创建一个包含初始元素的 ArrayList
List initialNames = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie"));
}
}
names.add("David");
names.add(1, "Eve"); // 在索引 1 处插入 "Eve"
String firstElement = names.get(0); // 获取第一个元素 通过索引
names.remove("David"); // 移除值为 "David" 的元素
names.remove(0); // 移除索引为 0 的元素
// 使用 for-each 循环
for (String name : names) {
System.out.println(name);
}
// 使用传统的 for 循环
for (int i = 0; i < names.size(); i++) {
System.out.println(names.get(i));
}
// 使用 Java 8 的 Stream API
names.stream().forEach(System.out::println);
int index = names.indexOf("Charlie"); // 查找 "Charlie" 的索引位置
boolean contains = names.contains("Charlie"); // 判断是否包含 "Charlie"
names.set(0, "Alex"); // 将索引 0 处的元素替换为 "Alex"
Collections.sort(names); // 自然排序(对于 String,按字母顺序)
Collections.sort(names, Comparator.reverseOrder()); // 逆序排序
下面是一个完整的示例代码,演示了如何使用 ArrayList:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
List names = new ArrayList<>();
names.add("David");
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// 输出原始列表
System.out.println("Original list: " + names);
// 在索引 1 处插入 "Eve"
names.add(1, "Eve");
// 查找 "Charlie" 的索引位置
int index = names.indexOf("Charlie");
System.out.println("Index of Charlie: " + index);
// 判断是否包含 "Charlie"
boolean contains = names.contains("Charlie");
System.out.println("Contains Charlie: " + contains);
// 替换索引 0 处的元素
names.set(0, "Alex");
// 自然排序
Collections.sort(names);
System.out.println("Sorted list: " + names);
// 逆序排序
Collections.sort(names, Comparator.reverseOrder());
System.out.println("Reverse sorted list: " + names);
// 移除 "Alex"
names.remove("Alex");
// 遍历列表
System.out.println("Final list:");
for (String name : names) {
System.out.println(name);
}
}
}
总结
List 接口提供了丰富的操作方法,可以根据具体需求选择合适的实现类。ArrayList 适用于需要快速随机访问的场景,而 LinkedList 更适合需要频繁插入和删除元素的场景。通过上面的示例,你应该能够理解和使用 List 接口及其常见实现类。
在Java中,Map 接口是集合框架中的一个重要组成部分,用于存储键值对(key-value pairs)。Map 接口本身不能直接实例化,但可以通过其不同的实现类来使用。下面详细介绍几种常用的 Map 实现类及其基本操作。
主要的 Map 实现类
import java.util.HashMap;
import java.util.Map;
public class MapExample {
public static void main(String[] args) {
// 创建一个空的 HashMap
Map scores = new HashMap<>();
}
}
scores.put("David", 95);
scores.put("Eve", 88);
Integer score = scores.get("David"); // 获取 "David" 的分数
Integer scoreOrDefault = scores.getOrDefault("David", 0); // 如果不存在则返回默认值 0
scores.remove("David"); // 移除键为 "David" 的元素
scores.remove("David"); // 移除键为 "David" 的元素
boolean containsKey = scores.containsKey("David"); // 是否包含键 "David"
boolean containsValue = scores.containsValue(92); // 是否包含值 92
// 使用 for-each 循环遍历键
for (String key : scores.keySet()) {
System.out.println(key + ": " + scores.get(key));
}
// 使用 for-each 循环遍历键值对
for (Map.Entry entry : scores.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 使用 Java 8 的 Stream API
scores.forEach((key, value) -> System.out.println(key + ": " + value));
在实际开发中,value的值可能是任意类型,可以使用Object指定value的类型,因为 Object
是 Java 中所有类的超类。这意味着你可以将任何类型的对象放入 Map
中,只要它们可以隐式地转换为 Object
类型,这是 Java 类型系统的特性决定的
import java.util.HashMap;
import java.util.Map;
public class DataStorageExample {
public static void main(String[] args) {
Map data = new HashMap<>();
// 存储不同类型的数据
data.put("name", "Alice"); // String
data.put("age", 30); // Integer
data.put("isStudent", false); // Boolean
data.put("scores", new int[]{90, 85, 95}); // int[]
data.put("address", new Address("123 Elm St", "Springfield")); // 自定义对象
// 输出 Map 中的数据
for (Map.Entry entry : data.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
System.out.println("Key: " + key + ", Value: " + value);
}
}
}
// 定义一个简单的自定义类
static class Address {
String street;
String city;
public Address(String street, String city) {
this.street = street;
this.city = city;
}
@Override
public String toString() {
return street + ", " + city;
}
}
虽然 Map
类型安全性:由于所有值都是 Object 类型,因此在访问这些值时需要进行显式的类型转换。如果类型转换错误,会导致 ClassCastException。为了避免这种情况,最好在读取时进行类型检查或使用泛型方法。
类型检查:在读取 Map 中的值时,可以通过 instanceof 关键字进行类型检查:
for (String key: data.keySet()) {
Object value = data.get(key);
if (value instanceof Integer) {
System.out.printf("%s : %d \n", key, (Integer)value);
} else if (value instanceof String) {
System.out.printf("%s : %s \n", key, (String)value);
}
}
泛型方法:如果经常需要处理特定类型的值,可以考虑使用泛型方法来减少类型转换的工作量:
String name = getValue(data, "name", String.class);
Integer age = getValue(data, "age", Integer.class);
public static T getValue(Map map, String key, Class clazz) {
Object value = map.get(key);
if (value == null && clazz.isInstance(value)) {
return null;
}
return clazz.cast(value);
}
下面是一个完整的示例代码,演示了如何使用 HashMap:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapExample {
public static void main(String[] args) {
Map scores = new HashMap<>();
// 添加元素
scores.put("Alice", 100);
scores.put("Bob", 90);
scores.put("Charlie", 85);
// 输出原始 Map
System.out.println("Original map: " + scores);
// 更新元素
scores.put("Charlie", 90);
// 删除元素
scores.remove("Bob");
// 检查元素
boolean containsKey = scores.containsKey("Charlie");
System.out.println("Contains key 'Charlie': " + containsKey);
// 获取元素
Integer score = scores.get("Alice");
System.out.println("Score of Alice: " + score);
// 遍历 Map
System.out.println("Final map:");
for (Map.Entry entry : scores.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Map data = new HashMap<>();
// 存储不同类型的数据
data.put("name", "Alice"); // String
data.put("age", 30); // Integer
data.put("isStudent", false); // Boolean
data.put("scores", new int[]{90, 85, 95}); // int[]
data.put("address", new Address("123 Elm St", "Springfield")); // 自定义对象
// 输出 Map 中的数据
for (Map.Entry entry : data.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
System.out.println("Key: " + key + ", Value: " + value);
}
// 泛型取值
String name = getValue(data, "name", String.class);
Integer age = getValue(data, "age", Integer.class);
}
public static T getValue(Map map, String key, Class clazz) {
Object value = map.get(key);
if (value == null && clazz.isInstance(value)) {
return null;
}
return clazz.cast(value);
}
}
// 定义一个简单的自定义类
static class Address {
String street;
String city;
public Address(String street, String city) {
this.street = street;
this.city = city;
}
@Override
public String toString() {
return street + ", " + city;
}
}
总结
Map 接口提供了丰富的操作方法,可以根据具体需求选择合适的实现类。HashMap 适用于大多数场景,而 LinkedHashMap 和 TreeMap 分别用于保持插入顺序或进行排序。ConcurrentHashMap 适用于多线程环境,WeakHashMap 适用于缓存场景。通过上面的示例,你应该能够理解和使用 Map 接口及其常见实现类。
java基础之时间类型_java 时间格式-CSDN博客
// 获取当前时间
Date date = new Date();
System.out.println(date);
// 获取时间戳
System.out.println(date.getTime());
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// String -> Date
String s = "2024-09-12 00:00:00";
try {
Date d = formatter.parse(s);
System.out.println(d);
}catch (ParseException e){
e.printStackTrace();
}
// Date -> String
String ss = formatter.format(date);
System.out.println(ss);
如何在Java中进行配置文件的读写?_java 读写配置文件-CSDN博客
myconf.properties:
#Updated properties file
#Thu Sep 12 19:12:07 CST 2024
db.user=root
db.pass=123456
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class ConfigReader {
public static void testConf() {
Properties prop = new Properties();
try (FileInputStream fis = new FileInputStream("myconf.properties")) {
// 读取文件内容
prop.load(fis);
String user = prop.getProperty("db.user");
String pass = prop.getProperty("db.pass");
System.out.println(user);
System.out.println(pass);
prop.setProperty("db.host", "127.0.0.1");
prop.setProperty("db.port", "3306");
// 如果需要将修改后的属性保存回文件
try (FileOutputStream fos = new FileOutputStream("myconf.properties")) {
prop.store(fos, "Updated properties file");
}
} catch (IOException e) {
e.printStackTrace(); // 记录详细的异常信息
}
}
public static void main(String[] args) {
testConf();
}
}
public static void yamlConf() {
Yaml ym = new Yaml(); // 先安装 snakeyaml
Map map = new HashMap<>();
map.put("db.host", "127.0.0.1");
map.put("db.port", 3306);
map.put("db.user", "root");
map.put("db.pass", "123456");
// 写入yaml
try (Writer w = new FileWriter("myconf.yaml")) {
ym.dump(map, w);
}catch (IOException e) {
e.printStackTrace();
}
// 读取yaml
try (InputStream r = new FileInputStream("myconf.yaml")){
Map data = ym.load(r);
System.out.println(data);
String host = (String) data.get("db.host");
Integer port = (Integer) data.get("db.port");
System.out.println(host + ":" + port);
}catch (IOException e) {
e.printStackTrace();
}
}
JAVA之多线程_java多线程-CSDN博客
java与mysql连接 使用mysql-connector-java连接msql-CSDN博客
Linux系统上安装Maven的完整指南_linux 安装maven-CSDN博客
了解Maven,并配置国内源_maven 国内源-CSDN博客
使用 mysql-connector-java-8.0.30.jar 操作数据库CURD
import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
String host = "127.0.0.1";
String port = "3306";
String databaseName = "mydatabase";
String url = "jdbc:mysql://" + host + ":" + port + "/" + databaseName;
String user = "root";
String pass = "xxxxxx";
DataBaseCURD dataBaseCURD = new DataBaseCURD(url, user, pass);
Boolean isConn = dataBaseCURD.getConnection();
if (!isConn) {
System.out.println("Connection is null");
}else {
String tableSql = "CREATE TABLE IF NOT EXISTS users (" +
"id INT AUTO_INCREMENT PRIMARY KEY," +
"name VARCHAR(100)," +
"email VARCHAR(150))";
Boolean createRes = dataBaseCURD.createTable(tableSql);
String insertSql = "INSERT INTO users (name, email) VALUES (?, ?)";
Map map1 = new HashMap<>();
Map map2 = new HashMap<>();
map1.put("id", "1");
map1.put("name", "A");
map1.put("email", "[email protected]");
map2.put("id", "2");
map2.put("name", "B");
map2.put("email", "[email protected]");
List