你需要的是什么,直接评论留言。
分享是一种美德,分享更快乐!
1:登录注册案例(理解)
需求:用户登录注册案例。
按照如下的操作,可以让我们更符号面向对象思想
a:有哪些类呢?
b:每个类有哪些东西呢?
c:类与类之间的关系是什么呢?
分析:
用户类
测试类
用户类:
成员变量:用户名,密码
构造方法:无参构造
成员方法:getxxx()/setxxx()
登录,注册
假如用户类的内容比较对,将来维护起来就比较麻烦,为了更清晰的分类,我们就把用户又划分成了两类
用户基本描述类
用户操作类
登录,注册
测试类:
main方法。
在测试类中创建用户操作类和用户基本描述类的对象,并使用其功能。
分包:
a:功能划分
b:模块划分
c:先按模块划分,再按功能划分
今天我们选择按照功能划分:
用户基本描述类包 cn.itcast.pojo
实体类
用户操作接口 cn.itcast.dao
用户功能的接口
用户操作类包 cn.itcast.dao.impl 用户功能的接口的实现
今天是集合实现,过几天是io实现,再过几天是gui实现,就业班我们就是数据库实现
用户测试类 cn.itcast.test
测试类
package cn.itcast.pojo;(1)
/**
* 这是用户基本描述类
*
* @author 风清扬
* @version v1.0
*/
public class user {
// 用户名
private string username;
// 密码
private string password;
public user() {
}
public string getusername() {
return username;
public void setusername(string username) {
this.username = username;
public string getpassword() {
return password;
public void setpassword(string password) {
this.password = password;
package cn.itcast.dao;(2)
import cn.itcast.pojo.user;
* 这是针对用户进行操作的接口
public interface userdao {
* 这是用户登录功能
* @param username
* 用户名
* @param password
* 密码
* @return 返回登录是否成功
public abstract boolean islogin(string username, string password);
* 这是用户注册功能
* @param user
* 要注册的用户信息
public abstract void regist(user user);
package cn.itcast.dao.impl;(3)
import java.util.arraylist;
import cn.itcast.dao.userdao;
* 这是用户操作的具体实现类(集合版)
public class userdaoimpl implements userdao {
// 为了让多个方法能够使用同一个集合,就把集合定义为成员变量
// 为了不让外人看到,用private
// 为了让多个对象共享同一个成员变量,用static
private static arraylist<user> array = new arraylist<user>();
@override
public boolean islogin(string username, string password) {
// 遍历集合,获取每一个用户,并判断该用户的用户名和密码是否和传递过来的匹配
boolean flag = false;
for (user u : array) {
if (u.getusername().equals(username)
&& u.getpassword().equals(password)) {
flag = true;
break;
return flag;
public void regist(user user) {
// 把用户信息存储集合
// arraylist<user> array = new arraylist<user>();
array.add(user);
package cn.itcast.game;(4)
import java.util.scanner;
* 这是猜数字小游戏
public class guessnumber {
private guessnumber() {
public static void start() {
// 产生一个随机数
int number = (int) (math.random() * 100) + 1;
// 定义一个统计变量
int count = 0;
while (true) {
// 键盘录入一个数据
scanner sc = new scanner(system.in);
system.out.println("请输入数据(1-100):");
int guessnumber = sc.nextint();
count++;
// 判断
if (guessnumber > number) {
system.out.println("你猜的数据" + guessnumber + "大了");
} else if (guessnumber < number) {
system.out.println("你猜的数据" + guessnumber + "小了");
} else {
system.out.println("恭喜你," + count + "次就猜中了");
package cn.itcast.test;(5)
import cn.itcast.dao.impl.userdaoimpl;
import cn.itcast.game.guessnumber;
* 用户测试类
* 新增加了两个小问题 a:多个对象共享同一个成员变量,用静态
* b:循环里面如果有switch,并且在switch里面有break,那么结束的不是循环,而是switch语句
public class usertest {
public static void main(string[] args) {
// 为了能够回来
// 欢迎界面,给出选择项
system.out.println("--------------欢迎光临--------------");
system.out.println("1 登录");
system.out.println("2 注册");
system.out.println("3 退出");
system.out.println("请输入你的选择:");
// 键盘录入选择,根据选择做不同的操作
// 为了后面的录入信息的方便,我所有的数据录入全部用字符接收
string choicestring = sc.nextline();
// switch语句的多个地方要使用,我就定义到外面
userdao ud = new userdaoimpl();
// 经过简单的思考,我选择了switch
switch (choicestring) {
case "1":
// 登录界面,请输入用户名和密码
system.out.println("--------------登录界面--------------");
system.out.println("请输入用户名:");
string username = sc.nextline();
system.out.println("请输入密码:");
string password = sc.nextline();
// 调用登录功能
// userdao ud = new userdaomimpl();
boolean flag = ud.islogin(username, password);
if (flag) {
system.out.println("登录成功,可以开始玩游戏了");
system.out.println("你玩吗?y/n");
string resultstring = sc.nextline();
if (resultstring.equalsignorecase("y")) {
// 玩游戏
guessnumber.start();
system.out.println("你还玩吗?y/n");
system.out.println("谢谢使用,欢迎下次再来");
system.exit(0);
// break; //这里写break,结束的是switch
system.out.println("用户名或者密码有误,登录失败");
case "2":
// 欢迎界面,请输入用户名和密码
system.out.println("--------------注册界面--------------");
string newusername = sc.nextline();
string newpassword = sc.nextline();
// 把用户名和密码封装到一个对象中
user user = new user();
user.setusername(newusername);
user.setpassword(newpassword);
// 调用注册功能
// 多态
// userdao ud = new userdaoimpl();
// 具体类使用
// userdaoimpl udi = new userdaoimpl();
ud.regist(user);
system.out.println("注册成功");
case "3":
default:
扩展:
代码:
collection c = new arraylist();
c.add("hello");
c.add("world");
c.add("java");
system.out.println(c);
为什么c输出的不是地址值呢?
a:collection c = new arraylist();
这是多态,所以输出c的tostring()方法,其实是输出arraylist的tostring()
b:看arraylist的tostring()
而我们在arraylist里面却没有发现tostring()。
以后遇到这种情况,也不要担心,你认为有,它却没有,就应该去它父亲里面看看。
c:tostring()的方法源码
public string tostring() {
iterator<e> it = iterator(); //集合本身调用迭代器方法,得到集合迭代器
if (! it.hasnext())
return "[]";
stringbuilder sb = new stringbuilder();
sb.append('[');
for (;;) {
e e = it.next(); //e=hello,world,java
sb.append(e == this ? "(this collection)" : e);
if (! it.hasnext())
//[hello, world, java]
return sb.append(']').tostring();
sb.append(',').append(' ');
}
}
2:set集合(理解)
(1)set集合的特点
无序,唯一
package cn.itcast_01;
import java.util.hashset;
import java.util.set;
/*
* collection
|--list
有序(存储顺序和取出顺序一致),可重复
|--set
无序(存储顺序和取出顺序不一致),唯一
* hashset:它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
* 注意:虽然set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序,
* 而你的顺序恰好和它的存储顺序一致,这代表不了有序,你可以多存储一些数据,就能看到效果。
public class setdemo {
// 创建集合对象
set<string> set = new hashset<string>();
// 创建并添加元素
set.add("hello");
set.add("java");
set.add("world");
// 增强for
for (string s : set) {
system.out.println(s);
(2)hashset集合(掌握)
a:底层数据结构是哈希表(是一个元素为链表的数组)
b:哈希表底层依赖两个方法:hashcode()和equals()
执行顺序:
首先比较哈希值是否相同
相同:继续执行equals()方法
返回true:元素重复了,不添加
返回false:直接把元素添加到集合
不同:就直接把元素添加到集合
c:如何保证元素唯一性的呢?
由hashcode()和equals()保证的
d:开发的时候,代码非常的简单,自动生成即可。
e:hashset存储字符串并遍历
package cn.itcast_02;
* hashset:存储字符串并遍历
* 问题:为什么存储字符串的时候,字符串内容相同的只存储了一个呢?
* 通过查看add方法的源码,我们知道这个方法底层依赖 两个方法:hashcode()和equals()。
* 步骤:
首先比较哈希值
如果相同,继续走,比较地址值或者走equals()
如果不同,就直接添加到集合中
* 按照方法的步骤来说:
先看hashcode()值是否相同
相同:继续走equals()方法
返回true:
说明元素重复,就不添加
返回false:说明元素不重复,就添加到集合
* 如果类没有重写这两个方法,默认使用的object()。一般来说不同相同。
* 而string类重写了hashcode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。
public class hashsetdemo {
hashset<string> hs = new hashset<string>();
hs.add("hello");
hs.add("world");
hs.add("java");
// 遍历集合
for (string s : hs) {
f:hashset存储自定义对象并遍历(学生类)(对象的成员变量值相同即为同一个元素)
package cn.itcast_02;(1)
* @author administrator
public class student {
private string name;
private int age;
public student() {
super();
public student(string name, int age) {
this.name = name;
this.age = age;
public string getname() {
return name;
public void setname(string name) {
public int getage() {
return age;
public void setage(int age) {
public int hashcode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashcode());
return result;
public boolean equals(object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getclass() != obj.getclass())
student other = (student) obj;
if (age != other.age)
if (name == null) {
if (other.name != null)
} else if (!name.equals(other.name))
// @override
// public int hashcode() {
// // return 0;
// // 因为成员变量值影响了哈希值,所以我们把成员变量值相加即可
// // return this.name.hashcode() + this.age;
// // 看下面
// // s1:name.hashcode()=40,age=30
// // s2:name.hashcode()=20,age=50
// // 尽可能的区分,我们可以把它们乘以一些整数
// return this.name.hashcode() + this.age * 15;
// }
//
// public boolean equals(object obj) {
// // system.out.println(this + "---" + obj);
// if (this == obj) {
// return true;
// if (!(obj instanceof student)) {
// return false;
// student s = (student) obj;
// return this.name.equals(s.name) && this.age == s.age;
// public string tostring() {
// return "student [name=" + name + ", age=" + age + "]";
package cn.itcast_02;(2)
* 需求:存储自定义对象,并保证元素的唯一性
* 要求:如果两个对象的成员变量值都相同,则为同一个元素。
* 目前是不符合我的要求的:因为我们知道hashset底层依赖的是hashcode()和equals()方法。
* 而这两个方法我们在学生类中没有重写,所以,默认使用的是object类。
* 这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作。
public class hashsetdemo2 {
hashset<student> hs = new hashset<student>();
// 创建学生对象
student s1 = new student("林青霞", 27);
student s2 = new student("柳岩", 22);
student s3 = new student("王祖贤", 30);
student s4 = new student("林青霞", 27);
student s5 = new student("林青霞", 20);
student s6 = new student("范冰冰", 22);
// 添加元素
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
hs.add(s5);
hs.add(s6);
for (student s : hs) {
system.out.println(s.getname() + "---" + s.getage());
g:hashset集合存储自定义对象并遍历(狗类)。如果对象的成员变量值相同即为同一个对象
package cn.itcast_03;(1)
public class dog {
private string color;
private char sex;
public dog() {
public dog(string name, int age, string color, char sex) {
this.color = color;
this.sex = sex;
public string getcolor() {
return color;
public void setcolor(string color) {
public char getsex() {
return sex;
public void setsex(char sex) {
result = prime * result + ((color == null) ? 0 : color.hashcode());
result = prime * result + sex;
dog other = (dog) obj;
if (color == null) {
if (other.color != null)
} else if (!color.equals(other.color))
if (sex != other.sex)
package cn.itcast_03;(2)
* hashset集合存储自定义对象并遍历。如果对象的成员变量值相同即为同一个对象
* 注意了:
你使用的是hashset集合,这个集合的底层是哈希表结构。
而哈希表结构底层依赖:hashcode()和equals()方法。
如果你认为对象的成员变量值相同即为同一个对象的话,你就应该重写这两个方法。
如何重写呢?不同担心,自动生成即可。
public class dogdemo {
hashset<dog> hs = new hashset<dog>();
// 创建狗对象
dog d1 = new dog("秦桧", 25, "红色", '男');
dog d2 = new dog("高俅", 22, "黑色", '女');
dog d3 = new dog("秦桧", 25, "红色", '男');
dog d4 = new dog("秦桧", 20, "红色", '女');
dog d5 = new dog("魏忠贤", 28, "白色", '男');
dog d6 = new dog("李莲英", 23, "黄色", '女');
dog d7 = new dog("李莲英", 23, "黄色", '女');
dog d8 = new dog("李莲英", 23, "黄色", '男');
hs.add(d1);
hs.add(d2);
hs.add(d3);
hs.add(d4);
hs.add(d5);
hs.add(d6);
hs.add(d7);
hs.add(d8);
// 遍历
for (dog d : hs) {
system.out.println(d.getname() + "---" + d.getage() + "---"
+ d.getcolor() + "---" + d.getsex());
h:hashset集合的add()方法的源码
interface collection {
...
interface set extends collection {
class hashset implements set {
private static final object present = new object();
private transient hashmap<e,object> map;
public hashset() {
map = new hashmap<>();
public boolean add(e e) { //e=hello,world
return map.put(e, present)==null;
}
class hashmap implements map {
public v put(k key, v value) { //key=e=hello,world
//看哈希表是否为空,如果空,就开辟空间
if (table == empty_table) {
inflatetable(threshold);
}
//判断对象是否为null
if (key == null)
return putfornullkey(value);
int hash = hash(key); //和对象的hashcode()方法相关
//在哈希表中查找hash值
int i = indexfor(hash, table.length);
for (entry<k,v> e = table[i]; e != null; e = e.next) {
//这次的e其实是第一次的world
object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
v oldvalue = e.value;
e.value = value;
e.recordaccess(this);
return oldvalue;
//走这里其实是没有添加元素
}
modcount++;
addentry(hash, key, value, i); //把元素添加
return null;
transient int hashseed = 0;
final int hash(object k) { //k=key=e=hello,
int h = hashseed;
if (0 != h && k instanceof string) {
return sun.misc.hashing.stringhash32((string) k);
h ^= k.hashcode(); //这里调用的是对象的hashcode()方法
// this function ensures that hashcodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
(3)treeset集合
a:底层数据结构是红黑树(是一个自平衡的二叉树)
b:保证元素的排序方式
a:自然排序(元素具备比较性)
让元素所属的类实现comparable接口
package cn.itcast_05;
import java.util.treeset;
* treeset:能够对元素按照某种规则进行排序。
* 排序有两种方式
* a:自然排序
* b:比较器排序
* treeset集合的特点:排序和唯一
* 通过观察treeset的add()方法,我们知道最终要看treemap的put()方法。
public class treesetdemo {
// 自然顺序进行排序
treeset<integer> ts = new treeset<integer>();
// 创建元素并添加
// 20,18,23,22,17,24,19,18,24
ts.add(20);
ts.add(18);
ts.add(23);
ts.add(22);
ts.add(17);
ts.add(24);
ts.add(19);
for (integer i : ts) {
system.out.println(i);
b:比较器排序(集合具备比较性)
让集合构造方法接收comparator的实现类对象
package cn.itcast_07;
import java.util.comparator;
public class mycomparator implements comparator<student> {
public int compare(student s1, student s2) {
// int num = this.name.length() - s.name.length();
// this -- s1
// s -- s2
// 姓名长度
int num = s1.getname().length() - s2.getname().length();
// 姓名内容
int num2 = num == 0 ? s1.getname().compareto(s2.getname()) : num;
// 年龄
int num3 = num2 == 0 ? s1.getage() - s2.getage() : num2;
return num3;
c:把我们讲过的代码看一遍即可
d:treeset的add()方法的源码解析
interface collection {...}
interface set extends collection {...}
interface navigablemap {
class treemap implements navigablemap {
public v put(k key, v value) {
entry<k,v> t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new entry<>(key, value, null);
size = 1;
modcount++;
return null;
int cmp;
entry<k,v> parent;
// split comparator and comparable paths
comparator<? super k> cpr = comparator;
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setvalue(value);
} while (t != null);
else {
if (key == null)
throw new nullpointerexception();
comparable<? super k> k = (comparable<? super k>) key;
cmp = k.compareto(t.key);
entry<k,v> e = new entry<>(key, value, parent);
if (cmp < 0)
parent.left = e;
else
parent.right = e;
fixafterinsertion(e);
size++;
class treeset implements set {
private transient navigablemap<e,object> m;
public treeset() {
this(new treemap<e,object>());
public boolean add(e e) {
return m.put(e, present)==null;
真正的比较是依赖于元素的compareto()方法,而这个方法是定义在 comparable里面的。
所以,你要想重写该方法,就必须是先 comparable接口。这个接口表示的就是自然排序。
(4)案例:
a:获取无重复的随机数
package cn.itcast_08;
import java.util.random;
* 编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
* 分析:
a:创建随机数对象
b:创建一个hashset集合
c:判断集合的长度是不是小于10
是:就创建一个随机数添加
否:不搭理它
d:遍历hashset集合
// 创建随机数对象
random r = new random();
// 创建一个set集合
hashset<integer> ts = new hashset<integer>();
// 判断集合的长度是不是小于10
while (ts.size() < 10) {
int num = r.nextint(20) + 1;
ts.add(num);
// 遍历set集合
b:键盘录入学生按照总分从高到底输出
package cn.itcast_08;(1)
// 姓名
// 语文成绩
private int chinese;
// 数学成绩
private int math;
// 英语成绩
private int english;
public student(string name, int chinese, int math, int english) {
this.chinese = chinese;
this.math = math;
this.english = english;
public int getchinese() {
return chinese;
public void setchinese(int chinese) {
public int getmath() {
return math;
public void setmath(int math) {
public int getenglish() {
return english;
public void setenglish(int english) {
public int getsum() {
return this.chinese + this.math + this.english;
package cn.itcast_08;(2)
* 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台
a:定义学生类
b:创建一个treeset集合
c:总分从高到底如何实现呢?
d:键盘录入5个学生信息
e:遍历treeset集合
// 创建一个treeset集合
treeset<student> ts = new treeset<student>(new comparator<student>() {
// 总分从高到低
int num = s2.getsum() - s1.getsum();
// 总分相同的不一定语文相同
int num2 = num == 0 ? s1.getchinese() - s2.getchinese() : num;
// 总分相同的不一定数序相同
int num3 = num2 == 0 ? s1.getmath() - s2.getmath() : num2;
// 总分相同的不一定英语相同
int num4 = num3 == 0 ? s1.getenglish() - s2.getenglish() : num3;
// 姓名还不一定相同呢
int num5 = num4 == 0 ? s1.getname().compareto(s2.getname())
: num4;
return num5;
});
system.out.println("学生信息录入开始");
// 键盘录入5个学生信息
for (int x = 1; x <= 5; x++) {
system.out.println("请输入第" + x + "个学生的姓名:");
string name = sc.nextline();
system.out.println("请输入第" + x + "个学生的语文成绩:");
string chinesestring = sc.nextline();
system.out.println("请输入第" + x + "个学生的数学成绩:");
string mathstring = sc.nextline();
system.out.println("请输入第" + x + "个学生的英语成绩:");
string englishstring = sc.nextline();
// 把数据封装到学生对象中
student s = new student();
s.setname(name);
s.setchinese(integer.parseint(chinesestring));
s.setmath(integer.parseint(mathstring));
s.setenglish(integer.parseint(englishstring));
// 把学生对象添加到集合
ts.add(s);
system.out.println("学生信息录入完毕");
system.out.println("学习信息从高到低排序如下:");
system.out.println("姓名\t语文成绩\t数学成绩\t英语成绩");
for (student s : ts) {
system.out.println(s.getname() + "\t" + s.getchinese() + "\t"
+ s.getmath() + "\t" + s.getenglish());
c(1):请按照姓名的长度排序(自然排序comparable)(主要判断条件年龄在判断姓名长度)
package cn.itcast_05;(1)
* 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口
public class student implements comparable<student> {
public int compareto(student s) {
// return 0;
// return 1;
// return -1;
// 这里返回什么,其实应该根据我的排序规则来做
// 按照年龄排序,主要条件
int num = this.age - s.age;
// 次要条件
// 年龄相同的时候,还得去看姓名是否也相同
// 如果年龄和姓名都相同,才是同一个元素
int num2 = num == 0 ? this.name.compareto(s.name) : num;
return num2;
package cn.itcast_05;(2)
* treeset存储自定义对象并保证排序和唯一。
* a:你没有告诉我们怎么排序
自然排序,按照年龄从小到大排序
* b:元素什么情况算唯一你也没告诉我
成员变量值都相同即为同一个元素
public class treesetdemo2 {
treeset<student> ts = new treeset<student>();
// 创建元素
student s1 = new student("linqingxia", 27);
student s2 = new student("zhangguorong", 29);
student s3 = new student("wanglihong", 23);
student s4 = new student("linqingxia", 27);
student s5 = new student("liushishi", 22);
student s6 = new student("wuqilong", 40);
student s7 = new student("fengqingy", 22);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
ts.add(s7);
c(2):请按照姓名的长度排序(自然排序comparable)(主要判断条件姓名长度在判断年龄)
package cn.itcast_06;(1)
// 主要条件 姓名的长度
int num = this.name.length() - s.name.length();
// 姓名的长度相同,不代表姓名的内容相同
// 姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄
int num3 = num2 == 0 ? this.age - s.age : num2;
package cn.itcast_06;(2)
* 需求:请按照姓名的长度排序
student s8 = new student("linqingxia", 29);
ts.add(s8);
c(3):请按照姓名的长度排序(比较器排序comparator)(主要条件姓名长度在判断年龄)
package cn.itcast_07;(1)
package cn.itcast_07;(2)
* treeset集合保证元素排序和唯一性的原理
* 唯一性:是根据比较的返回是否是0来决定。
* 排序:
让元素所属的类实现自然排序接口 comparable
让集合的构造方法接收一个比较器接口的子类对象 comparator
// treeset<student> ts = new treeset<student>(); //自然排序
// public treeset(comparator comparator) //比较器排序
// treeset<student> ts = new treeset<student>(new mycomparator());
// 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象
// 而匿名内部类就可以实现这个东西
int num2 = num == 0 ? s1.getname().compareto(s2.getname())
: num;
(5)linkhashset集合
package cn.itcast_04;
import java.util.linkedhashset;
* linkedhashset:底层数据结构由哈希表和链表组成。
* 哈希表保证元素的唯一性。
* 链表保证元素有素。(存储和取出是一致)
public class linkedhashsetdemo {
linkedhashset<string> hs = new linkedhashset<string>();
3:collection集合总结(掌握)
collection
有序,可重复
|--arraylist
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
|--vector
线程安全,效率低
|--linkedlist
底层数据结构是链表,查询慢,增删快。
|--hashset
底层数据结构是哈希表。
如何保证元素唯一性的呢?
依赖两个方法:hashcode()和equals()
开发中自动生成这两个方法即可
|--linkedhashset
底层数据结构是链表和哈希表
由链表保证元素有序
由哈希表保证元素唯一
|--treeset
底层数据结构是红黑树。
如何保证元素排序的呢?
自然排序
比较器排序
根据比较的返回值是否是0来决定
4:针对collection集合我们到底使用谁呢?(掌握)
唯一吗?
是:set
排序吗?
是:treeset
否:hashset
如果你知道是set,但是不知道是哪个set,就用hashset。
否:list
要安全吗?
是:vector
否:arraylist或者linkedlist
查询多:arraylist
增删多:linkedlist
如果你知道是list,但是不知道是哪个list,就用arraylist。
如果你知道是collection集合,但是不知道使用谁,就用arraylist。
如果你知道用集合,就用arraylist。
5:在集合中常见的数据结构(掌握)
arrayxxx:底层数据结构是数组,查询快,增删慢
linkedxxx:底层数据结构是链表,查询慢,增删快
hashxxx:底层数据结构是哈希表。依赖两个方法:hashcode()和equals()
treexxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序
java帮帮交流群