
本例使用 mysql 数据库,演示将数据库 test 的 tb_users 表中的用户信息存储到 List 中
代码如下:
import java.sql.Connectionimport java.sql.DriverManager
import java.sql.ResultSet
import java.sql.SQLException
import java.sql.Statement
import java.util.ArrayList
import java.util.List
// 用户类,存储单个用户信息
class User {
private int id
private String name
public User(int id, String name) {
this.id = id
this.name = name
}
public int getId() {
return id
}
public void setId(int id) {
this.id = id
}
public String getName() {
return name
}
public void setName(String name) {
this.name = name
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]"
}
}
public class Demo1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 本例使用 mysql 数据库,演示将数据库 test 的 tb_users 表中的用户信息
// 放到 List 中
// 加载数据驱动
Class.forName("com.mysql.jdbc.Driver")
// 数据库连接字符串, 此例数据库为 test
String url = "jdbc:mysql://localhost:3306/test"
String user = "root" // 数据库用户名
String password = "" // 数据库密码
// 打开一个数据连接
Connection conn = DriverManager.getConnection(url, user, password)
Statement stmt = conn.createStatement()
// 获取表 tb_users 所有用户信息到结果集中
ResultSet rs = stmt.executeQuery("SELECT id, name FROM tb_users")
// 定义一个存放用户信息的 List
List<User> users = new ArrayList<>()
// 提取用户信息,并将用户信息放入 List
while (rs.next()) {
// 获取用户ID
int id = rs.getInt(1)
// 获取用户名
String name = rs.getString(2)
users.add(new User(id, name))
}
rs.close()
stmt.close()
conn.close()
// 显示用户信息
for (User u : users) {
System.out.println(u)
}
}
}
Java的集合类都位于java.util包中,Java集合中存放的是对象的引用,而非对象本身。\x0d\x0a\x0d\x0aJava集合主要分为三种类型:\x0d\x0aa.Set(集):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象按特定方式排序。\x0d\x0ab.List(列表):集合中的对象按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象。\x0d\x0ac.Map(映射):集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。它的有些实现类能对集合中的键对象进行排序。\x0d\x0a\x0d\x0aSet、List和Map统称为Java集合。\x0d\x0a\x0d\x0a1.Set(集)\x0d\x0aSet集合中的对象不按特定方式排序,并且没有重复对象。Set接口主要有两个实现类HashSet和TreeSet。HashSet类按照哈希算法来存取集合中的对象,存取速度比较快。HashSet类还有一个子类LinkedHashSet类,它不仅实现了哈希算法,而且实现了链表数据结构。TreeSet类实现了SortedSet接口,具有排序功能。\x0d\x0a\x0d\x0aSet的add()方法判断对象是否已经存在于集合中的判断流程:\x0d\x0aboolean isExists = false\x0d\x0aIterator it = set.iterator()\x0d\x0awhile(it.hasNext()){\x0d\x0a Object object = it.next()\x0d\x0a if(newObject.equals(oldObject)){\x0d\x0a isExists = true\x0d\x0a break\x0d\x0a }\x0d\x0a}\x0d\x0a\x0d\x0a2.HashSet类\x0d\x0a当HashSet向集合中加入一个对象时,会调用对象的hashCode()方法获得哈希码,然后根据这个哈希码进一步计算出对象在集合中的存放位置。\x0d\x0a\x0d\x0a当Object1变量和object2变量实际上引用了同一个对象,那么object1和object2的哈希码肯定相同。\x0d\x0a\x0d\x0a为了保证HashSet能正常工作,要求当两个对象用equals()方法比较的结果为相等时,它们的哈希码也相等。即:\x0d\x0acustomer1.hashCode() == customer2.hashCode()\x0d\x0a\x0d\x0a如:对应于Customer类的以下重写后的equals()方法:\x0d\x0a\x0d\x0apublic boolean equals(Object o){\x0d\x0a if(this==o) return true\x0d\x0a if(!o instanceof Customer) return false\x0d\x0a final Customer other = (Customer)o\x0d\x0a if(this.name.equals(other.getName())&&this.age==other.getAge())\x0d\x0a return true\x0d\x0a else \x0d\x0a return false\x0d\x0a}\x0d\x0a\x0d\x0a为了保证HashSet正常工作,如果Customer类覆盖了equals()方法,也应该覆盖hashCode()方法,并且保证两个相等的Customer对象的哈希码也一样。\x0d\x0a\x0d\x0apublic int hashCode(){\x0d\x0a int result\x0d\x0a result = (name==null?0:name.hashCode())\x0d\x0a result = 29*result+(age==null?0:age.hashCode())\x0d\x0a return result\x0d\x0a}\x0d\x0a\x0d\x0a3.TreeSet类\x0d\x0a\x0d\x0aTreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。TreeSet支持两种排序方式:自然排序和客户化排序,在默认情况下TreeSet采用自然排序方式。\x0d\x0a\x0d\x0aa.自然排序\x0d\x0a在JDK中,有一部分类实现了Comparable接口,如Integer、Double和String等。Comparable接口有一个compareTo(Object o)方法,它返回整数类型。对于表达式x.compareTo(y),如果返回值为0,表示x和y相等,如果返回值大于0,表示x大于y,如果返回值小于0,表示x小于y。\x0d\x0a\x0d\x0aTreeSet调用对象的compareTo()方法比较集合中对象的大小,然后进行升序排列,这种排序方式称为自然排序。\x0d\x0a\x0d\x0a以下列出了JDK中实现了Comparable接口的一些类的排序方式\x0d\x0a类 排序\x0d\x0aBigDecimal\BigInteger\Byte\Double\Float\Integer\Long\Short 按数字大小排序\x0d\x0aCharacter按字符的Unicode值的数字大小排序\x0d\x0aString 按字符串中字符的Unicode值排序\x0d\x0a\x0d\x0a使用自然排序时,只能向TreeSet集合中加入同类型的对象,并且这些对象的类必须实现了Comparable接口,否则会在第二次调用TreeSet的add()方法时,会抛出ClassCastException异常。\x0d\x0a\x0d\x0a例如:\x0d\x0a以下是Customer类的compareTo()方法的一种实现方式:\x0d\x0apublic int compareTo(Object o){\x0d\x0a Customer other = (Customer)o\x0d\x0a \x0d\x0a //先按照name属性排序\x0d\x0a if(this.name.compareTo(other.getName())>0) return 1\x0d\x0a if(this.name.compareTo(other.getName())other.getAge()) return 1\x0d\x0a if(this.age0) return -1\x0d\x0a if(c2.getName().compareTo(c2.getName()) 回答于 2022-12-11要从一个List中取值,可以使用get()方法来获取指定索引位置的元素。在你提供的代码中,generatePonits()方法返回的是一个String类型的List,包含多个由随机生成的坐标组成的字符串。如果你想要在另一个方法中分别提取出两个随机数,可以先通过get()方法获取对应索引位置的坐标字符串,然后再将其解析为数字。具体步骤如下:
```java
// 获取generatePonits()方法随机生成的第一个坐标字符串,并将其解析为数字
String point1Str = generatePonits().get(0)
int x1 = Integer.parseInt(point1Str.substring(1, point1Str.indexOf(",")))
int y1 = Integer.parseInt(point1Str.substring(point1Str.indexOf(",") + 1, point1Str.length() - 1))
// 获取generatePonits()方法随机生成的第二个坐标字符串,并将其解析为数字
String point2Str = generatePonits().get(1)
int x2 = Integer.parseInt(point2Str.substring(1, point2Str.indexOf(",")))
int y2 = Integer.parseInt(point2Str.substring(point2Str.indexOf(",") + 1, point2Str.length() - 1))
```
以上代码假设你想要获取generatePonits()方法随机生成的第一个和第二个坐标,并将它们包含的x和y坐标分别解析为整数。这里使用了String类的substring()方法来截取坐标字符串中的x和y坐标部分,并用Integer类的parseInt()方法将它们解析为整数。需要注意的是,由于坐标字符串的格式是"(x,y)",因此在使用substring()方法时需要去掉开头的"("和结尾的")"。
当然,如果你仅仅只是想在generatePonits()方法和另一个方法之间传递生成的随机数,也可以考虑将它们定义为类成员变量,而不是在generatePonits()方法内部声明。这样就可以在不同的方法之间共享这些随机数了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)