----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
ArrayList集合与LinkedList集合
ArrayList特点:
有序的,有下标的,可以重复的(list共性)
底层是可变数组结构,构造一个初始容量为10的空列表每次增长50%,此类是线程不安全的,效率高
底层采用数组实现查询效率快,增删慢
LinkedList
底层采用是链表数据结构
线程不同步的集合。查询慢,增删块。
案例:
1. ArrayList存储自定义的Person对象,并迭代器取出
2. ArrayList存储自定义对象,并去掉重复的元素
import java.util.*;
public class ArrayListDemo {
public static void main(String[] args) {
method();
}
public static void method(){
// 建立ArrayList集合对象
ArrayList al = new ArrayList();
//建立自定义的Person对象
//调用集合的add方法,将自定义的Person对象存储到级集合
al.add(new Person("zhangsan",22));
al.add(new Person("lisi",32));
al.add(new Person("wangwu",42));
al.add(new Person("zhaoliu",52));
al.add(new Person("maqi",62));
//迭代器获取集合中的元素
Iterator it = al.iterator();
while( it.hasNext()){
//一次迭代器中,不允许出现多个next方法!!
//进行强制类型的转换,原因是,存储到集合中的Person已经被提升为了Object类型
//如果使用Person自己特有的方法,类型的向下转型
Person p = (Person)it.next();
System.out.println(p.getName()+"..."p.getAge());//直接打印p下面复写toString
}
}
}
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.age = age;
this.name = name;
}
public void setName(String name){ this.name = name;}
public String getName(){return this.name;}
public void setAge(int age){ this.age = age;}
public int getAge(){ return this.age;}
//覆盖object中的equals方法
public boolean equals(Object obj){
//如果对象中的姓名和年龄一致的话,equals方法就返回真
if (this == obj)
return true;
if( obj instanceof Person){
Person p = (Person)obj;
return this.name.equals(p.name) && this.age==p.age;
}
return false;
}
public String toString(){
return name +"..."+ age;
}
}
/*
* ArrayList去掉重复的元素
* 实现的思路:
* 1. 再定义一个ArrayList集合
* 2. 迭代老集合 ,将迭代到的老集合中的元素,去新集合中 看看包含不包含
* 3. 如果不包含,就将老集合中的元素,存储到新集合
* 4. 如果包含,就不存
* 5. 迭代老集合完毕,新集合中,就是去掉重复元素的结果
*/
import java.util.*;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add(new Person("zhangsan",22));
al.add(new Person("lisi",32));
al.add(new Person("lisi",32));
al.add(new Person("wangwu",42));
al.add(new Person("zhaoliu",52));
al.add(new Person("zhaoliu",52));
al.add(new Person("maqi",62));
System.out.println(al);
al = method(al);
System.out.println(al);
}
/*
* 去除重复的元素,用到了一个集合中的关键方法 contains
* 刚才我们存储的是String类的对象
*
* contains判断元素是否存在于集合中,条件是什么,凭什么判断对象存在
* 判定对象是否存在于集合中,依据是对象的equals方法,如果对象的equals方法,返回真 contains就判断集合中有这个元素
*
* 我们现在的要求是去掉自定义的对象,在Person中,覆盖equals方法
*/
//接收一个集合,去掉重复的,并返回一个新集合
public static ArrayList method(ArrayList al){
//1. 再定义一个ArrayList集合
ArrayList newal = new ArrayList();
//2. 迭代老集合,将迭代到的老集合中的元素,去新集合中 看看包含不包含
Iterator it = al.iterator();
while( it.hasNext()){
//3. 如果不包含,就将老集合中的元素,存储到新集合
Object o = it.next();
if(!newal.contains(o)){
newal.add(o);
}
}
return newal;
}
}
用户登录注册功能实现
* UserInterface类
* 显示页面(控制台)效果
* 提示用户程序中有哪些功能
* 没一项功能使用
*
* 功能越强大,人性化设计越强,开发者就费事
* 追求的是,代码越少越好,功能越大越好
*/
import java.util.Scanner;
public class UserInterface {
public static void main(String[] args) {
UserInfo ui = new UserInfo();
//提示的信息
System.out.println("欢迎访问我们的系统");
//System.out.println("本系统有2个功能,选择1是注册,选择2是登录");
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("本系统有2个功能,选择1是注册,选择2是登录");
//开始接用户的输入,选择的是功能菜单
String number = sc.next();
if("1".equals(number)){
//进入到了注册功能
System.out.println("选择的是注册功能");
System.out.println("请输入用户名");
String username = sc.next();
//检测一下用户名是否被占用了
//将用户名username,传递给用户的信息操作类处理是否被占,并返回结果
/*boolean b = ui.checkUsername(username);
if(false==b){}*/
//如果方法,返回真,可以注册,返回假呢,被占用了
if(!ui.checkUsername(username)){
System.out.println("用户名被占用了,请您重新输入");
System.out.println("可以尝试"+username+"_123");
continue;
}
System.out.println("用户名可以使用");
System.out.println("请第一次输入密码");
String password1 = sc.next();
System.out.println("第二次输入密码");
String password2 = sc.next();
if( !password1.equals(password2)){
System.out.println("两次密码不一致");
continue;
}
//用户名可以用,密码也正确。将用户名和密码这2个字符串,传递给UserInfo类
//将信息存储到集合中
ui.addUser(username, password1);
System.out.println("注册成功");
}else if("2".equals(number)){
//进入到了登录功能
System.out.println("选择登录");
System.out.println("请输入用户名");
String username = sc.next();
System.out.println("请输入密码");
String password = sc.next();
//将用户名和密码送给UserInfo,中的验证密码的功能
if(ui.checkLogin(username, password)){
System.out.println("登录成功");
}else{
System.out.println("登录失败,请检查用户名或者密码");
}
}else{
System.out.println("无此功能");
break;
}
}
}
}
package cn.itcast.user;
import java.util.ArrayList;
import java.util.Iterator;
public class UserInfo {
private ArrayList al = new ArrayList();
public UserInfo(){
//集合中添加测试的数据,测试成功,构造方法可以删除了
//al.add(new User("shisong","123"));
//al.add(new User("dongpeng","234"));
}
//定义方法,检测用户名和密码的正确性,正确返回真,错误返回假
public boolean checkLogin(String username,String password){
//迭代集合
Iterator it = al.iterator();
while(it.hasNext()){
User u = (User)it.next();
if(username.equals(u.getUsername()) && password.equals(u.getPassword()))
return true;
}
return false;
}
//定义方法,保存用户的名和密码,将user对象存储到集合
public void addUser(String username,String password){
al.add(new User(username,password));
System.out.println("========="+al.size());
}
//定义检测用户名是否被占的功能,返回值是布尔类型
//如果返回真,说明用户名不存在可以注册,如果返回假,被占用了,不能注册
public boolean checkUsername(String username){
//迭代集合
Iterator it = al.iterator();
while(it.hasNext()){
//迭代过程中,强制类型转换
User u = (User)it.next();
//用用户名,和User对象中保存的用户名进行比较,如果equals返回真,用户名存在了
if(username.equals(u.getUsername())){
return false;
}
}
return true;
}
}
public class User {
public User(String username,String password){
this.password = password;
this.username = username;
}
private String username;
private String password;
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;
}
}
LinkedList:的特有方法
addFirst();将指定元素插入列表的开头
addLast();将指定元素插入列表的结尾
在jdk1.6以后。
offerFirst();
offerLast();
getFirst():获取链表中的第一个元素。如果链表为空,抛出NoSuchElementException;
getLast();
在jdk1.6以后。
peekFirst();获取链表中的第一个元素。如果链表为空,返回null。
peekLast();
removeFirst()获取并删除链表中的第一个元素。如果链表为空,抛出NoSuchElementException
removeLast();
在jdk1.6以后。
pollFirst(); 获取并删除链表中的第一个元素。如果链表为空,返回null。
pollLast();
/*
* 使用LinkedList模拟数据结构
* 堆栈:数据先进去,后出来
* 队列:数据先进去,先出来
*
* 要点:
* 自定义功能,实现数据结构效果,并,提供用户使用
* 自定义的功能,使用LinkedList功能
*/
import java.util.*;
class Data{
//实现数据的先进先出,后进后出,提供方法,让用户调用
//定义一个LinkedList类型的变量
LinkedList link = null;
Data(){
link = new LinkedList();
}
//定义方法向LinkedList集合中添加数据
public void add(Object o){
link.add(o);
}
//定义方法,提供返回布尔类型的参数,让用户进行循环
public boolean isEmpty(){
return link.isEmpty();
}
//定义方法,获取集合中存储的对象
public Object get(){
return link.removeFirst();
}
}
public class LinkedListTest {
public static void main(String[] args) {
Data d = new Data();
d.add("abc1");
d.add("abc2");
d.add("abc3");
d.add("abc4");
while(!d.isEmpty()){
System.out.println(d.get());
}
/*LinkedList link = new LinkedList();
link.add("abc1");
link.add("abc2");
link.add("abc3");
link.add("abc4");
while(!link.isEmpty()){
System.out.println(link.removeFirst());
}*/
}
}
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------