常用类3+集和

String翻转:

  1. 将字符串中指定部分进行翻转,比如将”abcdef”反转为”aedcbf”
  2. 编写方法 public static String reverse(String str,int statr,int end) 搞定

    “`
    public static String reverse(String str,int statr,int end){

    <pre><code>//对输入的参数做一个验证 写出正确的情况,然后取反即可
    if(!(str != null && start >= 0 && end > start && end < str.length()) ){
    throw new RuntimeException("参数不正确")
    }

    //1、先把数组转成char[]
    char[] chars = str.toCharArray();
    char temp = ''; //交换辅助变量
    for(int i = start,j = end;i < j;i++,j–){
    temp = chars[i];
    chars[i] = chars[j];
    chars[j] = temp;
    }
    //使用chars重新构建一个String
    return new String(chars);
    </code></pre>

    }

    “`

注册处理题:

输入用户名,密码,邮箱,如果信息录入正确,则提示注册成功,否则生成异常对象

要求:
  1. 用户名长度为2或3或4
  2. 密码的长度为6,要求全是数字, isDigital
  3. 邮箱中包含@和. 并且@在.的前面
思路分析:
  1. 编写方法userRegister(String name,String pwd,String email){}
  2. 针对 输入的内容进行校验,如果发现有问题,就抛出异常,给提示
  3. 单独的写一个方法,判断 密码是否全部都是数字字符boolean
代码实现:
        userRegister(String name,String pwd,String email){
            int userLength = name.length();
            if(!(userLength >=2 && userLength <=4)){
                throw new RuntimeException("用户名长度为2或3或4")
            }

            if(! (pwd.length() == 6 && isDigital(pwd)) ){
                throw new RuntimeException("密码长度为6,要求全是数字")
            }

            //indexOf  获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1
            int i = email.indexOf("@");
            int j = email.indexOf(".")
            if (!(i > 0 && j > i)) {
                throw new RuntimeException("邮箱中包含@和.    并且@在.的前面")
            }
        }

        public static boolean isDigital(String str){
            char[] chars = str.toCharArray();
            for(int i = 0;i < chars.length;i++){
                if(chars[i] < '0' || chars[i] > '9'){
                    return false;
                }
            }
            return true;
        }
        public static void main(String[] args) {
            String name = "jack";
            String pwd = "123465";
            String email = "jack@sohu.com";

            try{
                userRegister(name,pwd,email);
                System.out.print("恭喜你注册成功");
            }catch(Exception e){
                System.out.print(e.getMessage);
            }
        }

集合 VS 数组:

数组:
  1. 长度开始时必须指定,而且一旦指定,不能更改
  2. 保存的必须为同一类型的元素
  3. 使用数组进行增加/删除元素的代码比较麻烦
集合:
  1. 可以动态保存任意多个对象,使用比较方便
  2. 提供了一系列方便的操作对象的方法:add、remove、set、get等
  3. 使用集合添加、删除新元素的代码简洁了

集合:

  1. 集合主要是两组(单列集合,双列集合)
  2. Collection接口有两个重要的子接口:List,Set,它们的实现子类都是单列集合
  3. Map接口的实现子类是双列集合,存放的K-V
集合框架体系图:

暂时无法在{app_display_name}文档外展示此内容

  1. ##### Collection接口 特点 方法

Collection接口的子接口:List实现类:ArrayList、LinkedList、Vector

Collection接口的子接口:Set实现类:HashSet、LinkedHashSet

  1. ##### Map接口 特点方法 遍历方法

Map接口的实现类:HashMap\Hashtable等

Collections工具类的使用

代码演示:
        ArrayList arrayList = new ArrayList();
        arrayList.add("jack");
        arrayList.add("tom");

        HashMap hashMap = new HashMap;
        hashMap.put("NO1","北京");
        hashMap.put("NO2","上海");

Collection接口和常用方法:

public interface Collection extends Interable

  1. collection实现子类可以存放多个元素,每个元素可以是Object
  2. 有些Collection的实现类,可以存放重复的元素,有些不可以
  3. 有些Collection的实现类,有些是有序的(List),有些不是有序(Set)
  4. Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的
方法:
  1. add:添加单个元素
  2. remove:删除指定元素
  3. contains:查找元素是否存在
  4. size:获取元素个数
  5. isEmpty:判断是否为空
  6. clear:清空
  7. addAll:添加多个元素
  8. containsAll:查找多个元素是否都存在
  9. removeAll:删除多个元素
  10. 说明:以ArrayList实现类来演示
        public static void main(String[] args) {
            List list = new ArrayList();

            //add:添加单个元素
            list.add("jack");
            list.add(10);   //list.add(new Integer(10))
            list.add(true);

            //remove:删除指定元素
            list.remove(0); //删除第一个元素
            list.remove("jack");    //指定删除某个元素

            //contains:查找元素是否存在
            list.contains("jack");  //返回true,若不存在,返回false

            //size:获取元素个数
            list.size();    //返回3

            //isEmpty:判断是否为空
            list.isEmpty(); //F

            //clear:清空
            list.clear();   //清空所有元素

            //addAll:添加多个元素
            ArrayList list2 = new ArrayList();
            list2.add("红楼梦");
            list2.add("三国演义")
            list.addAll(list2);

            //containsAll:查找多个元素是否都存在
            list.containsAll(list2);    //true

            //removeAll:删除多个元素
            list.removeAll(list2);
        }
Collection接口遍历元素的方式1:使用Iterator(迭代器)
基本介绍:
    基本介绍:
        接口 Iterator<E>
        所有已知子接口:
            ListIterator<E>,XMLEventReader

        所有已知实现类:
            BeanContextSupport.BCSIterator,EventReaderDelegate,Scanner

    1、Interator对象成为迭代器,主要用于遍历Collection集合中的元素
    2、所有实现了Collection接口的集合类都有一个iterator()方法,
      用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器
    3、Iterator的结构       
        hasNext(),1、指针下移 2、下移以后集合位置上的元素返回
        如果没有下一个元素了,就返回false
        调用
    4、Iterator仅用于遍历集合,Iterator本身并不存放对象

    public static void main(String[] args) {
        Collection col = new ArrayList();

        col.add(new Book("三国演义","罗贯中",10.1));
        col.add(new Book("小李飞刀","古龙",5.1));
        col.add(new Book("红楼梦","曹雪芹",34.6));

        //遍历col集合
        //1、先得到col对应的迭代器
        Iterator iterator = col.iterator();
        //2、使用while循环遍历
        while(iterator.hasNext()){  //判断是否还有数据
            //返回下一个元素,类型的Object
            Object obj = iterator.next();
            System.out.print("obj=" + obj);
        }
        //3、当退出while循环后,这是iterator迭代器指向最后的元素
        //4、如果希望再次遍历,需要重置迭代器
        iterator = col.iterator();  //重置迭代器

    }
Collection接口遍历对象方式2-for循环增强
  • 增强for循环,可以代替iterator迭代器,
  • 特点:增强for循环就是简化版的iterator,本质一样,只能用于遍历集合或数组
  • 增强for底层还是迭代器,可以理解成简化版本的迭代器
基本语法:
        for(元素类型 元素名 : 集合名或数组名){
            访问元素
        }

    for (Object book : col) {
        System.out.print("book=" + book);
    }

    //增强for也可以直接在数组使用
    int[] nums = {1,8,10,90};
    for (int i : nums) {
        System.out.print("i=" +i);
    }

List接口和常用方法:

List接口基本介绍:

List接口是Collection接口的子接口

  1. List集合类中元素有序(即添加顺序和去除顺序一致)、且可重复
  2. List集合中的每个元素都有其应对的顺序索引,即支持索引
  3. List容器中的元素都对应一个整数型的序号加载其在容器中的位置,可以根据序号存取容器中的元素
  4. JDK API中List接口库的实现类有:
        接口List<E>
        所有超级接口:
            Collection<E>,Interable<E>
        所有已知实现类:
            AbstractList,AbstaractSequentialList,ArrayList,AttributeList,
            CopyOnWriteArrayList,LinkedList,RoleList,RoleUnresolvedList,Stcak,Vector
    
        常用的有:ArrayList,LinkedList,Vector
    
List接口的常用方法:

List集合里添加了一些根据索引来操作集合元素的方法

  1. void add(int index,Object ele):在index位置插入ele元素
  2. boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来
  3. Object get(int index):获取指定index位置的元素
  4. int indexOf(Object obj):返回obj在当前集合中首次出现的位置
  5. int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
  6. Object remove(int index):移除指定index位置的元素,并返回此元素
  7. Object set(int index,Object ele):设置指定index位置的元素为ele,相当于是替换
  8. List subList(int formIndex,int tolndex):返回从formIndex到toIndex位置的子集合
List的三种遍历方式[ArrayList,LinkedList,Vector]
        1、方式一:使用iterator
            Iterator iter = col.iterator();
            while (iter.hasNext()) {
                Object o = iter.next();
            }
        2、方式二:使用增强for
            for(Object o:col){

            }
        3、方式三:使用普通for
            for (int i=0;i<list_size();i++ ) {
                Object object = list.get(i);
                System.out.print(object);
            }
        说明:使用LinkedList完成 使用方式和ArrayList一样

ArrayList的注意事项

  1. permits all elements,includeing null,ArrayList 可以加入null,并且多个
  2. ArrayList是由数组来实现数据存储的
  3. ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)

多线程情况下,不建议使用ArrayList

ArrayList扩容机制:

1、ArrayList中维护了一个Object类型的数组elementData
  transient Object[] elementData;   //transient表示瞬间,短暂的;表示该属性不会被序列化
2、当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,
  第一次添加,则扩容elementData为10,如需再次扩容,则扩容elementData为1.5倍
3、如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,
  则直接扩容elementData为1.5倍

Vector:

  1. Vector类的定义说明:
    public class Vector<E>
    extends AbstractList<E>
    implements List<E>,RandomAccess,Cloneable,Serializable
    
  2. Vector底层也是一个对象数组,protected Object[] elementData;

  3. Vector是线程同步,即线程安全,Vector类的操作方法带有Synchronized

    public synchronized E get(int index){
        if(index >= elementCount)
                throw new ArrayIndexOutOfBoundsException(index);
            return elementData(index);
    }
    
  4. 在开发中,需要线程同步安全时,需考虑使用Vector

Vector VS ArrayList:

ArrayList:

底层结构:可变数组

版本:jdk1.2

线程安全(同步)效率:不安全,效率高

扩容倍数:如果是有参构造1.5倍

​ 如果是无参

​ 1、第一次10

​ 2、从第二次开始按1.5扩

Vector:

底层结构:可变数组

版本:jdk1.0

线程安全(同步)效率:安全,效率不高

扩容倍数:如果是无参,默认10,满后,就按2倍扩容

​ 如果指定大小,则每次直接按2倍扩

LinkedList:

  1. LinkedList实现了双向列表和双端队列特点
  2. 可以添加任意元素(元素可以重复),包括null
  3. 线程不安全,没有实现同步
LinkedList的底层操作机制:
  1. LinkedList底层维护了一个双向链表
  2. LinkedList中维护了两个属性first和last分别指向 首节点和尾节点
  3. 每个节点(Node对象),里面又维护了prev,next,item三个属性,其中prev指向前一个,通过next指向后一个节点,最终实现双向链表
  4. 所以LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高

ArrayList VS LinkedList:

ArrayList:

底层结构:可变数组

增删的效率:较低,数组扩容

改查的效率:较高

LinkedList:

底层结构:双向链表

增删的效率:较高,通过链表追加

改查的效率:较低

如何选择ArrayList 和 LinkedList:
  1. 如果改查操作多:ArrayList
  2. 如果增删操作多:LinkedList
  3. 一般来说,在程序中,80%~90%都是查询,因此大部分情况下会选择ArrayList
  4. 在一个项目中,根据业务灵活选择,也可能这样,一个模块使用的是ArrayList,另外一个模块是LinkedList
创作不易!转载请注明作者及文章链接或作者博客链接——
- 作者:pidanxia
- 链接:https://pidanxia.ink
(链接可为:**文章链接**或者**作者博客链接**)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇