首页 > 学院 > 开发设计 > 正文

第七周总结

2019-11-08 01:43:44
字体:
来源:转载
供稿:网友

集合框架:★★★★★,用于存储数据的容器。 特点: 1:对象封装数据,对象多了也需要存储。集合用于存储对象。 2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合。因为集合是可 变长度的。

集合和数组的区别: 1:数组是固定长度的;集合可变长度的。 2:数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据 类型。 3:数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。 数据结构:就是容器中存储数据的方式。 对于集合容器,有很多种。因为每一个容器的自身特点不同,其实原理在于每个容器的 内部数据结构不同。 集合容器在不断向上抽取过程中。出现了集合体系。 在使用一个体系时,原则:参阅顶层内容。建立底层对象。 Collection : 单列集合的根接口,Collection 表示一组对象,这些对象也称为 collection 的元素。 List: 实现List接口的类会实现List中的所有方法。 特点: 有序的,元素可以重复。 ArrayList: 原理: 内部维护了一个Object类型的数组,默认数组大小为10. 特点: 查找比较快,增加和删除比较慢。

LinkedList:原理:采用链接列表的形式来存储数据的。 特点:查找比较慢,增加元素比较快 。

Set:: 实现Set接口的类会实现Set中所有方法。 特点: 无序的,元素是不可重复的。

LinkedList的特有方法: 1.常用的方法: addFirst(E e) addLast(E e)

descendingIterator() element() // 获取第一个元素但是不删除 E getFirst() //获取第一个元素 getLast() // 获取最后一个元素 removeFirst() 移除并返回此列表的第一个元素。

boolean removeFirstOccurrence(Object o) 从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)。 E removeLast() 移除并返回此列表的最后一个元素。 boolean removeLastOccurrence(Object o)

2.数据结构的方法: 1.栈数据结构 先进后出 push(E e) : 可以用来描述栈结构数据的存储方式。 pop() 2.队列的数据结构 先进先出 boolean offer(E e) : 可以用来描述队列结构数据的存储方式 poll()

迭代器: descendingIterator() : 逆序打印集合中的元素 1.创建迭代器: Iterator i = linkedList.descendingIterator(); while(i.hasNext()){ System.out.PRintln(i.next()); } Vector : 线程安全的ArrayList 共同点: 原理和ArrayList是一样的。 不同点: ArrayList是线程不安全的,效率高 // jdk1.2的时候才有。 Vector 线程安全的, 效率比较低。 —>一般不会在使用了。 jdk1.0就出现了

Set: 实现接口的类会实现Set中的所有方法。 特点: 无序的,元素不可重复。 HashSet: 通过哈希值来存取数据,存取过程比较快,底层是以哈希表来存值的。 线程是不安全的。

Set集合的特有方法: 方法和Collection中一样的。

HashSet存值的原理: 会通过存放的对象调用hashCode方法,获取到一个值,通过移位运算获取到对应的地址值,存放到哈希表中。

情况1: 如果存放的位置不存在其他对象,直接将对象存放到该位置。 情况2: 如果存放的位置有了其他的对象,他会再次调用这个对象的equals方法做比较,如果返回的值是false,将这个对象直接存放到该位置,如果是true就不再存放。

无序: 指添加元素的顺序和元素在集合中存放的顺序不一定相等。

TreeSet:也是实现Set接口。 实现原理: 采用红黑树(二叉树)结构来存储数据。 特点: 如果存入的对象有自然排序的特点,那么集合中的元素会根据自然排序的规律来对象集合中的元素进行排序。

TreeSet是通过 Comparator 来做比较的 调用对象的Comparator来比较的。

Comparator接口可以比较的对象类型。 ①、Comparator位于包java.util下,而Comparable位于包java.lang下。 ②、Comparable接口将比较代码嵌入需要进行比较的类的自身代码中,而Comparator接口在一个独立的类中实现比较。 ③、如果前期类的设计没有考虑到类的Compare问题而没有实现Comparable接口,后期可以通过Comparator接口来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。 ④、Comparable接口强制进行自然排序,而Comparator接口不强制进行自然排序,可以指定排序顺序。

TreeSet是可以对字符串进行排序 的, 因为字符串已经实现了Comparable接口。

字符串的比较规则: 情况一: 对应位置有不同的字符出现, 就比较的就是对应位置不同的字符。 情况 二:对应位置上 的字符都一样,比较的就是字符串的长度。

TreeSet集合的使用注意点: 1.如果存入的对象有自然排序的特点,那么集合中的元素会根据自然排序的规律来对象集合中的元素进行排序。 2.如果没有自然排序的特点就直接报错。 3.如果元素没有自然排序特点,需要让元素所属的类来实现Comparable 接口 ,实现compareTo的方法,然后通过这个方法来做比较。 4.如果元素没有自然排序特点,也没有实现Comparable接口,需要在创建集合的时候给他指定一个比较器,集合就会根据指定比较器进行排序。 java.util 接口 Comparator 类型参数: T - 此 Comparator 可以比较的对象类型 public interface Comparator 强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。 public interface Comparable 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。 int compareTo(T o) 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。 参数: o - 要比较的对象。 返回: 负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。

定义一个比较器的方式:就是定义一个类实现Comparator接口 提供一个compare(Object o1, Object o2)方法作比较 equals boolean equals(Object obj) 指示某个其他对象是否“等于”此 Comparator。此方法必须遵守 Object.equals(Object) 的常规协定。此外,仅当 指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时,此方法才返回 true。因此,comp1.equals(comp2) 意味着对于每个对象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。 注意,不 重写 Object.equals(Object) 方法总是 安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。 覆盖: 类 Object 中的 equals 参数: obj - 要进行比较的引用对象。 返回: 仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。 Override 表示一个方法声明打算重写超类中的另一个方法声明。

toString public String toString() 返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。 Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

返回: 该对象的字符串表示形式。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。

泛型:泛型是jdk1.5出现的新特性。泛型的定义:是和方法或者类和接口一起使用的,没办法直接定义一个泛型 。定义的泛型是写在类上的 : 泛型是在创建对象的时候被确定。 格式: <泛型的名称> 泛型的好处: 1. 将运行时出现 的问题提前至了编译时。 2. 避免了无谓强制类型转换。

泛型在集合中的好处: 获取返回的对象不需要强转。

类上定义泛型: 特点: 如果类中的方法使用的都是类上定义的泛型,那么一旦创建对象的时候指定了数据类型,方法中的泛型就都是该类型了。

注意点: 1.如果一个类上自定义了泛型,类中的方法是可以重新定义泛型 2.类上定义的泛型只能作用于非静态方法。

什么时候使用在类上定义泛型: 如果一个类中有多个方法需要使用到泛型,那么这个时候就可以考虑在类上定义泛型。 泛型的使用注意事项: 1.如果一个对象在创建时指定了泛型的类型,那么这个对象中只能存放该类型的值。 2.泛型指定的类型只能是引用数据类型 。 如果是基本数据类型,这个泛型中应该指定他的包装类型。int –> Integer 3. 左右两边的数据类型不允许不一致。 4.如果没有指定类型默认是Object类型

自定义泛型: 自定义泛型就是一个数据类型的占位符或者理解为一个数据类型的变量。

泛型方法: 修饰符 <声明自定义的泛型>返回值类型 函数名(自定义的泛型 变量名..)泛型方法

一个基本的原则是:无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛化,那么应该有限采用泛型方法。下面来看一个简单的泛型方法的定义: public class Main {

public static <T> void out(T t) { System.out.println(t);}public static void main(String[] args) { out("findingsea"); out(123); out(11.11); out(true);}

} 可以看到方法的参数彻底泛化了,这个过程涉及到编译器的类型推导和自动打包,也就说原来需要我们自己对类型进行的判断和处理,现在编译器帮我们做了。这样在定义方法的时候不必考虑以后到底需要处理哪些类型的参数,大大增加了编程的灵活性。 再看一个泛型方法和可变参数的例子: public class Main {

public static <T> void out(T... args) { for (T t : args) { System.out.println(t); }}public static void main(String[] args) { out("findingsea", 123, 11.11, true);}

} 输出和前一段代码相同,可以看到泛型可以和可变参数非常完美的结合。

泛型方法要注意的事项:

1. 泛型方法中 的自定义泛型的具体数据类型是在调用该函数的时候传入实参时确定的。

自定义泛型所用 的标识符只要符合标识符 的命名规则即可。但是我们一般都习惯使用一个大写字母表示。

泛型类: 泛型类的定义格式 class 类名<声明自定义的泛型>{ }

泛型类要注意的事项: 1. 泛型类上的自定义泛型是在使用该类创建对象的时候指定具体的数据类型的。

如果一个类已经自定义了泛型,使用该类创建对象的时候如果没有指定泛型的具体数据类型,那么默认为Object类型。

静态的函数不能使用类上自定义的泛型,如果静态函数需要使用,必须要在函数上自定义泛型。

泛型接口: 泛型接口的定义格式: interface 接口名<声明自定义的泛型>{ } public interface Generator { public T next(); } 然后定义一个生成器类来实现这个接口: public class FruitGenerator implements Generator {

private String[] fruits = new String[]{“Apple”, “Banana”, “Pear”};

@Override public String next() { Random rand = new Random(); return fruits[rand.nextInt(3)]; } } 调用: public class Main {

public static void main(String[] args) { FruitGenerator generator = new FruitGenerator(); System.out.println(generator.next()); System.out.println(generator.next()); System.out.println(generator.next()); System.out.println(generator.next()); } }

泛型接口要注意事项:

泛型接口上的自定义泛型是在实现该接口的时候指定具体数据类型的。 缺点: 类型就固定了

如果实现接口的时候没有指定接口上 的自定义泛型的具体数据类型,那么默认为Object数据类型。 3. 如果需要在创建接口实现类对象的时候才指定接口上自定义泛型,那么需要以下格式: class 类名 implements 接口

泛型上下限:泛型的范围,只要应用于方法中。

泛型的下限 ? super Integer 允许是Integer数据类型或者是Integer父类类型

?表示泛型中的通配符 泛型的上限。? extedns Number 允许是Number数据类型或者是Number子类的数据类型

Map: 双列集合的根接口 —————-| HashMap —————-| TreeMap —————-| Hashtable

双列集合:-------------| Map 如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复。----------------| HashMap 底层也是基于哈希表实现的。

HashMap的存储原理: 往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素的哈希码值,然后经过运算就可以算出该元素在哈希表中的存储位置。

情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。

情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较, 如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为重复元素,不允存储。

—————-| TreeMap TreeMap也是基于红黑树(二叉树)数据结构实现的, 特点:会对元素的键进行排序存储。

TreeMap 要注意的事项:

1. 往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。 2. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,把键的比较规则定义在CompareTo方法上。 3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须在创建TreeMap对象的时候传入比较器。 在现实生活中有些数据是以映射关系存在的,也就是成对存在的,比如:

民政局 : 键 值 老公 老婆 身份证 人 一把要锁 锁 Map接口的方法: 添加:

put(K key, V value) 给指定的键添加值 : 若果没有指定的键,就会创建一个键对应指定的值,如果键存在就是修改键所对应的值。 putAll(Map


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表