一、数据类型

包装类型

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

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

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

// 遍历
for (Student s : ts) {
System.out.println(s.getName() + "---" + s.getAge());
}
}
}

/*学生类*/
package cn.itcast_05;

/*
* 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口
*/
public class Student implements Comparable<Student> {
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<Student> ts = new TreeSet<Student>(); //自然排序
// public TreeSet(Comparator comparator) //比较器排序
// TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());

// 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象
// 而匿名内部类就可以实现这个东西
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@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<E> comparator)构造方法创建对象,并且重写了Compare()方法
       比较器排序的两种方式:
                     1).创建实现类继承Comparator接口,并且重写Compare()方法

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

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

TreeSet集合底层依赖于TreeMap集合的方法,存储方式为红黑树结构
4.Collections工具类

Collections和Collection的区别:
         Collection:顶层次单列集合的根接口,它是一个集合,也是一个接口
         Collections:是针对集合操作的工具类,里面包含了一些功能,随机置换,集合里面的二分
         查找,将集合的元素进行反转
        
 Collections集合的常用方法:
         public static <T> int binarySearch(List<T> 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基础知识(数据类型和集合)的更多相关文章

  1. Java基础-引用数据类型之集合(Collection)

    Java基础-引用数据类型之集合(Collection) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便 ...

  2. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

  3. Java 基础 引用数据类型 ArrayList集合

    引用数据类型(类) 分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner类, ...

  4. java基础知识-数据类型及转换

    1.java中的常量大体分为两种: <1>字面量常量 <2>自定义常量 2.java中常量(字面量)的分类:<1>,整数常量:直接出现的整数<2>,小数 ...

  5. Java基础知识强化之集合框架笔记39:Set集合之HashSet存储字符串并遍历

    1. HashSet类的概述: (1)不保证set的迭代顺序 (2)特别是它不保证该顺序恒久不变 HashSet底层数据结构是哈希表,哈希表依赖于哈希值存储,通过哈希值来确定元素的位置,  而保证元素 ...

  6. Java基础知识强化之集合框架笔记27:ArrayList集合练习之去除ArrayList集合中的重复字符串元素

    1. 去除ArrayList集合中的重复字符串元素(字符串内容相同) 分析: (1)创建集合对象 (2)添加多个字符串元素(包含重复的) (3)创建新的集合 (4)遍历旧集合,获取得到每一个元素 (5 ...

  7. Java基础知识强化之集合框架笔记07:Collection集合的遍历之迭代器遍历

    1. Collection的迭代器: Iterator iterator():迭代器,集合的专用遍历方式 2. 代码示例: package cn.itcast_03; import java.util ...

  8. Java基础知识强化之集合框架笔记05:Collection集合的遍历

    1.Collection集合的遍历 Collection集合直接是不能遍历的,所以我们要间接方式才能遍历,我们知道数组Array方便实现变量,我们可以这样: 使用Object[]  toArray() ...

  9. Java基础知识强化之集合框架笔记04:Collection集合的基本功能测试

    1. Collection集合的基本功能测试: package cn.itcast_01; import java.util.ArrayList; import java.util.Collectio ...

随机推荐

  1. session_unset和session_distory

    关于session_unset()和session_destroy()的函数使用进行介绍. session_unset() 释放当前在内存中已经创建的所有$_SESSION变量, 但不删除sessio ...

  2. for双重循环中的结构分离(语法结构问题)

    //增加搜索列表 function addSearchList(){ $.get("/mall/h5_get_search_list.html","",func ...

  3. 广义欧拉降幂(欧拉定理)——bzoj3884,fzu1759

    广义欧拉降幂对于狭义欧拉降幂任然适用 https://blog.csdn.net/qq_37632935/article/details/81264965?tdsourcetag=s_pctim_ai ...

  4. iOS UIWebView获取403/404

    问题描述 与WindowsPhone不同,iOS UIWebView并不认为403/404这种情况下页面访问是失败的,这也情有可原,但有时候,我们需要对WebView所遇到的403/404进行处理. ...

  5. VS2010-MFC(对话框:属性页对话框及相关类的介绍)

    转自:http://www.jizhuomi.com/software/164.html 一 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过 ...

  6. (转) Mac下面的SecureCRT(附破解方案) 更新到最新的7.3.7

    Mac下面的SecureCRT(附破解方案) 更新到最新的7.3.7 转自 http://blog.csdn.net/skykingf/article/details/17450561 http:// ...

  7. FastJson使用方法

    FastJson是阿里的一款开源框架,用来快速实现Java的序列化和反序列化. 官方地址:https://github.com/alibaba/fastjson 使用方法演示: 下载jar包,使用ID ...

  8. JAVA基础_泛型

    什么是泛型 泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉"类型"信息,是程序的运行效率不受影响 ...

  9. css实现文字内容超出显示省略号

    white-space: nowrap; /* 内容超出容器宽度时强制不换行 */ overflow: hidden; /* 内容超出容器时隐藏超出部分 */ text-overflow: ellip ...

  10. Ubuntu环境下Error: Invalid or corrupt jarfile xxx.jar

    一.问题描述 Ubuntu环境下将Maven项目打包成jar包后,运行一下指令: $ java -jar my.jar 发生错误: Error: Invalid or corrupt jarfile ...