首页
关于
Search
1
sql的注入原因和解决办法
138 阅读
2
SpringBoot整合腾讯云存储COS及基本使用,增删改查......
128 阅读
3
深究contains方法
100 阅读
4
多线程概述
74 阅读
5
学习的第一个注解@WebServlet - JavaWeb
73 阅读
默认分类
Java
C/C++
Mysql
JavaWeb
SpringBoot
算法
前端
Linux
Search
标签搜索
Spring
HTTP
Java
JavaWeb
IOC
mybatis
腾讯云
COS
云存储
CDN
redis
分布式
id
全局唯一id
Typecho
累计撰写
26
篇文章
累计收到
2
条评论
首页
栏目
默认分类
Java
C/C++
Mysql
JavaWeb
SpringBoot
算法
前端
Linux
页面
关于
搜索到
26
篇与
achong
的结果
2022-03-06
深究contains方法
contains方法解析在java中,contains方法用于判断集合中是否包含某个元素,包含则返回true,否则返回false。boolean contains(Object o); //先看一个案例:字符串str实际上没添加进集合c里,但是contains返回的结果却是true?也就是说,contains发现str包含在c集合里。public static void main(String[] args) { //创建集合对象 Collection c = new ArrayList(); //添加数据 c.add("abc"); c.add(123); //1.str实际上没添加进集合c里,但是contains返回的结果却是true? String str = "abc"; System.out.println("str是否包含在集合里:"+c.contains(str)); //true 再看第二个案例:new了两个属性相同的学生对象stu1和stu2。跟代码一逻辑一样,把stu1添加进集合里,因为两个学生的名字是相同的,所以用contains方法比较stu2是否包含在集合c里,然而这次返回结果是false,为什么,明明两个学生名字一样啊。public static void main(String[] args) { //创建集合对象 Collection c = new ArrayList(); //添加数据 c.add("abc"); c.add(123); //2.根据上面的逻辑,这次new两个属性相同的学生对象stu1和stu2,把stu1添加进集合里,然后判断stu2是否在集合里,这次结果为false Student stu1 = new Student("小明"); Student stu2 = new Student("小明"); c.add(stu1); System.out.println("学生对象stu是否在集合c里:"+c.contains(stu2)); //false } } //学生类 class Student{ String name; //带参构造方法 public Student(String name) { this.name = name; }原因: 通过查看实现类ArrayList里的contains方法可以发现,从contains()到indexOf(),再到indexOfRange(),在最后的indexOfRange()方法里,调用了equals()方法来进行比较。//contains的底层源码 public boolean contains(Object o) { return indexOf(o) >= 0; } public int indexOf(Object o) { return indexOfRange(o, 0, size); } int indexOfRange(Object o, int start, int end) { Object[] es = elementData; // if (o == null) { for (int i = start; i < end; i++) { if (es[i] == null) { return i; } } } else { for (int i = start; i < end; i++) { if (o.equals(es[i])) { return i; } } } return -1; }结论分析 关于equals方法,我们得知道,所有的子类默认继承Object类,而Object的equels方法只是返回对象内存地址。 由此分析代码一:集合里有一个字符串“abc”,创建一个String变量赋值“abc”,两者本质上都是字符串,且String类型已经重写equals方法。contains在对两个比较的时候调用的是equals方法,由于String类的已经重写了,返回的是属性而不是内存地址,故字符串可以被正确比较。 代码二分析:虽然两个学生的名字属性一样,但是,集合保存的是对象的内存地址,而Student类没有重写equals方法,所以contains方法在调用equals方法判断的时候,判断的是两个对象的地址,两个对象的内存地址肯定不一样,所以返回false。 代码二解决方案:重写Student的equals方法,使其返回对象属性,即可获取正确的判断。//学生类重写的equals方法 class Student{ String name; public Student(String name) { this.name = name; } @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Student)) return false; if(obj == this) return true; Student s = (Student) obj; if(this.name == s.name) return true; return false; } }再看以下代码:Integer x = 1000; Integer y = 1000; c.add(x); System.out.println(c.contains(y)); //true虽然new了两个不一样的对象,但是Integer包装类重写了equals方法,所以x和y是一样的。结论:放在集合里的类型,一定要重写equals方法。注意:remove删除方法也是调用的equals方法。
2022年03月06日
100 阅读
0 评论
1 点赞
2022-03-05
Collection集合里的迭代器
Collection集合的迭代器迭代器适合所有集合。常用的两个函数:boolean hasNext(); //判断集合里还有无元素。 next(); //这个方法让迭代器前进一位,并且将指向的元素返回。 void remove(); //删除当前元素一般这两个方法会一起使用,先hasNext()判断集合是否还有元素,然后next()拿到下一个元素。public static void main(String[] args) { //创建一个集合对象 Collection c = new ArrayList(); //添加数据 c.add("你好"); c.add("我叫阿冲"); c.add("很高兴认识你"); c.add("你叫什么名字?"); c.add(123); c.add("abc"); // 创建集合对象 Iterator it = c.iterator(); //循环判断,并取出。 while(it.hasNext()){ Object obj = it.next(); //这里用Object类型接收,因为集合里存储的对象类型可能不一样 System.out.println(obj); } }迭代集合原理该方法拿到一个迭代器,它负责遍历集合中的元素。it.hasNext(); 这个方法返回true,表示集合里还有元素可以迭代,若返回false,则表示没有更多的元素可以迭代了。it.next();表示拿到迭代器当前位置的下一个元素并返回。把集合想象成一个数组,迭代器像一个指向集合里元素的箭头。起初,迭代器指向的位置是在第一个元素的前一位。it.next()每拿一个元素,迭代器就前进一位Iterator it = c.iterator(); while(it.hasNext()){ Object obj = it.next(); //这里用Object接收,因为集合里存储的对象类型可能不一样 System.out.println(obj); }迭代器remove方法先说结论:如果集合的状态发生改变,对应迭代器必须重新获取。若集合的状态改变了,但是迭代器没有更新,此时还用旧的迭代器输出数据,就会发生异常。例如以下代码: 在拿到迭代器后,又往集合里添加一个新数据,此时下面的循环遍历就会报异常 ConcurrentModificationExceptionCollection c = new ArrayList(); c.add(123); c.add(234); c.add(234); Iterator it = c.iterator(); c.add(1122); while (it.hasNext()){ Object o = it.next(); System.out.println(o); }迭代器的原理: 在执行语句Iterator it = c.iterator();的时候,相对于把 c 集合里的数据复制了一份出来保存到 it 里。在使用点带起的时候,系统会时刻检查 c集合 和 it迭代器的内容是否一致 。 所以,往集合添加和删除元素的时候,需要及时更新迭代器;在迭代的过程中需要删除元素,必须使用迭代器的remove方法,而不是集合的remove方法。
2022年03月05日
51 阅读
0 评论
0 点赞
2022-03-05
Collection接口里的常用方法
Collection接口的常用方法Collection是接口,以下使用该接口的实现类来测试该接口里的方法。下面只是列举了一些常用的方法。Collection中能存放什么元素? 没有使用”泛型“之前,Collection可以存储Object的所有子类型。使用”泛型“之后,Collection只能存储某个数据类型。 集合中不能直接存储数据类型,也不能存储java对象,只是 存储java对象的内存地址。 常用方法 //往集合里添加元素。boolean add(Object e); //获取集合中元素个数。 int size(); //清空集合。 void clear(); //判断集合是否包含某元素。 boolean contains(); //删除集合中某个元素 boolean remove(Object o; //判断该集合中元素个数是否为0,即是否为空。 boolean isEmpty(); //把集合转换成数组。Object[] toArray();
2022年03月05日
61 阅读
0 评论
0 点赞
2022-03-05
多线程概述
多线程什么是进程?什么是线程?进程是一个运行中的应用程序。线程时进程中的执行场景/执行单元一个进程可以启动多个线程进程之间的内存独立不共享QQ是一个进程,微信是一个进程,这两个进程时独立的,不共享资源线程之间线程A和线程B,堆方法和方法区内存共享,但是栈内存独立,一个线程一个栈假设启动10个线程,就会有10个栈空间,每个栈和每个栈之间互不干扰,各自执行各自的,这就是多线程并发假设进程是一个火车站,那每一个售票窗口就是一个线程,每个窗口之间的可以同时售票。所以多线程并发可以提高效率。线程的生命周期注意:使用了多线程机制后,main方法结束,程序也不会结束。mian方法结束只是主线程结束了,主栈空了,其他栈可能还在运行(压栈弹栈)
2022年03月05日
74 阅读
0 评论
0 点赞
2022-03-05
集合继承结构图
集合结构Collection- CollectionListList集合存储特点,元素有序可重复,存储的元素有下标。ArrayListArrayList集合底层采用了数组这种数据结构。ArrayList集合是非线程安全的。LinkListLinkList集合底层采用了双向链表数据结构VectorVector集合也是采用双向链表的数据结构,但它是线程安全的。Vector所有的方法都有synchronized关键字修饰,所以线程安全,但是效率较低。选择保证线程安全有别的办法,故Vector使用较少了。SetSet集合存储特点:元素无序不可重复。HashSet实际上HashSet集合在new的时候,底层实际上new了一个HashMap集合。向HashSet中存储元素,实际上是存储在HashMap集合中。HashMap集合是一个哈希表数据结构。TreeSetSet实现了SortedSet接口,TreeSet是一个实现类。TreeSet底层实际上是TreeMap,new TreeSet的时候,实际上是new了一个TreeMap集合。往TreeSet中存储数据的时候,实际上是将数据放到TreeMap集合中了。-TreeMap集合底层采用了二叉树结构。MapMap集合与Collection集合没有关系。Map集合以key和value的这种键对值的方式存储元素。key和value都是存储java对象的内存地址。 -所有Map集合的key特点:无序不可重复的。Map集合的key和Set集合的存储元素特点相同。HashMap:-HashMap集合底层是哈希表数据结构,是非线程安全的。Hashteble-Hashtable集合底层也是哈希表数据结构,是线程安全的,其中所有的方法都带有synchronized关键字,但效率较低,现在使用少了,因为控制线程安全有其他更好的方案。 -Properties -Properties是线程安全的,因为继承Hashtable,另外Properties存储元素的时候也是采用key和value的形式存储,并且key和value支支持String类型,不支持其他类型。 -Properties被称为属性类TreeMap <interface> SortedSetTreeMap集合底层的数据结构是一个二叉树。
2022年03月05日
40 阅读
0 评论
1 点赞
1
...
4
5
6