一、数据类型

包装类型

包装类型是对基本数据类型不足之处的补充。

基本数据类型的传递方式是值传递,而包装类型是引用传递,同时提供了很多数据类型间转换的方法。

Java1.5 以后可以自动装箱和拆箱

二、集合

List:有序、可重复。可以通过索引快速查找,但进行增删操作时后续的数据需要移动,所以增删速度慢。 List 接口的大小可变数组的实现,即:可以直接指定容量大小

|--ArrayList:底层数据结构是 数组结构.是线程不同步的(不安全的).查询速度很快,但是增删较慢。

构造一个初始容量为 10 的空列表,当放满了10个元素后,以50%的长度加长集合容器的长度。

|--LinkedList:底层数据结构是 链表结构。对元素的增删速度很快。但是查询速度很慢。线程是不同步的。

|--Vector:底层数据结构也是数组结构,是线程同步的(安全的),效率低,被ArrayList替代了。1.2版本以后的集合都是不同步的;当放满了10个元素后,以100%的长度加长集合容器的长度。

Vector的特有功能

1、添加功能

public void addElement(Object obj)

2、获取功能

public Object elementAt(int index)

public Enumeration elements()

LinkedList的特有功能

1、添加功能

public void addFirst(Object e)

public void addLast(Object e)

2、获取功能

public Object getFirst()

public Object getLast()

3、删除功能

public Object removeFirst()

public Object removeLast()

ArrayList和LinkedList的区别

ArrayList扩容是将就得数组复制到新的数组的过程,所以会时间损耗是复制移动的时间,空间损耗是新的数组是按1.5倍扩容,复制移动完数据可能会有剩余空间浪费

1.ArrayList是实现了基于动态数组的数据结构,每个元素在内存中存储地址是连续的;LinkedList基于链表的数据结构,每个元素内容包扩previous, next, element(其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值),也是由于这一性质支持了每个元素在内存中分布存储。

2.为了使得突破动态长度数组而衍生的ArrayList初始容量为10,每次扩容会固定为之前的1.5倍,所以当你ArrayList达到一定量之后会是一种很大的浪费,并且每次扩容的过程是内部复制数组到新数组;LinkedList的每一个元素都需要消耗一定的空间

3.对于每个元素的检索,ArrayList要优于LinkedList。LinkedList不 支持高效的随机元素访问;因为ArrayList从一定意义上来说,就是复杂的数组,所以基于数组index的  检索性能显然高于通过for循环来查找每个元素的LinkedList。

4.元素插入删除的效率对比,要视插入删除的位置来分析,各有优劣

在列表首位添加(删除)元素,LnkedList性能远远优于ArrayList,原因在于ArrayList要后移(前移)每个元素的索引和数组扩容(删除元素时则不需要扩容)。(测试的时候当然插入一次是看不出来什么的,我自己测试插入十万次,就会有数组扩容arraycopy的因素)而LinkedList则直接增加元素,修改原第一元素该节点的上一个节点即可,删除同理

在列表中间位置添加(删除)元素,总的来说位置靠前则LnkedList性能优于ArrayList,靠后则相反。出现这种情况的原因在于ArrayList性能主要损耗在后移(前移)该位置之后的元素索引,而LinkedList损耗在for循环从第一位检索该位置的元素。这个性能反转的临界点不固定,我自己测试插入十万次,在15000次左右损耗时间相比出现变化

在列表末尾位置添加(删除)元素,性能相差不大。

Set:无序、不可重复。

Collection

|--List

有序(存储顺序和取出顺序一致),可重复

|--Set

无序(存储顺序和取出顺序不一致),唯一

HashSet:它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。

注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序,

而你的顺序恰好和它的存储顺序一致,这代表不了有序,你可以多存储一些数据,就能看到效果。

HashSet的唯一性

问题:为什么存储字符串的时候,字符串内容相同的只存储了一个呢?

通过查看add方法的源码,我们知道这个方法底层依赖 两个方法:hashCode()和equals()。

步骤:

首先比较哈希值

如果相同,继续走,比较地址值或者走equals()

如果不同,就直接添加到集合中

按照方法的步骤来说:

先看hashCode()值是否相同

相同:继续走equals()方法

返回true: 说明元素重复,就不添加

返回false:说明元素不重复,就添加到集合

不同:就直接把元素添加到集合

如果类没有重写这两个方法,默认使用的Object()。一般来说不同相同。

而String类重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个

哈希表:是一个元素为链表的数组,

LinkedHashSet:底层数据结构由哈希表和链表组成。 哈希表保证元素的唯一性。 链表保证元素有素。(存储和取出是一致)

TreeSet:能够对元素按照某种规则进行排序。 排序有两种方式 A:自然排序 B:比较器排序 TreeSet集合的特点:排序和唯一 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。

A:自然排序(元素具备比较性) 让元素所属的类实现自然排序接口 Comparable B:比较器排序(集合具备比较性) 让集合的构造方法接收一个比较器接口的子类对象 Comparator

自然排序

package cn.itcast_05;

import java.util.TreeSet;

public class TreeSetDemo2 {

public static void main(String[] args) {

// 创建集合对象

TreeSet ts = new TreeSet();

// 创建元素

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);

// 遍历

for (Student s : ts) {

System.out.println(s.getName() + "---" + s.getAge());

}

}

}

/*学生类*/

package cn.itcast_05;

/*

* 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口

*/

public class Student implements Comparable {

private String name;

private int age;

public Student() {

super();

}

public Student(String name, int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

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;

}

}

---------------------

作者:小峰峰疯疯的

来源:CSDN

原文:https://blog.csdn.net/gafeng123456/article/details/50772296

版权声明:本文为博主原创文章,转载请附上博文链接!

比较器排序

package cn.itcast_07;

import java.util.Comparator;

import java.util.TreeSet;

public class TreeSetDemo {

public static void main(String[] args) {

// 创建集合对象

// TreeSet ts = new TreeSet(); //自然排序

// public TreeSet(Comparator comparator) //比较器排序

// TreeSet ts = new TreeSet(new MyComparator());

// 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象

// 而匿名内部类就可以实现这个东西

TreeSet ts = new TreeSet(new Comparator() {

@Override

public int compare(Student s1, Student 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;

}

});

// 创建元素

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);

Student s8 = new Student("linqingxia", 29);

// 添加元素

ts.add(s1);

ts.add(s2);

ts.add(s3);

ts.add(s4);

ts.add(s5);

ts.add(s6);

ts.add(s7);

ts.add(s8);

// 遍历

for (Student s : ts) {

System.out.println(s.getName() + "---" + s.getAge());

}

}

}

Map:键值对、键唯一、值不唯一。Map 集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对 map 集合遍历时先得到键的 set 集合,对 set 集合进行遍历,得到相应的值。

Map集合常用的子类有两种: HashMap  TreeMap

1.HashMap集合

注意:

Map集合都是针对键有效,且键是唯一的, 如果有相同的键,则第二个键的值覆盖掉第一个键的值,如果第一次给HashMap添加元素,则put()方法返回值为null,第二次添加相同键的元素,则返回第一次添加的元素的值

存储自定义对象的两种方式:

自定义对象为键  :不能重复 ,需要重写equals()和HashCode()两个方法

自定义对象为值  :可以重复

注释:

如果成员变量的值相同则认为是同一个人,即重复

HashMap底层依赖的是哈希表

哈希表依赖于两个方法:equals()和HashCode();

//自定义对象作为键,必须具有唯一性,输出不能保证顺序

面试题:

HashMap和HashTable的区别?

共同点:都是基于Map集合的实现类,都是哈希表的实现类

HashMap集合:线程不安全,执行效率高,不同步,允许null值和null键

HashTable集合:线程安全,执行效率低,同步,不允许null值和null键

线程安全的类:

StringBuffer    :字符串缓冲区

Vector             :List集合的子集合

HashTable       :Map集合的子集合

2.LinkedHashMap集合

LinkedHashMap集合是Map接口基于哈希表和链表实现的

哈希表可保证键的唯一性

链表保证了元素的有序性(存储和取出一致)

3.TreeMap集合

TreeMap集合的两种排序方式:

自然排序:自定义的类实现Comparable接口,通过无参构造形式创建对象,并且重写ComparaTo()方法

比较器排序:通过public TreeSet(Comparator comparator)构造方法创建对象,并且重写了Compare()方法

比较器排序的两种方式:

1).创建实现类继承Comparator接口,并且重写Compare()方法

2).直接使用匿名内部类实现,重写Compare()方法,不用创建实现类

TreeSet集合保证元素是看ComparaTo()方法或者Compare()方法返回值是否为0;

TreeSet集合底层依赖于TreeMap集合的方法,存储方式为红黑树结构

4.Collections工具类

Collections和Collection的区别:

Collection:顶层次单列集合的根接口,它是一个集合,也是一个接口

Collections:是针对集合操作的工具类,里面包含了一些功能,随机置换,集合里面的二分

查找,将集合的元素进行反转

Collections集合的常用方法:

public static int binarySearch(List list,T key)   二分查找

public static  T max(Collection coll): 获取集合中的最大值

public static void reverse(List> list) :将集合中的元素顺序反转

public static void shuffle(List> list) :将集合中的元素打乱

public static void sort(List<> list) :将集合中的元素进行排序

java 集合数据类型_Java基础知识(数据类型和集合)相关推荐

  1. java e次方_java基础知识

    一.java的简介 1.后台开发语言.跨平台,安全性高.面向对象 二.java基础 1.类是java中最小编写代码的单元 2.语句要分号结束 3.括号成对出现 4.运行原理--从上往下 三.注释:代码 ...

  2. java class 字符串_java基础知识四 math类 字符 字符串 控制台输入输出 StringBuilder与StringBuffer...

    第四章:数学函数.字符和字符串 math类 Math是final类:在java.lang.Math中,所有数学函数都是静态方法 在一个java程序中,java.lang包中的所有类是隐式导入的. 三角 ...

  3. java 计算反码_java基础知识-原码、反码、补码、运算符

    一.原码.反码.补码 原码 一个数转化成二进制. 用最高位来表示正负,最高位为0表示正数,最高位为1表示负数. 例如: short i=5: 因为在java里short占2个字节转化成二进制就是 00 ...

  4. java.util 常见_Java基础知识-java.util.concurrent包下常见类的使用

    一,Condition 一个场景,两个线程数数,同时启动两个线程,线程A数1.2.3,然后线程B数4.5.6,最后线程A数7.8.9,程序结束,这涉及到线程之间的通信. public classCon ...

  5. java.io.file()_JAVA基础知识之IO-File类

    File类介绍 File是java.io包下面的一个类,代表与平台无关的文件或者目录.JAVA中,无论文件还是目录,都可以看作File类的一个对象.File类能对文件或目录新建,删除,获取属性等操作, ...

  6. java表达式语句_Java基础知识笔记第三章:运算符表达式语句

    算术运算符与表达式 操作符描述例子 + 加法 - 相加运算符两侧的值 A + B 等于 30 - 减法 - 左操作数减去右操作数 A – B 等于 -10 * 乘法 - 相乘操作符两侧的值 A * B ...

  7. java 查看类_JAVA基础知识之JVM-——通过反射查看类信息

    Class实例 当类被加载之后,JVM中就会生成一个Class实例,通过这个实例就可以访问JVM中的这个类.有三种方式可以获取Class对象 使用Class的静态方法forName(完整包名) 调用类 ...

  8. java io 对象_JAVA基础知识之IO——对象序列化

    对象序列化 Java对象序列化(Serialize)是指将Java对象写入IO流,反序列化(Deserilize)则是从IO流中恢复该Java对象. 对象序列化将程序运行时内存中的对象以字节码的方式保 ...

  9. java操作符重载_Java基础知识-操作符重载

    java操作符重载 String str1 = "hello"; String str2 = str1 + " world"; System.out.print ...

最新文章

  1. 我的常用在线工具网站
  2. HTML课堂笔记02-21
  3. 一言不合就删库跑路?万名贡献者和阿里巴巴开源的二三事
  4. AtCoder Beginner Contest 055题解
  5. 一个栈输入序列为1,2,3,4,5,则下列序列中不可能是栈的输出序列是?
  6. phpword 模板 多页_高中数学:各题型答题模板,吃透,灵活运用数学公式,解题更快!...
  7. linux咋socket编程,linux中socket编程
  8. CTF-杂项题-伪加密
  9. phpcmsV9 公告内容(图片不显示问题)
  10. mybatis 复习笔记03
  11. java 集合 总结 表_java 列表与集合总结
  12. 数据挖掘简答知识点总结
  13. java做的桌面应用_把一个java web应用包装成桌面应用的简单做法
  14. 北邮 离散数学 期末必考题总结(含重点英文单词)
  15. 虚幻引擎 Unreal Engine 详细笔记 根据谌嘉诚视频无遗漏总结 快速上手
  16. 数据挖掘从入门到放弃:线性回归和逻辑回归
  17. OTHER:环比与同比
  18. css tabindex
  19. Mac联网恢复系统重新安装Lion
  20. 腾讯音乐收购懒人听书:后者已实现盈利,阅文集团获10亿元现金

热门文章

  1. 为什么企业直播能够异军突起?
  2. 【大学物理·恒定电流的磁场】磁场对载流导线的作用
  3. 带你理解beta分布
  4. 【工作感悟】路自在前,冷暖自知
  5. centos7查看udp端口_CentOS7查看开放端口命令及开放端口号
  6. k8s(六):配置管理与集群安全机制
  7. 设计模式.外观模式Facade
  8. 西门子PLC 工具下载-博途等
  9. moment.js时间操作后24小时制变成了12小时制
  10. yo搭建nodejs项目脚手架